题目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);
}
效果图: