[OpenCV]控制台窗口绘制ROI(开源版)
1.把以前项目中的一个绘制ROI区域的功能开源出来
2.主要思路就是不断地imshow一张图片,在鼠标回调中更改图像
3.给出一部分实例(可直接运行),功能不太完善,感兴趣的童鞋自己往下写写。(PS:以前写的太多太乱了,好多功能整理不出来了)
下面给出hpp文件
//开源版本,v0.1
#include<opencv2/opencv.hpp>
#include<thread>
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");
绘制中
绘制后