【opencv课后练习】-- 第四章节2-3

题目2:创建一个程序,使其读入并显示一幅图像。当用户鼠标点击图像时,获取图像对应像素的颜色值(RGB),并在图像上点击鼠标处用文本将颜色值显示出来。

a.对于练习1b,在三幅图像中任何地方点击鼠标,将当前图像的坐标显示于点击鼠标处。

/*
	创建一个程序,使其读入并显示一幅图像。当用户鼠标点击图像时,获取图像对应像素的颜色值(RGB),并在图像上点击鼠标处
用文本将颜色值显示出来。
	a.对于练习1b,在三幅图像中任何地方点击鼠标,将当前图像的坐标显示于点击鼠标处。
*/
#include <opencv2/core/core.hpp>                  
#include <opencv2/highgui/highgui.hpp>                  
#include <opencv2/imgproc/imgproc.hpp>   
#include <iostream>                
using namespace std;  
using namespace cv;
IplImage* src;
void on_mouse(int event,int x,int y, int flags, void* ustc)
{
	if(event == CV_EVENT_LBUTTONDOWN)
	{
		CvScalar s;
		s=cvGet2D(src,x,y);
		cout<<"b:"<<s.val[0]<<" ";
		cout<<"g:"<<s.val[1]<<" ";
		cout<<"r:"<<s.val[2]<<endl;
	}
}
void main()
{
	 src = cvLoadImage("pic.jpg");
	cvSetMouseCallback( "显示", on_mouse, 0 ); 
	cvShowImage("src",src);
	cvSetMouseCallback("src", on_mouse,0);
	cvWaitKey(0);
}

效果图:


题目三:创建一个程序读入并显示一幅图像。
a.允许用户在图像中选择一个矩形区域,然后通过按住鼠标按键画一个矩形。当鼠标键放开,高亮显示矩形框。
注意,在内存中保留一个原始图像的副本,图像恢复为原始图像并重新开始绘矩形。
b.在另一个独立的窗口中,实用画图函数画一个图表,分别用蓝、绿和红色表其实选中区域中每种颜色的像素
数量。这是选定区域的颜色直方图。x坐标系表示像素值范围在0-31,,32-63,...,223-255;y坐标表示在选定区

域中对应像素的数量。对每一个颜色通道(BGR)都进行统计。

/*
	创建一个程序读入并显示一幅图像。
	a.允许用户在图像中选择一个矩形区域,然后通过按住鼠标按键画一个矩形。当鼠标键放开,高亮显示矩形框。
注意,在内存中保留一个原始图像的副本,图像恢复为原始图像并重新开始绘矩形。
	b.在另一个独立的窗口中,实用画图函数画一个图表,分别用蓝、绿和红色表其实选中区域中每种颜色的像素
数量。这是选定区域的颜色直方图。x坐标系表示像素值范围在0-31,,32-63,...,223-255;y坐标表示在选定区
域中对应像素的数量。对每一个颜色通道(BGR)都进行统计。
*/
#include <opencv2/core/core.hpp>                  
#include <opencv2/highgui/highgui.hpp>                  
#include <opencv2/imgproc/imgproc.hpp>   
#include <iostream>                
using namespace std;  
using namespace cv;
IplImage* src;
IplImage* original;
int qq = 0;
bool f_draw = false;
//绘制矩形
CvRect rect;
void draw_rect(IplImage* img, CvRect rect)
{
    cvRectangle( img, 
        cvPoint( rect.x, rect.y ),
        cvPoint( rect.x + rect.width, rect.y + rect.height),
        cvScalar( 0, 255, 0 ));
		
}
void on_mouse(int event,int x,int y, int flags, void* ustc)
{
	switch(event)
	{
		case CV_EVENT_MOUSEMOVE:
			{
				//上一个事件为鼠标左键点击
				if(f_draw)
				 {
					 rect.width = x - rect.x;
					 rect.height = y - rect.y;
				 }
			}
			break;
		case CV_EVENT_LBUTTONDOWN:
			 {
				 f_draw = true;
				 rect = cvRect( x, y, 0, 0 );
				 cvScalar(0,255,0);
				 cvShowImage("src",src);
			 }
			 break;
		case CV_EVENT_LBUTTONUP:
			{
				f_draw = false;
				if(rect.width < 0)
				{
					rect.x += rect.width;
					rect.width *= -1;
				}
				if(rect.height < 0)
				{
					rect.y += rect.height;
					rect.height *= -1;
				}
				// draw
				draw_rect(src, rect);
				cvShowImage("src",src);
			}
			break;
			//右键还原图像
		case CV_EVENT_RBUTTONUP:
			{
				src = cvCloneImage(original);
				cvShowImage("src",src);
			}
			break;
	}
}
int main ()
{
	src = cvLoadImage("pic.jpg");
    original = cvCloneImage(src);
	cvShowImage("src",src);
	cvSetMouseCallback("src", on_mouse,0);
	cvWaitKey(0);
}

效果图:


猜你喜欢

转载自blog.csdn.net/dynamci/article/details/80734711