learn opencv-如何在OpenCV中选择边界框(ROI)?
来源:互联网 发布:知乎手机上网页版 编辑:程序博客网 时间:2024/06/09 08:08
参考:https://github.com/spmallick/learnopencv
如何在OpenCV(C ++ / Python)中选择边界框(ROI)?
在本教程中,我们将学习如何在OpenCV中的图像中选择边界框或感兴趣区域(ROI)。 在过去,我们必须通过处理鼠标事件来编写我们自己的边界框选择器。 但是,现在我们可以选择使用OpenCV原生部分的函数selectROI。
我对OpenCV库中的奇怪选择感到惊讶。 您可能会认为selectROI将成为具有显示图像,绘图等功能的highgui的一部分。但是,selectROI是跟踪API的一部分! 正如你在后面会注意到的,写selectROI时所做的选择有点奇怪。 但是,在我们批评之前,我们得感谢有人制造出一些有用的东西,尽管它并不完美。
让我们深入看看selectROI的用法
如何在OpenCV中选择一个感兴趣的区域
由于selectROI是跟踪API的一部分,因此您需要使用opencv_contrib安装OpenCV 3.0(或更高版本)。
我们从一个示例代码开始。 它允许您在图像中选择一个矩形,裁剪矩形区域并最终显示裁剪后的图像。
我们将修改突出显示的行以尝试不同的选项。
C++
#include <opencv2/opencv.hpp>// selectROI is part of tracking API#include <opencv2/tracking.hpp>using namespace std;using namespace cv;int main (int argc, char **arv){ // Read image Mat im = imread("image.jpg"); // Select ROI Rect2d r = selectROI(im); // Crop image Mat imCrop = im(r); // Display Cropped Image imshow("Image", imCrop); waitKey(0); return 0;}
Python
import cv2import numpy as npif __name__ == '__main__' : # Read image im = cv2.imread("image.jpg") # Select ROI r = cv2.selectROI(im) # Crop image imCrop = im[int(r[1]):int(r[1]+r[3]), int(r[0]):int(r[0]+r[2])] # Display cropped image cv2.imshow("Image", imCrop) cv2.waitKey(0)
从左上角拖动矩形到右下角
如果你像我一样,你会喜欢把一个矩形从左上角拖到右下角,而不是从中心拖动。 那么,我们可以很容易地解决这个问题,用下面一行代替突出显示的行。
C++
bool fromCenter = false; Rect2d r = selectROI(im, fromCenter);
Python
fromCenter = Falser = cv2.selectROI(im, fromCenter)
如何指定窗口名称?
如果你可以使用现有的窗口而不是ROI选择器的窗口,这不是很好吗? 那么你走了
C++
bool fromCenter = false; Rect2d r = selectROI("Image", im, fromCenter);
Python
fromCenter = Falser = cv2.selectROI("Image", im, fromCenter)
不想显示十字线?
现在,假设你不喜欢十字准线,并希望看到没有它的矩形。 您可以修改代码以不显示十字线。
C++
bool showCrosshair = false; bool fromCenter = false; Rect2d r = selectROI("Image", im, fromCenter, showCrosshair);
Python
showCrosshair = FalsefromCenter = Falser = cv2.selectROI("Image", im, fromCenter, showCrosshair)
如何在一个图像上选择多个感兴趣区域(roi)?
selectROI函数还允许您选择多个感兴趣的区域,但似乎有两个错误。
Bug警告1:根据说明,您可以拖动一个矩形,然后按ENTER并拖动另一个矩形。 但是,OpenCV 3.2中的实现似乎存在一个错误。 您必须在第一个矩形后两次按ENTER键。 对于所有后续的矩形,您应该按ENTER一次。
C++
// Specify a vector of rectangles (ROI) vector<Rect2d> rects;bool fromCenter = false; // The selected rectangles are inselectROI("Image", im, rects, fromCenter);
错误警报2:我不能让python版本工作,没有文档。 下面的代码运行,但是变量rects没有被填充。 该函数也不会返回任何东西。 如果您发现修复,请在下面的评论中告诉我。
Python
# Note this code does not work. # Specify a vector of rectangles (ROI) rects = []fromCenter = false# Select multiple rectanglesselectROI("Image", im, rects, fromCenter)
- learn opencv-如何在OpenCV中选择边界框(ROI)?
- opencv 鼠标选择ROI
- opencv中roi嵌套
- OpenCV中ROI 总结
- OpenCV中ROI 总结
- OpenCV中ROI 总结
- OpenCV中ROI
- OpenCV中图像设置ROI
- opencv roi
- opencv ROI
- opencv:ROI
- OpenCV中Mat类的图像如何设置ROI
- openCV中Mat类的图像如何设置ROI
- OpenCV中Mat类的图像如何设置ROI
- OpenCV中Mat类的图像如何设置ROI
- OpenCV中Mat类的图像如何设置ROI
- opencv 图片上进行ROI选择
- OpenCV目标追踪鼠标选择ROI区域
- Effective C++ 45. Use member function templates to accept "all compatible types."
- Java第十二章练习习题
- ros学习笔记(ova1)CMake语句解析
- 可能碰到的iOS笔试面试题(10)--UI
- readline中的键盘码^[[A,^[[B,^[[D,^[[C (ANSI控制码)
- learn opencv-如何在OpenCV中选择边界框(ROI)?
- ubuntu配置sublime
- 直播 | Kubernetes调度
- MatlabR2012a显示使用过期的注册文件破解
- c++中堆栈STL的使用
- SecureRandom的漏洞与正确打开方式
- Runtime详解(面试必备)
- 浏览器渲染 defer async css cssom
- 三年java经验面试总结