Opencv2.4.9鼠标操作

本文介绍如何使用OpenCV库实现图像上的矩形绘制功能,并通过鼠标操作实时调整所绘矩形的位置与大小。文章详细解释了矩形类的定义及其实现,包括矩形属性、函数如面积计算、矩形包含判断等。同时展示了如何创建图像窗口,并设置鼠标回调函数以捕捉鼠标事件,进而更新矩形的位置和尺寸。

class Rect

成员变量有 x   y      width      heigh 

x y  表示左上角的坐标     width heigh 矩形的宽和高

成员函数Size Size() 

面积 area()

contain(Point)  判断Point 是否在矩形内

inside(Rect)     判断矩形是否在矩形内

ti()                           返回左上角坐标

br()                    返回右上角坐标

Rect rect = rect1 & rect2      返回两矩阵的交集 

Rect rect = rect1 | rect2返回两矩阵的并集


Mat srcImage(600,800,CV_8UC3)

一般的图像文件格式使用的是 Unsigned char 8bits吧,

CvMat矩阵对应的参数类型就是
CV_8UC1,CV_8UC2,CV_8UC3。
(最后的1、2、3表示通道数,譬如RGB3通道就用CV_8UC3)


而float 是32位的,对应CvMat数据结构参数就是:CV_32FC1,CV_32FC2,CV_32FC3...
double是64bits,对应CvMat数据结构参数:CV_64FC1,CV_64FC2,CV_64FC3等。


变换这种矩阵单位类型,Mat里有一个函数convertTo可以办到:
C++:void Mat::convertTo(OutputArray m, int rtype, double alpha=1, double beta=0 )
mask.convertTo(OutputArray m, CV_8UC3, -1.0, 255.0); // inverse the mask matrix  means I_new(x,j) = -1*I(x,j) + 255

RNG 表示产生随机数


转载:毛星云  opencv3 编程入门3.3鼠标操作

#include <opencv2/opencv.hpp>
using namespace cv;

#define WINDOW_NAME "[程序窗口]"
#define PIC "D:\\111.jpg"

void on_MouseHandle(int event,int x,int y,int flags,void* param);
void DrawRectangle(cv::Mat& img,cv::Rect box);
void ShowHelpText();

Rect g_rectangle;
bool g_bDrawingBox = false;
RNG g_rng(12345);
int main(int argc, char** argv)
{
	g_rectangle = Rect(-1,-1,0,0);
	Mat srcImage(600,800,CV_8UC3),tempImage;
	srcImage.copyTo(tempImage);
	srcImage = Scalar::all(0);
	namedWindow(WINDOW_NAME);
	setMouseCallback(WINDOW_NAME,on_MouseHandle,(void*)&srcImage);
	while(true)
	{
		srcImage.copyTo(tempImage);
		if(g_bDrawingBox)
			DrawRectangle(tempImage,g_rectangle);
		//当进行绘制的标识符为真,则进行绘制
		imshow(WINDOW_NAME,tempImage);
		if(waitKey(10)==27)
			break;
	}
	return 0;
	}
void on_MouseHandle(int event,int x,int y,int flags,void* param)
{
	Mat& image = *(cv::Mat*)param;
	switch(event)
	{
	case EVENT_MOUSEMOVE:
		{
			if(g_bDrawingBox)
			{
			g_rectangle.width = x- g_rectangle.x;
			g_rectangle.height = y - g_rectangle.y;
			}
				}break;
	case EVENT_LBUTTONDOWN:
		{
			g_bDrawingBox = true;
			g_rectangle = Rect(x,y,0,0);
			}
		break;
	case EVENT_LBUTTONUP:
		{
			g_bDrawingBox = false;
			if(g_rectangle.width < 0)
			{
				g_rectangle.x += g_rectangle.width;
				g_rectangle.width *= -1;
			}
			if(g_rectangle.height < 0)
			{
				g_rectangle.y +=g_rectangle.height;
				g_rectangle.height*= -1;
			}
			DrawRectangle(image,g_rectangle);
		}
		break;
	}
}

void DrawRectangle(cv::Mat& img,cv::Rect box)
{
	rectangle(img,box.tl(),box.br(),Scalar(g_rng.uniform(0,255),g_rng.uniform(0,255),g_rng.uniform(0,255)));
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值