【发布时间】:2015-01-17 15:16:04
【问题描述】:
我已经尝试了多种方法来围绕 minAreaRect() 创建 boundingRect(),但我一直遇到错误。我可以简单地使用原始轮廓,是的,但在这一点上,需要了解为什么与 cv2.isContourConvex() 和 cv2.drawContours() 一起使用的轮廓不能与 cv2.boundingRect() 一起使用。基本上我试图更好地理解轮廓的构造。
代码如下:
import cv2
import numpy as np
# EX1: draw contour from minAreaRect() output
mar = cv2.minAreaRect( contour )
pts = cv2.cv.BoxPoints( mar )
pts_contour = np.int0(pts)
cv2.drawContours(mask, [pts_contour], 0, 255, -1)
cv2.boundingRect( pts_contour ) # ERROR: see below
# EX2: test contour convex
contour = np.array([(378, 949), (375, 940), (368, 934),
(359, 932), (350, 937), (345, 955), (351, 962), (359, 966), (368, 964),
(376, 958) ], dtype=np.int)
print cv2.isContourConvex(contour)
cv2.boundingRect( contour ) # ERROR: see below
EX1: 来自 boundingRect() 的错误:OpenCV 错误:cvBoundingRect 中不支持的格式或格式组合(函数不支持图像/矩阵格式) Rotated Rectangles section here中提供了这个转换为轮廓的示例
EX2:boundingRect() 出错:OpenCV 错误:在 boundingRect 中断言失败 (points.checkVector(2) >= 0 && (points.depth() == CV_32F || points.depth() == CV_32S)) 这个从头开始创建轮廓的例子was provided here
再次,我可以实现我的目标,所以我不想要有关变通方法的建议,但我想更好地理解轮廓背后的构造和错误本身,因为我可以看到创建一个 boundingRect() 从选定点
另外,我不知道这是否重要,但我注意到 BoxPoints() 和 findContours()[0] 的输出之间存在差异:
# BoxPoints:
[[1051 1367]
[ 968 1364]
[ 977 1072]
[1061 1074]]
# findCountours()[0]:
[[[ 992 1073]]
[[ 991 1074]]
[[ 989 1074]]
[[ 988 1073]]]
>>> cv2.__version__
'2.4.9'
cv2.boxPoints() 对我不可用,所以我不确定这是否会给我带来不同的结果
【问题讨论】: