Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/285.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python OpenCV:selectROI返回零元组_Python_Opencv - Fatal编程技术网

Python OpenCV:selectROI返回零元组

Python OpenCV:selectROI返回零元组,python,opencv,Python,Opencv,我正在尝试使用选择ROI裁剪感兴趣区域。但是在我的代码中,selectROI总是返回(0,0,0,0)作为元组。我用不同的图片尝试了这一点,但问题仍然存在。有人能帮我吗 import numpy as np import cv2 from matplotlib import pyplot as plt img = cv2.imread('diff-overlay.jpg') r = cv2.selectROI("Image", img, False, Fa

我正在尝试使用
选择ROI
裁剪感兴趣区域。但是在我的代码中,selectROI总是返回(0,0,0,0)作为元组。我用不同的图片尝试了这一点,但问题仍然存在。有人能帮我吗

    import numpy as np
    import cv2
    from matplotlib import pyplot as plt
    img = cv2.imread('diff-overlay.jpg')
    r = cv2.selectROI("Image", img, False, False)
    imCrop = img[int(r[1]):int(r[1]+r[3]), int(r[0]):int(r[0]+r[2])]
    cv2.imshow("Image", imCrop)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

图像右上角是原点

X
向下增加

Y
从左到右递增

左上角是
x1,y1
左下角是
x2,y2

因此,图像[y1:y2,x1:x2]应该为您提供所选的感兴趣区域


您需要在使用鼠标显示的图像上裁剪该区域。选择感兴趣区域后,点击
Enter
键,它将返回裁剪后的图像。现在,当您检查
r
的值时,它将返回裁剪图像的左上角和右下角坐标的元组

代码:

if __name__ == '__main__' :

    # Read image
    im = cv2.imread("C:/Users/Desktop/Bengal_cat.png")

    # Select ROI
    r = cv2.selectROI(im, False, False)

    # 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)

    cv2.destroyAllWindows()
插图:

if __name__ == '__main__' :

    # Read image
    im = cv2.imread("C:/Users/Desktop/Bengal_cat.png")

    # Select ROI
    r = cv2.selectROI(im, False, False)

    # 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)

    cv2.destroyAllWindows()
假设我有以下图像:

现在,当代码执行时,选择ROI(im、False、False) ,图像显示在可以使用鼠标进行裁剪的位置:

点击“回车”键(或任何其他键)后,将显示裁剪图像:

这就是它的全部内容

  • 变量
    r
    返回一个元组,在本例中为:
    (31,65,125,120)
在哪里,

(31, 65, 125, 120)
 ^   ^    ^    ^
 |   |    |    |
 x1  y1   |    y2 = 120 + 65
          x2 = 125 + 31

非常感谢。实际上,我是在按“C”键。(之后,该行以(0,0,0,0)作为r的值执行)。我想只有回车键起作用了。谢谢。我注意到的一点是元组中的第三个元素是宽度,最后一个参数是矩形的长度。这就是我们在代码中编写
r[1]+r[3]
的原因。这是矩形底部的Y轴距离。@SubhamKumar对疏忽表示抱歉。我已经用你的发现编辑了答案。