读取单通道图像中的像素,显示具体位置和灰度值

#include "iostream"
#include "cv.h"
#include "highgui.h"
#include "math.h"

using namespace std;
//鼠标信息的窗口回调函数,也就是在哪个窗口上发生鼠标时间就会调用这个函数
/*
	鼠标回调函数的参数分别为:
	1, 事件,诸如左单击,右单击,拖动之类
	2,x, y表示鼠标点击的位置;x表示鼠标点击位置距离原点的水平距离,y表示垂直距离
	flags表示附加时间
	param表示用户传入鼠标回调函数的参数
*/

void mouseHandler(int event, int x, int y, int flags, void* param)
{
	IplImage *img0, *img1;
	img0 = (IplImage*)param;
	img1 = cvCreateImage(cvSize(img0->width, img0->height), img0->depth, img0->nChannels);
	//拷贝函数
	cvCopy(img0, img1, NULL);

	//该字体变量是为了传入cvPutText函数
	CvFont font;
	uchar* ptr;//像素的数据类型为uchar
	char label[20];
	char label2[20];
	//cvInitFont(CvFont*font, int font_face,double hscale,double vscale,double shear=0,int thickness=1,int line_type=8)
	cvInitFont(&font, CV_FONT_HERSHEY_PLAIN|CV_FONT_ITALIC, 1, 1);    //初始化字体

	//时间获取像素的位置,处理鼠标左单击事件
	cout << x << " " << y << endl;
	if (event == CV_EVENT_LBUTTONDOWN)
	{
		//读取像素,二维图像上获取uchar*指针
		ptr = cvPtr2D(img0, y, x, NULL);
		//单通道ptr[0]表示灰度级别,这种方式很好的把字符串和数字放在一个字符串里
		sprintf(label, "Grey Level:%d", ptr[0]);
		//像素位置(x,y)
		sprintf(label2, "Pixel: (%d, %d)", x, y);
		
		//调整显示位置
		if (img0->width - x <= 180 || img0->height - y <= 20)
		{
			cvRectangle(img1, cvPoint(x - 180, y - 40), cvPoint(x - 10, y - 10), CV_RGB(255, 0, 0), CV_FILLED, 8, 0);
			cvPutText(img1, label, cvPoint(x - 180, y - 30), &font, CV_RGB(255, 255, 255));
			cvPutText(img1, label2, cvPoint(x - 180, y - 10), &font, CV_RGB(255, 255, 255));
		}
		else
		{
			cvRectangle(img1, cvPoint(x + 10, y - 12), cvPoint(x + 180, y + 20), CV_RGB(255, 0, 0), CV_FILLED, 8, 0);
			cvPutText(img1, label, cvPoint(x + 10, y), &font, CV_RGB(255, 255, 255));
			cvPutText(img1, label2, cvPoint(x + 10, y + 20), &font, CV_RGB(255, 255, 255));
		}
		//以鼠标为中心画点
		CvPoint centerPoint;
		centerPoint.x = x;
		centerPoint.y = y;
		cvCircle(img1, centerPoint, 3, CV_RGB(0, 0, 0), 1, 8, 3);

		cvShowImage("img", img1);
	}


	
}
int main()
{
	int exit = 0;
	int c;
	IplImage* img;
	img = cvLoadImage("cat.jpg", 1);
	//img = cvLoadImage("hotel201.pgm", 1);
	assert(img);

	if (img->nChannels != 1) //判断是否为灰度图像,若不是,先转换为灰度图像
	{
		//转换为灰度图像
		IplImage* gray = cvCreateImage(cvGetSize(img), img->depth, 1);
		cvCvtColor(img, gray, CV_BGR2GRAY);
		img = cvCreateImage(cvGetSize(img),img->depth,1);
		cvCopy(gray,img);
	}
	
	//定义窗口

	cout << img->width << " " << img->height << endl;
	cvNamedWindow("img", 1);
	//三个参数按照次序分别为,窗口名称,鼠标信息的窗口处理函数,最后的参数用户定义传入鼠标指定消息处理函数的参数。
	cvSetMouseCallback("img", mouseHandler, (void*)img);
	cvShowImage("img", img);
	//检测键盘输入,按Q键退出程序
	while (!exit)
	{
		c = cvWaitKey(0);
		switch (c)
		{
		case 'q':
			exit = 1;
			break;
		default:
			continue;
		}
	}
	cvDestroyAllWindows();
	cvReleaseImage(&img);
	return 0;
}

同时参考了http://blog.csdn.net/jiakeyouwe/article/details/52075922  代码来源

http://blog.csdn.net/morewindows/article/details/8426283  处理鼠标事件的回调信息

这个弄明白以后,应该就差不多了



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值