将cv2.minAreaRect()输出转换为轮廓以输入到cv2.boundingRect()

时间:2014-11-19 22:15:56

标签: python opencv

我已经尝试了很多方法来创建一个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()无法使用,因此我不确定这是否会为我带来不同的结果

2 个答案:

答案 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) 当你使用这个函数时它会返回一个元组。