我已经尝试了很多方法来创建一个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错误:断言失败(points.checkVector(2)> = 0&&(points.depth()== CV_32F || points.depth()== CV_32S ))在boundingRect中 这个从头开始创建轮廓的示例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()无法使用,因此我不确定这是否会为我带来不同的结果
答案 0 :(得分:1)
EX2 中的一个细节在opencv错误消息中是显式的:它期望一个dtype
float32或int32:(points.depth() == CV_32F || points.depth() == CV_32S)
的数组。 (用numpy v19测试,如果我猜你没用,因为我找不到int0
)
至于EX1,对不起,我无法使用opencv 3.0.0-beta(cv2.cv消失)重现它。顺便说一句,我建议不要花太多时间来了解这个库的这一部分:cv2.cv是一个legacy feature。
答案 1 :(得分:0)
你必须这样写: (x,y,w,h)= cv2.boundingRect(pts_contour) 当你使用这个函数时它会返回一个元组。