OpenCV cv2.rectangle 输出二值图像
Posted
技术标签:
【中文标题】OpenCV cv2.rectangle 输出二值图像【英文标题】:OpenCV cv2.rectangle output binary image 【发布时间】:2017-03-24 08:32:36 【问题描述】:我一直在尝试在黑色图像上绘制矩形,我们cv2.rectangle
。这是我的代码:(这只是一个示例,在实际代码中存在一个循环,即值 x2、y2、w2、h2 变化一个循环)
heir = np.zeros((np.shape(image1)[0],np.shape(image1)[1]),np.uint8);
cv2.rectangle(heir,(x2,y2),(x2+w2,y2+h2),(255,255,0),5)
cv2.imshow("img",heir);
cv2.waitKey()
它给出以下输出: 为什么图像是这样的?为什么边界不仅仅是一条宽度为 5 的线。 我试过了,但我无法弄清楚。
【问题讨论】:
这是来自 imshow 的屏幕截图吗?原始图像的分辨率是否远更高(例如 5x?),因此在图像被下采样显示时线条会丢失吗?如果您在较小的图像上执行这些操作会发生什么? 感谢您的评论。不,事实并非如此。它是全尺寸图像。我没有进行任何处理(下采样或上采样)。这是imwrite版本 x2,y2,w2,h2 的典型值是多少? 使用 np.zeros 创建继承人时,您会创建单层 np.uint8 作为数据类型 - 这是否意味着您有 8 位像素,(255,255,0)如何映射到这个时你画矩形?即你不应该使用 np.zeros((np.shape(image1)[0],np.shape(image1)[1],3),dtype=np.uint8) - 添加 3,使用显式命名参数) 我只想要二进制图像。轮廓不一定是彩色的。它可以是白色的。实际上我用 cv2.contours 做了完全相同的事情,它给了我输出。我不知道 cv2.rectangle 有什么问题 【参考方案1】:不能在评论中发布,但这是一个否定的答案:相同的操作在 Windows/python 2.7.8/opencv3.1 上对我有效
import numpy as np
import cv2
heir = np.zeros((100,200),np.uint8);
x2=10
y2=20
w2=30
h2=40
cv2.rectangle(heir,(x2,y2),(x2+w2,y2+h2),(255,255,0),5)
cv2.imshow("img",heir);
cv2.waitKey()
【讨论】:
那么为什么要使用青色 (255,255,0) 作为矩形的颜色呢?如果您想要白色,请制作 (255,255,255)。 是的,我已经尝试了所有的可能性。我做了 (255,255,255), (255,255,0),(255,0,255) 和简单的 255。没有任何效果 你给出的答案也是2频道。我想知道为什么会发生在我身上 其实我给出的维度是:x1 = np.int(np.ceil(x1 *np.shape(image1)[1]/700)); 这意味着什么?【参考方案2】:因为您正在以灰度加载要标记的图像(绘制矩形),所以当您添加矩形/边界框时,颜色会被转换为灰度。
要解决此问题,请以“颜色”格式打开图像。由于您没有包含该部分代码,因此建议的解决方案如下:
tag_img = cv2.imread(MYIMAGE,1)
注意这里的第二个参数,“1”,表示加载图片为颜色。在此处阅读有关阅读图像的更多信息:https://docs.opencv.org/3.0-beta/doc/py_tutorials/py_gui/py_image_display/py_image_display.html
【讨论】:
以上是关于OpenCV cv2.rectangle 输出二值图像的主要内容,如果未能解决你的问题,请参考以下文章
python-opencv boundingRect使用注意