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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值