使用Qt和Opencv为高分辨率图像选择ROI
我正在从事一个项目,该项目涉及从高分辨率图像中选择ROI(更像是5187x3268)。现在,我在OpenCV中使用使用Qt和Opencv为高分辨率图像选择ROI,opencv,image-processing,pyqt,roi,qmouseevent,Opencv,Image Processing,Pyqt,Roi,Qmouseevent,我正在从事一个项目,该项目涉及从高分辨率图像中选择ROI(更像是5187x3268)。现在,我在OpenCV中使用findContours来检测圆形对象(因为hough圆对于高分辨率图像来说有点慢)。问题在于,由于对象上有大量纹理,findContours有时会出错 我现在要做的是,向用户展示findContours在Qt窗口中检测到的内容,并确定它是否检测正确。如果检测正确,用户将按下Ok按钮,如果没有No,让我选择将按下的按钮 当用户按下No,让我选择,应用程序将开始捕获mouseEvent
findContours
来检测圆形对象(因为hough圆对于高分辨率图像来说有点慢)。问题在于,由于对象上有大量纹理,findContours
有时会出错
我现在要做的是,向用户展示findContours
在Qt窗口中检测到的内容,并确定它是否检测正确。如果检测正确,用户将按下Ok
按钮,如果没有No,让我选择将按下的按钮
当用户按下No,让我选择,应用程序将开始捕获mouseEvent
,并使用QRubberBand
显示一个矩形。我正在使用QLabel
来显示图像,因为我的屏幕大小是1920x1080
,所以我必须将图像的大小调整到一定的分辨率(比如1537x1280,以便为按钮留出一些空间)。
我正在使用opencvresize
调整图像大小
width = myImageDisplayer.width()
height = myImageDisplayer.height()
resizedImage = cv2.resize(myImage,(height,width),cv2.INTER_LINEAR)
我用比率来计算像这样的尺寸缩减(
,并将event.pos()
坐标与比率相乘,以获得原始图像中的正确坐标
xrealCoordinates = event.pos().x()*xReduction
yrealCoordinates = event.pos().y()*yReduction
因为坐标是浮点的,所以我将它们舍入。问题在于舍入浮点值,因为我在转换过程中失去了精度
精度很重要,因为在从图像中选择ROI后,我需要重新计算主坐标(通过校准立体设置计算)
Opencv在调整大小后如何正确计算原始图像坐标?
当我使用imshow
打开同一图像时,我观察到了这一点,如果我拖动鼠标,我可以看到原始图像坐标,即使图像已调整大小以适应屏幕
如果有人能在这个问题上帮助我,我将不胜感激。你提到的四舍五入不是问题,而且计算是合理的。问题是你在按比例工作,但只能测量光标位置到一个像素。如果你将图像的每个维度缩放到原始的1/4,那么每个4x4组原稿中的f像素变成结果中的单个像素。现在,如果单击此像素,您知道它将落在原稿的4x4区域中的某个位置。为了让用户精确选择一个像素,我将添加对滚动、多个缩放级别和一些按钮(或其他合适的控件)的支持用于精确调整选择位置和大小。是的,但即使我使用opencv的selectRoi
进行了测试。即使它将图像大小调整到特定尺寸,它也会重新计算原始图像坐标,根据我的经验,它们与像素精确。我想知道opencv如何获得正确的像素坐标|但是,即使你可以获得亚像素精度的鼠标屏幕位置,你仍然看不到你到底选择了什么…我实际上不必看到我到底选择了什么,如果我可以覆盖主题周围的某个区域,我会很高兴。因为我必须在ROI
计算后重新计算主坐标图像,选择必须精确,否则计算会有错误。现在我想通过将最后两个数字舍入为零来作弊,例如“如果原始图像中计算的图像坐标是1573,那么我将舍入为1500”。希望它能起作用。
xrealCoordinates = event.pos().x()*xReduction
yrealCoordinates = event.pos().y()*yReduction