OPT小讲堂 ∣ SciSmart图像定位-ROI校正算法

今天讲解的是OPT小讲堂第九课,内容是ROI生成和ROI校正两大功能。

感兴趣区域(ROI,region of interest),在机器视觉、图像处理中,在被处理的图像上以方框、圆、椭圆、不规则多边形等方式勾勒出需要处理的区域,称为感兴趣区域,简称ROI。在图像处理领域,感兴趣区域是从图像中选择的一个图像区域,这个区域是图像分析所关注的重点。圈定该区域以便进行进一步处理,或使用ROI圈定你想处理的目标,可以减少处理时间,提高精度。
在具体的视觉应用中,当工件来料位置固定不变时,常量ROI可以覆盖工件来料。但是当来料位置存在较大波动时,就无法通过固定的ROI来实现视觉应用。这时候我们可以通过粗定位对产品进行定位,根据定位位置、长宽,角度等数据使用生成ROI,通过生成ROI工具来满足视觉应用的要求;或者通过粗定位数据使用ROI校正工具对固定的ROI进行仿射变换,跟随产品位置来满足视觉应用的要求。

什么是ROI生成?

ROI生成,通过在图像上绘制一个ROI或者用前面模块的输出结果,或用户定义的指定数据生成特定ROI。可以创建的ROI类型有:点、直线、旋转矩形、椭圆、环形、不规则。
在后面的算子中调用所生成的ROI,将不进行全图搜索检测,只在ROI区域内进行搜索,这样可以屏蔽不感兴趣区域,令检测时间缩短。

一、ROI生成的应用场合
1、目标物体周边存在干扰点时,可以通过限定感兴趣区域来规避;
2、图片数据量大,感兴趣区域小,可以通过划定感兴趣区域,令检测时间缩短;

二、ROI生成算法界面
如图1中蓝色矩形框即为划定的旋转矩形ROI࿱

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
以下是一个基于Qt和OpenCV的ROI校正基准设置的例程。该例程实现了一个简单的界面,用户可以选择ROI区域并设置校正基准点,然后通过透视变换将ROI区域校正到正确的位置。 ```cpp #include <QApplication> #include <QFileDialog> #include <QMouseEvent> #include <opencv2/opencv.hpp> using namespace cv; class ROIWidget : public QWidget { public: ROIWidget(QWidget* parent = nullptr) : QWidget(parent) , isDragging(false) { setFixedSize(640, 480); setMouseTracking(true); } protected: void paintEvent(QPaintEvent* event) { QPainter painter(this); painter.drawImage(0, 0, qimage); } void mousePressEvent(QMouseEvent* event) { if (event->button() == Qt::LeftButton) { isDragging = true; startX = event->x(); startY = event->y(); } } void mouseMoveEvent(QMouseEvent* event) { if (isDragging) { endX = event->x(); endY = event->y(); if (startX < endX && startY < endY) { roi.x = startX; roi.y = startY; roi.width = endX - startX; roi.height = endY - startY; } else if (startX > endX && startY < endY) { roi.x = endX; roi.y = startY; roi.width = startX - endX; roi.height = endY - startY; } else if (startX < endX && startY > endY) { roi.x = startX; roi.y = endY; roi.width = endX - startX; roi.height = startY - endY; } else { roi.x = endX; roi.y = endY; roi.width = startX - endX; roi.height = startY - endY; } update(); } } void mouseReleaseEvent(QMouseEvent* event) { if (event->button() == Qt::LeftButton) { isDragging = false; cv::Mat src(qimage.height(), qimage.width(), CV_8UC4, qimage.bits(), qimage.bytesPerLine()); cv::Mat roiImage = src(cv::Rect(roi.x, roi.y, roi.width, roi.height)); cv::cvtColor(roiImage, roiImage, cv::COLOR_BGRA2BGR); // 显示选中的ROI区域 imshow("ROI", roiImage); } } private: QImage qimage; bool isDragging; int startX, startY, endX, endY; cv::Rect roi; }; int main(int argc, char *argv[]) { QApplication a(argc, argv); ROIWidget w; w.show(); // 选择图像文件 QString filename = QFileDialog::getOpenFileName(&w, "Open image", ".", "Images (*.png *.xpm *.jpg)"); if (filename.isEmpty()) return -1; // 读取图像文件 cv::Mat src = cv::imread(filename.toStdString()); if (src.empty()) { std::cerr << "Failed to read image file!" << std::endl; return -1; } // 显示原始图像 cv::imshow("Original", src); // 等待用户选择ROI区域 cv::waitKey(); // 计算透视变换矩阵 std::vector<cv::Point2f> srcPoints, dstPoints; srcPoints.push_back(cv::Point2f(w.width() / 2 - w.width() / 4, w.height() / 2)); srcPoints.push_back(cv::Point2f(w.width() / 2 + w.width() / 4, w.height() / 2)); srcPoints.push_back(cv::Point2f(w.width() / 2 - w.width() / 4, w.height() / 2 + w.height() / 4)); srcPoints.push_back(cv::Point2f(w.width() / 2 + w.width() / 4, w.height() / 2 + w.height() / 4)); dstPoints.push_back(cv::Point2f(0, 0)); dstPoints.push_back(cv::Point2f(src.cols, 0)); dstPoints.push_back(cv::Point2f(0, src.rows)); dstPoints.push_back(cv::Point2f(src.cols, src.rows)); cv::Mat perspectiveMatrix = cv::getPerspectiveTransform(srcPoints, dstPoints); // 校正ROI区域 cv::Mat roiImage = src(roi); cv::warpPerspective(roiImage, roiImage, perspectiveMatrix, roiImage.size()); // 显示校正后的ROI区域 cv::imshow("Warped ROI", roiImage); cv::waitKey(); return a.exec(); } ``` 在这个例程中,我们首先创建了一个继承自QWidget的自定义控件ROIWidget,然后在该控件中实现了鼠标按下、鼠标移动和鼠标释放事件的处理函数,以实现ROI区域的选择。同时,我们在该控件中使用了Qt的QPainter类将图像绘制到界面中,实现了图像的显示。 在程序的主函数中,我们使用OpenCV的imread()函数读取了用户选择的图像文件,并在程序中显示了原始图像。然后程序等待用户在ROIWidget中选择ROI区域,并使用OpenCV的getPerspectiveTransform()函数计算透视变换矩阵。最后,程序使用OpenCV的warpPerspective()函数对ROI区域进行校正,并在程序中显示了校正后的ROI区域。 需要注意的是,在实际应用中,透视变换矩阵的计算可能会更加复杂和精细化,例如基于特征点匹配的方法、鱼眼校正等。此外,在实现中,我们只考虑了单个ROI区域的校正,实际应用中可能需要对多个ROI区域进行校正

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值