[OpenCV]控制台窗口绘制ROI(开源版)

1.把以前项目中的一个绘制ROI区域的功能开源出来

2.主要思路就是不断地imshow一张图片,在鼠标回调中更改图像

3.给出一部分实例(可直接运行),功能不太完善,感兴趣的童鞋自己往下写写。(PS:以前写的太多太乱了,好多功能整理不出来了)

下面给出hpp文件

//开源版本,v0.1
#include
#include
class CSetImgRoi
{
public:
	CSetImgRoi();
	~CSetImgRoi();

public:
	//设置背景图片
	bool SetBKImg(cv::Mat &Src);
	//设置边缘颜色
	bool SetRoiBDColor(cv::Scalar bScalar);
	//创建窗口
	bool CreateWindow(const char *name);
	//获取roi
	bool GetRoiRect(cv::Rect &rc);
	//释放线程
	bool DestoryWindow();

};
//窗口名称
const char *pWindowName = nullptr;
//窗口大小
cv::Size WindowSize(0,0);
//是否开始执行
bool Begin = false;
bool SetImg = false;
//roi区域
cv::Rect RoiRect(0, 0, 0, 0);
//
cv::Scalar BDColor(0,0,0);
//
cv::Mat SrcImage;

CSetImgRoi::CSetImgRoi()
{
	
}
CSetImgRoi::~CSetImgRoi()
{

}
void Recover(cv::Mat &bMat, cv::Rect Roi)
{
	SrcImage(Roi).copyTo(bMat(Roi));
}
//键盘回掉函数
void on_mouse(int event, int x, int y, int flag, void *param)
{
	cv::Mat srcImg = *(cv::Mat*)param;
	//按压判断
	static bool press = false;
	//第一个点
	static CvPoint prePoint = cvPoint(0, 0);
	switch (event)
	{
	case CV_EVENT_LBUTTONDOWN:
	{
		press = true;
		prePoint = cvPoint(x, y);
		break;
	}
	case CV_EVENT_LBUTTONUP:
	{
		press = false;
		cv::Rect bRoi(prePoint.x, prePoint.y, cvPoint(x, y).x - prePoint.x, cvPoint(x, y).y - prePoint.y);
		RoiRect = bRoi;
		Recover(srcImg, bRoi);
		cv::rectangle(srcImg, bRoi, BDColor);
		break;

	}
	case CV_EVENT_MOUSEMOVE:
		if (press)
		{
			cv::Rect bRoi(prePoint.x, prePoint.y, cvPoint(x, y).x - prePoint.x, cvPoint(x, y).y - prePoint.y);
			if (!SrcImage.empty())
			{
				//Recover(srcImg, bRoi);
			}
			cv::rectangle(srcImg, bRoi, BDColor,-1);
			cv::imshow(pWindowName, srcImg);
			cv::waitKey(10);
		}
		break;
	}
	cv::imshow(pWindowName, srcImg);
	cv::waitKey(30);
}
void SetRoi()
{
	while (true)
	{
		if (!Begin)break;
		cv::namedWindow(pWindowName);
		cv::Mat bNewImage;
		if (!SetImg)
		{
			bNewImage = cv::Mat(cv::Size(500, 500), CV_8UC3, cv::Scalar(255, 255, 255));
		}
		else
		{
			bNewImage = SrcImage.clone();
		}
		cv::setMouseCallback(pWindowName, on_mouse, (void*)&bNewImage);
		while (Begin)
		{
			//cv::imshow(pWindowName,bNewImage);
			char c = cv::waitKey(30);
			switch (char(c))
			{
			   default:
				   continue;
			}
		}
	}
	return;
}
bool CSetImgRoi::CreateWindow(const char *name)
{
	Begin = true;
	pWindowName = name;
	std::thread t1(SetRoi);
	t1.detach();
	return true;
}
//设置背景图片
bool CSetImgRoi::SetBKImg(cv::Mat &Src)
{
	SetImg = true;
	SrcImage = Src.clone();
	return true;
}
bool CSetImgRoi::SetRoiBDColor(cv::Scalar bScalar)
{
	BDColor = bScalar;
	return true;
}
bool CSetImgRoi::GetRoiRect(cv::Rect &rc)
{
	rc = RoiRect;
	return true;
}

bool CSetImgRoi::DestoryWindow()
{
	Begin = false;
	return true;
}

调用代码

Mat Src = imread("pink.bmp");
	CSetImgRoi set;
	set.SetBKImg(Src);
	set.SetRoiBDColor(cv::Scalar(0,255,0));
	set.CreateWindow("11111");

绘制中

[OpenCV]控制台窗口绘制ROI(开源版)_第1张图片

绘制后 

[OpenCV]控制台窗口绘制ROI(开源版)_第2张图片

你可能感兴趣的:(OpenCV)