1. 程式人生 > 其它 >C++通過opencv實現在視窗畫矩形

C++通過opencv實現在視窗畫矩形

技術標籤:opencvc++

#include<opencv2/opencv.hpp>
#include<iostream>

using namespace std;
using namespace cv;

#define WINDOW_NAME "滑鼠程式測試"
Mat tempImage;
Mat srcImage(600,800,CV_8UC3);
bool drawRectangleFlag = false;
Rect m_rectangle(-1, -1, 0, 0);
RNG rng(1234);

void DrawRectangle(Mat&image, Rect rect)
{
	rectangle(image, rect, Scalar(rng.uniform(0, 255), rng.uniform(0, 255), rng.uniform(0, 255)));
}

void on_MouseHanle(int event, int x, int y, int flags, void* param)
{
	switch(event)
	{
		case EVENT_MOUSEMOVE:
		{
			if (drawRectangleFlag)
			{
				m_rectangle.width = x-m_rectangle.x;
				m_rectangle.height = y - m_rectangle.y;
			}
		}
		break;
		case EVENT_LBUTTONDOWN:
		{
			drawRectangleFlag = true;
			m_rectangle.x = x;
			m_rectangle.y = y;
		}
		break;
		case EVENT_LBUTTONUP:
		{
			drawRectangleFlag = false;
			if (m_rectangle.width < 0)
			{
				m_rectangle.x = m_rectangle.x + m_rectangle.width;
				m_rectangle.width *= -1;
			}
			if (m_rectangle.height < 0)
			{
				m_rectangle.y = m_rectangle.y + m_rectangle.height;
				m_rectangle.height *= -1;
			}
			DrawRectangle(srcImage, m_rectangle);
		}
	}
}


int main(int argc, char **argv)
{
	srcImage = Scalar::all(0);
	namedWindow(WINDOW_NAME, CV_WINDOW_AUTOSIZE);
	setMouseCallback(WINDOW_NAME, on_MouseHanle, (void*)&srcImage);
	while (1)
	{
		srcImage.copyTo(tempImage);
		DrawRectangle(tempImage, m_rectangle);
		imshow(WINDOW_NAME, tempImage);
		if (waitKey(10) == 27)return 0;
	}
}