如何从OpenCV中的一行获得积分?

时间:2011-07-14 06:31:01

标签: image-processing opencv computer-vision

cvLine()函数可以给出两个点P1(x1,y1)和P2(x2,y2)的直线。我坚持的是获得这条线上的点而不是直接画出它。

假设我画了一条线(绿色)AB和另一条线AC。如果我跟随AB线上的所有像素,我会遇到一个点,在我到达B之前,我会遇到黑色像素(包围A的圆的边界)。

再次沿着AC上的像素行进时,黑色像素将会遇到两次。

line points

基本上我试图获得(绿色)线上的点,但cvLine()似乎没有返回任何点序列结构。有没有办法使用OpenCV获得这些点?

一种相当愚蠢的方法是在单独的图像上使用cvLine()绘制线条,然后在其上找到轮廓,然后遍历轮廓的CvSeq*(绘制的线条)。划痕图像和原始图像具有相同的大小,我们将得到点的位置。就像我说的那样,有点愚蠢。任何开明的方法都会很棒!

2 个答案:

答案 0 :(得分:12)

我认为CvLinIterator会做你想要的。

答案 1 :(得分:0)

另一种肮脏但有效的方法,可以在不迭代线的所有像素的情况下找到圆和线之间的交点数:

# First, create a single channel image having circles drawn on it.
CircleImage = np.zeros((Height, Width), dtype=np.uint8)
CircleImage = cv2.circle(CircleImage, Center, Radius, 255, 1)  # 255-color, 1-thickness

# Then create an image of the same size with only the line drawn on it
LineImage = np.zeros((Height, Width), dtype=np.uint8)
LineImage = cv2.line(LineImage, PointA, PointB, 255, 1)  # 255-color, 1-thickness

# Perform bitwise AND operation
IntersectionImage = cv2.bitwise_and(CircleImage, LineImage)

# Count number of white pixels now for the number of points of intersection.
Num = np.sum(IntersectionImage == 255)

此方法也很快,因为它使用OpenCV和numpy库而不是遍历像素。

在图像“ CircleImage”中添加另一个圆时,您可以找到圆和AC线的交互点数。