OpenCV笔记(四)

#include<opencv2/opencv.hpp>
#include<opencv2/highgui/highgui.hpp>
#include<iostream>
using namespace cv;
#define WINDOW "Image"


int g_pVal;//滚动条当前值
int g_max;//滚动条最大值
Mat redImage;
Mat tmpImage;
Rect g_rectangle;//保存鼠标选中的矩形框
bool g_draw;


void callFunc(int a, void* param){
	Mat Img=*(Mat*)param;
	int cols=Img.cols;//图片列数
	int rows=Img.rows;//图片行数
	int x0=g_rectangle.x;//选中区域的左上角坐标
	int y0=g_rectangle.y;
	int x1=x0+g_rectangle.width;//选中区域的右下角坐标
	int y1=y0+g_rectangle.height;

	for(int i=x0;i<=x1;i++){//在选中区域中处理图片
		for(int j=y0;j<=y1;j++){
			if(Img.at<Vec3b>(j,i)[2]-30>Img.at<Vec3b>(j,i)[0]&&Img.at<Vec3b>(j,i)[2]-30>Img.at<Vec3b>(j,i)[1]){
				Img.at<Vec3b>(j,i)[2]=g_pVal;
			}
		}
	}
	imshow(WINDOW,Img);
}


void mouseCall(int even,int x,int y,int flags,void* param){//鼠标操作的回调函数
	Mat& image=*(Mat*)param;
	switch(even){
		case EVENT_MOUSEMOVE://鼠标移动
			{
				if(g_draw){
					g_rectangle.width=x-g_rectangle.x;
					g_rectangle.height=y-g_rectangle.y;
				}
			}
			break;
		case EVENT_LBUTTONDOWN://左键
			{
				g_draw=true;
				g_rectangle=Rect(x,y,0,0);//起点横坐标、纵坐标、宽、高
			}
			break;
		case EVENT_LBUTTONUP://右键
			{
				g_draw=false;
				if(g_rectangle.width<0){
					g_rectangle.x+=g_rectangle.width;
					g_rectangle.width=-g_rectangle.width;
				}
				if(g_rectangle.height<0){
					g_rectangle.y+=g_rectangle.height;
					g_rectangle.height=-g_rectangle.height;
				}
				callFunc(0,&image);
			}
			break;
	}
}

int main(){
	
	redImage=imread("redflo.bmp",1);
	redImage.copyTo(tmpImage);
	namedWindow(WINDOW,CV_WINDOW_AUTOSIZE);
	g_pVal=0;
	g_max=200;
	g_rectangle=Rect(0,0,0,0);
	g_draw=false;

	imshow(WINDOW,tmpImage);
	setMouseCallback(WINDOW,mouseCall,(void*)&tmpImage);//设置鼠标操作
	waitKey(0);
	return 0;
}

OpenCV笔记(四)_第1张图片

你可能感兴趣的:(OpenCV笔记(四))