一個基於opencv的顯示一個rgb圖像各點灰度值及對應的灰度圖象灰度值的程序

運行時使用鼠標左鍵點圖像上任意點,即可顯示該點rgb圖像各通道的值及該圖像對應的灰度圖象的灰度值


//PixelValueMonitor.h
#include "cv.h"
#include "highgui.h"

class PixelValueMonitor{
      public:
             PixelValueMonitor(IplImage* img);
			 ~PixelValueMonitor();
			 static void mouse_callback(int trigerEvent,int x,int y,int flags,void* param);
			 void run();
	         IplImage* m_img;
			 IplImage* m_grayImage;
			 char* m_windowName;
			 bool m_destroyWindow;
};

//PixelValueMonitor.cpp
#include "PixelValueMonitor.h"

PixelValueMonitor::PixelValueMonitor(IplImage *img){
	m_img=cvCreateImage(cvSize(img->width,img->height),img->depth,img->nChannels);
	cvCopy(img,m_img);
	m_grayImage=cvCreateImage(cvSize(img->width,img->height),IPL_DEPTH_8U,1);
    cvCvtColor(m_img,m_grayImage,CV_RGB2GRAY);
	m_windowName="window for pixel monitoring";
	m_destroyWindow=false;
}

PixelValueMonitor::~PixelValueMonitor(){
    cvReleaseImage(&m_img);
	cvReleaseImage(&m_grayImage);
}

void PixelValueMonitor::mouse_callback(int trigerEvent, int x, int y, int flags, void *param){
     PixelValueMonitor* instance=(PixelValueMonitor*)param;
	 if(trigerEvent==CV_EVENT_LBUTTONDOWN){
		unsigned char* ptrRGB=(unsigned char*)(instance->m_img->imageData+y*instance->m_img->widthStep);
		unsigned char* ptrGray=(unsigned char*)(instance->m_grayImage->imageData+y*instance->m_grayImage->widthStep);
		//printf("x:\t%d\ny:\t%d\n",x,y);
		printf("R:\t%d\n",*(ptrRGB+3*x+2));
		printf("G:\t%d\n",*(ptrRGB+3*x+1));
		printf("B:\t%d\n",*(ptrRGB+3*x));
		printf("GRAY:\t%d\n",*(ptrGray+x));
	 }
	 else if(trigerEvent==CV_EVENT_RBUTTONDOWN){
		instance->m_destroyWindow=true;
	 }
} 

void PixelValueMonitor::run(){
	 cvNamedWindow(m_windowName);
	 cvSetMouseCallback(m_windowName,mouse_callback,(void*)this);
	 cvShowImage(m_windowName,m_img);
	 while(1){
	       if(cvWaitKey(2)==27 || m_destroyWindow)
			   break;
	 }
	 cvDestroyWindow(m_windowName);
}

//main.cpp
#include "PixelValueMonitor.h"
#include "cv.h"
#include "highgui.h"

int main(int argc,char** argv){
    IplImage* img=cvLoadImage("data/videoImage.jpg",1);
	/*IplImage* img=cvCreateImage(cvSize(800,600),IPL_DEPTH_8U,3);
	cvSet(img,cvScalar(255,255,255));*/
    PixelValueMonitor monitor(img);
	monitor.run();
	return 0;
}






發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章