74 lines
1.8 KiB
C++
74 lines
1.8 KiB
C++
#include <opencv2/opencv.hpp>
|
|
#include <iostream>
|
|
|
|
using namespace std;
|
|
using namespace cv;
|
|
|
|
|
|
|
|
// 全局变量图像源
|
|
cv::Mat srcImage;
|
|
// 所选矩形区域
|
|
cv::Rect roiRect;
|
|
// 起始点
|
|
cv::Point startPoint;
|
|
// 终止点
|
|
cv::Point endPoint;
|
|
// 完成所选区域标志位
|
|
bool downFlag = false;
|
|
bool upFlag = false;
|
|
void MouseEvent(int event, int x, int y, int flags, void* data)
|
|
{
|
|
// 鼠标左键按下 获取起始点
|
|
if (event == EVENT_LBUTTONDOWN)
|
|
{
|
|
downFlag = true;
|
|
startPoint.x = x;
|
|
startPoint.y = y;
|
|
}
|
|
// 鼠标拖到松开 获取终止点
|
|
if (event == EVENT_LBUTTONUP)
|
|
{
|
|
upFlag = true;
|
|
endPoint.x = x;
|
|
endPoint.y = y;
|
|
}
|
|
// 显示鼠标选择的图像区域
|
|
if (downFlag == true && upFlag == false)
|
|
{
|
|
Point tempPoint;
|
|
tempPoint.x = x;
|
|
tempPoint.y = y;
|
|
// 用于显示图像生成
|
|
cv::Mat tempImage = srcImage.clone();
|
|
cv::rectangle(tempImage, startPoint, tempPoint,
|
|
Scalar(255, 0, 0), 2, 3, 0);
|
|
cv::imshow("ROIing", tempImage);
|
|
} // 选择区域生成
|
|
if (downFlag == true && upFlag == true)
|
|
{
|
|
// 获取选择区域的ROI
|
|
roiRect.width = abs(startPoint.x - endPoint.x);
|
|
roiRect.height = abs(startPoint.y - endPoint.y);
|
|
roiRect.x = min(startPoint.x, endPoint.x);
|
|
roiRect.y = min(startPoint.y, endPoint.y);
|
|
cv::Mat roiMat(srcImage, roiRect);
|
|
imshow("ROI", roiMat);
|
|
downFlag = false;
|
|
upFlag = false;
|
|
}
|
|
cv::waitKey(0);
|
|
}
|
|
int main(int argc, char** argv)
|
|
{
|
|
// 读取图像及判断是否正确读入
|
|
srcImage = cv::imread("./vedio/test.jpg");
|
|
if (srcImage.empty())
|
|
return -1;
|
|
// 回调事件响应
|
|
cv::namedWindow("ROIing");
|
|
cv::imshow("ROIing", srcImage);
|
|
cv::setMouseCallback("ROIing", MouseEvent, 0);
|
|
cv::waitKey(0);
|
|
return 0;
|
|
} |