【问题标题】:rectangle not showing up in opencv矩形没有出现在opencv中
【发布时间】:2017-11-13 07:39:03
【问题描述】:

为什么矩形没有出现在我的代码中?

import cv2

im = cv2.imread('players.bmp')

#im.shape >>returns (765,1365,3)

cv2.rectangle(im, (64,1248), (191,1311), (0,255,0), 2)
cv2.namedWindow("image", cv2.WINDOW_NORMAL)
cv2.imshow('image', im)
cv2.waitKey(0)
cv2.destroyAllWindows()

【问题讨论】:

    标签: python python-3.x opencv


    【解决方案1】:

    这个问题的原因完全不同

    对我来说,它没有显示出来,因为我使用的是图像中的 numpy 视图,所以我没有使用cv2.cvtColor(frame, cv2.COLOR_RGB2BGR),而是使用frame[..., ::-1] 来转换 RGB 和 BGR。

    不知何故,这使得结果不可变,当cv2.rectangle 尝试写入它时,它并没有改变。

    【讨论】:

    • 差不多 5 年后,我只是浪费了大约一个小时试图理解为什么 cv2 不会绘制矩形(甚至不会抛出错误)。谢谢。
    【解决方案2】:

    它不显示矩形,因为您将它绘制在图像之外。

    为什么?你可能会问。很简单。你有这个:

    #im.shape >>returns (765,1365,3)
    

    这意味着

    rows/height = 765
    cols/width = 1365
    channels = 3
    

    那你就做吧

    cv2.rectangle(im, (64,1248), (191,1311), (0,255,0), 2)
    

    这里你使用了 2 个点,它们是元组 (x,y),但是你把它们写成元组 (y,x) 的位置。我知道 OpenCV 在很多函数中使用顺序(y,x),但这是因为他们将图像视为矩阵,通常使用(行,列)访问,转换为(y,x)。对于这个矩形,它们需要,这些点以典型的笛卡尔方式 (x,y) 表示。

    总结一下,改成:

    cv2.rectangle(im, (1248, 64), (1311, 191), (0,255,0), 2)
    

    它应该可以工作。

    【讨论】:

    • 谢谢你,兄弟..你拯救了我的一天......这个笛卡尔坐标和图像坐标中的 x 和 y 让我头疼。有什么简单的记忆方法吗
    • @NemiBhattarai 如果是点,使用笛卡尔,如果是访问图像中的像素,使用矩阵。使用文档,如果他们说点那么笛卡尔。 Rects 对象也是 (x,y,width, height)... 我认为这是 OpenCV 的坏处之一 ....
    【解决方案3】:

    我在遇到同样的问题时偶然发现了这个问题。就我而言,我正确地传递了xy 以及x+wy+h。我犯了两个错误:

    • 我在 tryexcept 块中有这部分(所以我看不到引发的异常)
    • 在我绘制矩形之前,我的代码将h 更改为一个数组。 (在错误地将 h 更改为 [1,-1,-1,-1] 之前,我已经从 x,y,w,h = cv2.boundingRect(cnt) 中提取了 x,y,w,h 的值)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-17
      • 2022-09-23
      • 2011-04-26
      • 1970-01-01
      • 1970-01-01
      • 2016-08-23
      相关资源
      最近更新 更多