opencv 选择矩形框

新版opencv c++和python都不支持选多个roi,可以连续选几次。

参数解读:

selectROI(windowName, img, showCrosshair=None, fromCenter=None):
    .   参数windowName:选择的区域被显示在的窗口的名字
    .   参数img:要在什么图片上选择ROI
    .   参数showCrosshair:是否在矩形框里画十字线.
    .   参数fromCenter:是否是从矩形框的中心开始画

返回值:

image=cv2.imread('example.png')
cv2.namedWindow('img')
r = cv2.selectROI('roi', image, False, False )
print(r)
cv2.waitKey(0)
import cv2
import numpy as np

if __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)

 

#include 
// selectROI is part of tracking API
#include 

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 cv2
import numpy as np

if __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 = False
r = cv2.selectROI(im, fromCenter)

如何指定窗口名称?

如果你可以使用现有的窗口而不是ROI选择器的窗口,这不是很好吗? 那么你走了

C++

bool fromCenter = false; 
Rect2d r = selectROI("Image", im, fromCenter);

Python

fromCenter = False
r = cv2.selectROI("Image", im, fromCenter)

不想显示十字线?

现在,假设你不喜欢十字准线,并希望看到没有它的矩形。 您可以修改代码以不显示十字线。

C++

bool showCrosshair = false; 
bool fromCenter = false; 
Rect2d r = selectROI("Image", im, fromCenter, showCrosshair);

Python

showCrosshair = False
fromCenter = False
r = cv2.selectROI("Image", im, fromCenter, showCrosshair)

如何在一个图像上选择多个感兴趣区域(roi)?

selectROI函数还允许您选择多个感兴趣的区域,但似乎有两个错误。

Bug警告1:根据说明,您可以拖动一个矩形,然后按ENTER并拖动另一个矩形。 但是,OpenCV 3.2中的实现似乎存在一个错误。 您必须在第一个矩形后两次按ENTER键。 对于所有后续的矩形,您应该按ENTER一次。

C++

// Specify a vector of rectangles (ROI) 
vector rects;
bool fromCenter = false; 
// The selected rectangles are in
selectROI("Image", im, rects, fromCenter);

你可能感兴趣的:(python)