用opencv读取图像鼠标点的像素,更正一个Bug

作者:skyseraph

出处:http://www.cnblogs.com/skyseraph/

以下代码在网上流传很广。

不过,调试运行之后发现,功能是正确的,但是内存很快就耗尽,导致死机。经过查找,加上:

cvReleaseImage(&img1);    //释放源图像占用的内存

这一行是我(szliug)加的,否则内存很快就会耗尽,会死机的。

之后运行正常。

/*===============================================//

功能:OpenCV Utility: Reading Image Pixels Value

时间:4/4/2011 SkySeraph HQU

//===============================================*/

#include "iostream"

#include "cv.h"

#include "highgui.h"

using namespace std;

#include "math.h"

#pragma comment(lib,"highgui.lib")

#pragma comment(lib,"cv.lib")

#pragma comment(lib,"cvaux.lib")

#pragma comment(lib,"cxcore.lib")

//  源图像

const char* filename = "../picture/Flo.jpg";

//  隐藏Console窗口

#pragma comment( linker, "/subsystem:\"windows\" /entry:\"mainCRTStartup\"" )

/*=============================================*/

void mouseHandler(int event, int x, int y, int flags, void* param)

{

IplImage* img0, * img1;

img0 = (IplImage*) param;

img1 = cvCloneImage(img0);

/*-------------cvInitFont-------------------//

//功能:初始化字体结构体

//原型:void cvInitFont(

CvFont* font, //被初始化的字体结构体

int font_face,//字体名称标识符

$ CV_FONT_HERSHEY_SIMPLEX - 正常大小无衬线字体。

$ CV_FONT_HERSHEY_PLAIN - 小号无衬线字体。

$ CV_FONT_HERSHEY_DUPLEX - 正常大小无衬线字体。( 比CV_FONT_HERSHEY_SIMPLEX更复杂)

$ CV_FONT_HERSHEY_COMPLEX - 正常大小有衬线字体。

$ CV_FONT_HERSHEY_TRIPLEX - 正常大小有衬线字体 ( 比CV_FONT_HERSHEY_COMPLEX更复杂)

$ CV_FONT_HERSHEY_COMPLEX_SMALL - CV_FONT_HERSHEY_COMPLEX 的小译本。

$ CV_FONT_HERSHEY_SCRIPT_SIMPLEX - 手写风格字体。

$ CV_FONT_HERSHEY_SCRIPT_COMPLEX - 比CV_FONT_HERSHEY_SCRIPT_SIMPLEX更复杂。

//这个参数能够由一个值和可选择的CV_FONT_ITALIC字体标记合成,就是斜体字

double hscale,//字体宽度。

//如果等于1.0f,字符的宽度是最初的字体宽度。如果等于0.5f,字符的宽度是最初的字体宽度的一半

double vscale,//字体高度。

double shear=0,//字体的斜度。

//当值为0时 ,字符不倾斜;当值为1.0f时,字体倾斜≈45度,等等。厚度让字母着重显示。函数cvLine用于绘制字母

int thickness=1, //字体笔划的粗细程度

int line_type=8 //字体笔划的类型

);

//--------------------------------------------*/

CvFont font;

uchar* ptr;

char label[20];

cvInitFont(&font, CV_FONT_HERSHEY_PLAIN, .8, .8, 0, 1, 8);

if (event == CV_EVENT_LBUTTONDOWN) //单击左键

{

/* read pixel */

ptr = cvPtr2D(img1, y, x, NULL);//返回指向特殊数组元素的指针 && cvGet2D返回指向特殊数组的元素

/*display the BGR value*/

sprintf(label, "(%d, %d, %d)", ptr[0], ptr[1], ptr[2]);

cvRectangle(

img1,

cvPoint(x, y - 12),

cvPoint(x + 100, y + 4),

CV_RGB(255, 0, 0),

CV_FILLED,

8, 0

);

cvPutText(

img1,

label,

cvPoint(x, y),

&font,

CV_RGB(255, 255, 0)

);

cvShowImage("img", img1);

}

cvReleaseImage(&img1);    //释放源图像占用的内存,这一行是我(szliug)加的,否则内存很快就会耗尽,会死机的。

}

int main(int argc, char** argv)

{

IplImage* img;

/* usage: <prog_name> <image> */

//if (argc != 2)

//{

//    printf("Usage: %s <image>\n", argv[0]);

//    return 1;

//}

/* load image */

img = cvLoadImage(filename, 1);

/* always check */

assert(img);

/* create a window and install mouse handler */

cvNamedWindow("img", 1);

//  注册鼠标事件

cvSetMouseCallback("img", mouseHandler, (void*)img);

cvShowImage("img", img);

cvWaitKey(0);

/* be tidy */

cvDestroyAllWindows();

cvReleaseImage(&img);

return 0;

}

用opencv读取图像鼠标点的像素,更正一个Bug,布布扣,bubuko.com

时间: 2024-08-06 20:07:04

用opencv读取图像鼠标点的像素,更正一个Bug的相关文章

Opencv中图像的遍历与像素操作

Opencv中图像的遍历与像素操作 OpenCV中表示图像的数据结构是cv::Mat,Mat对象本质上是一个由数值组成的矩阵.矩阵的每一个元素代表一个像素,对于灰度图像,像素是由8位无符号数来表示(0代表黑,255代表白):对于彩色图像,每个像素是一个三元向量,即由三个8位无符号数来表示三个颜色通道(Opencv中顺次为蓝.绿.红). 我们先来介绍下cv::Mat类的获取像素的成员函数at(),其函数原型如下: template<typename _Tp> _Tp& at(int i0

python3随笔-opencv读取图像数据

如何安装opencv-python $pip3 install opencv-python 如何读取图像数据 import numpy as np import cv2 as cv img = cv.imread('1.png') print(img) print(img.dtype) [[[200 228 197][200 228 197][200 228 197]......[200 228 197][200 228 197][200 228 197]]] dtype('uint8') 使用

[实例]ROS使用OpenCV读取图像并发布图像消息在rviz中显示

思路: (1)使用opencv读取本地图像 (2)调用cv_bridge::CvImage().toImageMsg()将本地图像发送给rviz显示 一.使用opencv读取本地图像并发布图像消息 (1)利用catkin新建一个工程叫rosopencv,并进行初始化 mkdir -p rosopencv/src cd rosopencv/src catkin_create_pkg rosopencv sensor_msgs cv_bridge roscpp std_msgs image_tran

OpenCV读取视频和图像序列

在使用OpenCV时候,我们首先会做的是获取待处理的图像,这个图像可能来源于已存储的视频文件.也可能来源于实时的摄像头画面.或是某个文件夹下的一系列图片.或许你会觉得,这都是小菜一碟,因为我们学习OpenCV的第一步一般是学习如何加载和显示一幅图片.对于打开摄像头或是读取视频的程序,网上也是一抓一大把.如果你是初学者,不妨看一下我下面的总结,或许有你不曾注意到的. 对于图像或视频的加载.显示.窗口设置.工具条.图像合并为视频.视频分割成图像.打开视频或摄像头等操作的定义是放在OpenCV的hig

Opencv下图像对鼠标事件的响应

直接上代码: //////////////////////////////////////////////////////////////////////// // // 该程序从文件中读入一幅图像,响应在图片上的左键右键消息 // 并显示点击图像的坐标,然后显示出来. // //////////////////////////////////////////////////////////////////////// #include <stdlib.h> #include <stdi

OpenCV常用图像操作和鼠标操作

最近的工作经常需要对图像进行操作,也需要用鼠标对图像进行各种操作,于是自己整理和编写了这个类,总结了常用的基于OpenCV对图像进行的操作. 这个类我也将继续完善和丰富下去,需要的朋友可以直接使用. 如果有什么疏漏的地方还请多多指教. 首先是头文件: /* ******* ccv.h ********** ********* opencv常用操作函数声明 ********** */ /* author: autumoon */ #ifndef _CCV_H_ #define _CCV_H_ #i

OpenCV中图像的读取,显示与保存

图像的读取,显示与保存 相关函数:cv2.imread().cv2.imshow().cv2.imwrite() 1.读入图像: 用cv2.imread()函数来读取图像,cv2.imread(路径,图像颜色空间)(其中颜色空间默认为BGR彩图)     cv2.IMREAD_COLOR:读入一副彩色图像 cv2.IMREAD_GRAYSCALE:以灰度模式读入图像 cv2.IMREAD_UNCHANGED:读入一幅图像,并且包括图像的 alpha 通道 示例代码 import cv2 img

利用OpenCV检测图像中的长方形画布或纸张并提取图像内容

基于知乎上的一个答案.问题如下: 也就是在一张照片里,已知有个长方形的物体,但是经过了透视投影,已经不再是规则的长方形,那么如何提取这个图形里的内容呢?这是个很常见的场景,比如在博物馆里看到一幅很喜欢的画,用手机找了下来,可是回家一看歪歪斜斜,脑补原画内容又觉得不对,那么就需要算法辅助来从原图里提取原来的内容了.不妨把应用的场景分为以下: 纸张四角的坐标(图中红点)已知的情况 也就是上面的左图中4个红点是可以准确获取,比如手动标注,那么就简单了:用OpenCV的Perspective Trans

怎么样用opencv将彩色图片转化成像素值只有0和255的灰度图?

  分类: OpenCV [Q1]怎么样用opencv将彩色图片转化成像素值只有0和255的灰度图? 进行灰度化,IplImage* pImg = cvLoadImage( "C:\\1.bmp", 0 ); 这样图像已经灰度化,然后调用cvThreshold(image, image, 125, 255, CV_THRESH_BINARY); 就可以了,125那里是你所用的阈值,这就是最简单的二值化,你要用ostu,或者别的高级一点的,就要自己写函数了   // Truncate v