#include <iostream> #include "opencv2/core/core.hpp" #include "opencv2/imgproc/imgproc.hpp" #include "opencv2/highgui/highgui.hpp" using namespace std; using namespace cv; Mat src,img1;//原始图像 Mat roi ;//ROI图像 Point cursor;//初始坐标 Rect rect;//标记ROI的矩形框 bool draw; void onMouse(int event, int x, int y, int flags, void *param) { Mat img = src.clone(); switch (event) { //按下鼠标左键 case CV_EVENT_LBUTTONDOWN: //点击鼠标图像时,清除之前ROI图像的显示窗口 cvDestroyWindow("ROI"); //存放起始坐标 cursor = Point(x, y); //初始化起始矩形框 rect = Rect(x, y, 0, 0); draw = true; break; //松开鼠标左键 case CV_EVENT_LBUTTONUP: if (rect.height > 0 && rect.width > 0) { //cv::Mat img1(src.rows, src.cols, CV_8U, Scalar(0));//新建0矩阵size(cols, rows); roi = img(Rect(rect.x, rect.y, rect.width, rect.height)); Mat imgRoi(img1, Rect(rect.x, rect.y, rect.width, rect.height)); roi.copyTo(imgRoi); rectangle(img, rect, Scalar(255),1); //画矩形框 namedWindow("SignROI"); imshow("SignROI", img); //将画过矩形框的图像用原图像还原 src.copyTo(img); imshow("SrcImage", img); //显示ROI图像 namedWindow("ROI"); imshow("ROI", img1); waitKey(); } draw =false; break; //移动光标 case CV_EVENT_MOUSEMOVE: if (draw) { //用MIN得到左上点作为矩形框的起始坐标,如果不加这个,画矩形时只能向一个方向进行 rect.x = MIN(x, cursor.x); rect.y = MIN(y, cursor.y); rect.width = abs(cursor.x - x); rect.height = abs(cursor.y - y); //防止矩形区域超出图像的范围 rect &= Rect(0, 0, src.cols, src.rows); } break; } } int main() { draw = true; src = imread("112-1.jpg",IMREAD_GRAYSCALE); img1 = Mat::zeros(src.rows, src.cols, src.type()); namedWindow("SrcImage"); imshow("SrcImage", src); setMouseCallback("SrcImage", onMouse, NULL); while (1){ if (waitKey(1) == 'q') break; }//等待获取按键q执行下一步 //阈值分割 二值化图像 Mat BW_image; cv::threshold(img1, BW_image, 150, 255, CV_THRESH_BINARY); namedWindow("BW_image", CV_WINDOW_NORMAL); imshow("BW_image", BW_image); waitKey(); return 0; }