opencv感兴趣区域选取 ROI
需定义ROI区域的起点坐标和长度、宽度
int roi_x;
int roi_y;
int roi_h;
int roi_w;
void LVSD_TEST::ROIImage() { image_grab = imread("image_grab\\grab.bmp"); namedWindow("GRAB", WINDOW_AUTOSIZE); setMouseCallback("GRAB", on_drawing, (void*)(&image_grab)); imshow("GRAB", image_grab); temp = image_grab.clone(); } void on_drawing(int event, int x, int y, int flags, void* userdata) { static Point sp(-1, -1); static Point ep(-1, -1); Mat image = *((Mat*)userdata); if (event == EVENT_LBUTTONDOWN) { sp.x = x; sp.y = y; } else if (event == EVENT_LBUTTONUP) { ep.x = x; ep.y = y; int dx = ep.x - sp.x; int dy = ep.y - sp.y; if (dx >= 0 && dy > 0) { Rect box(sp.x, sp.y, dx, dy); temp.copyTo(image); Mat img_box = image(box); // imshow("ROI", img_box); imwrite("image_grab\\roi_1.bmp", img_box); rectangle(image, box, Scalar(0, 255, 0), 2, 8); imshow("GRAB", image); // imwrite("image_grab\\rectImage.bmp", image); sp.x = -1; sp.y = -1; } } else if (event == EVENT_MOUSEMOVE) { if (sp.x > 0 && sp.y > 0) { ep.x = x; ep.y = y; int dx = ep.x - sp.x; int dy = ep.y - sp.y; if (dx >= 0 && dy > 0) { Rect box(sp.x, sp.y, dx, dy); temp.copyTo(image); rectangle(image, box, Scalar(0, 255, 0), 2, 8); imshow("GRAB", image); } } } else if (event == EVENT_MOUSEWHEEL) { value = getMouseWheelDelta(flags); int currentCols = image.cols; int currentRows = image.rows; currentCols = currentCols + count; currentRows = currentRows + count; resizeWindow("GRAB", currentCols, currentRows); qDebug() << value; if (value > 0 && count < image.cols) { count += 33; qDebug() << count; } else if (value < 0 && count > -924) { count -= 33; qDebug() << count; } } }
imshow中截取ROI后在Qt.label中圈出截取框
destroyWindow("GRAB"); QPixmap pixmap("image_grab\\grab.bmp"); QPainter painter(&pixmap); painter.setPen(QPen(Qt::green, 3, Qt::SolidLine, Qt::SquareCap, Qt::MiterJoin)); painter.drawRect(roi_x, roi_y, roi_h, roi_w); ui.label_Model->setPixmap(pixmap);
对所选区域与新采集图像同样位置进行比对
返回结果
void ContrastImage() { Mat resultImage, grabImage, roiImage; grabImage = imread("image_grab\\grab.bmp"); grabImage = grabImage(Rect(roi_x, roi_y, roi_h, roi_w)); roiImage = imread("image_grab\\roi_1.bmp"); //图像减法 absdiff(grabImage, roiImage, resultImage); //信道分离 Mat _channel[4]; split(resultImage, _channel); //各信道二值化 for (int i = 0; i < resultImage.channels(); i++) { threshold(_channel[i], _channel[i], ui.spinBox_Threshold->text().toInt(), 20, THRESH_BINARY); } //信道叠加 add(_channel[0], _channel[1], _channel[3]); add(_channel[3], _channel[2], _channel[3]); threshold(_channel[3], _channel[3], 10, 255.0, THRESH_BINARY); //查找轮廓 double _TempMaxArea = 0.0; double _TempArea = 0.0; double _TempAreaPV = 0.0; int _TempCount = 0; vector<vector<Point>> contours; vector<Vec4i> hierarchy; findContours(_channel[3], contours, hierarchy, RETR_LIST, CHAIN_APPROX_NONE); //绘制轮廓 Mat imageContours = Mat::zeros(_channel[3].size(), CV_8UC1); Mat Contours = Mat::zeros(_channel[3].size(), CV_8UC1); for (int i = 0; i < contours.size(); i++) { //contours[i]代表的是第i个轮廓,contours[i].size()代表的是第i个轮廓上所有的像素点数 for (int j = 0; j < contours[i].size(); j++) { //绘制出contours向量内所有的像素点 Point P = Point(contours[i][j].x, contours[i][j].y); Contours.at<uchar>(P) = 255; if (_TempAreaPV == 0) _TempAreaPV = 3.0; if (_TempAreaPV > _TempMaxArea) _TempMaxArea = _TempAreaPV; _TempArea += _TempAreaPV; _TempCount++; if (_TempMaxArea > 4) { _Result = 1; break;//图像比对斑点大小超限 } if (_TempArea > 5) { _Result = 2; break;//图像比对总斑点面积超限 } if (_TempCount > 2) { _Result = 3; break;//图像比对斑点数量超限 } } drawContours(imageContours, contours, i, Scalar(255), 1, 8, hierarchy); } if (_Result == 0) { QMessageBox::information(this, "Result", " success "); } else if (_Result == 1 || _Result == 2 || _Result == 3) { QMessageBox::information(this, "Result", " failed "); } //imshow("Contours Image", imageContours); //轮廓 //imshow("Point of Contours", Contours); //向量contours内保存的所有轮廓点 }