0

我使用标准霍夫变换来获得使用 OpenCV 的图像中的直线。现在,我需要找到图像中大多数线的交点的 x 和 y 坐标。我的想法是将图像分成几个 8*8 像素段(我还没有决定大小),然后在该区域中搜索线条。但我不确定如何计算段中的行数。在这一点上我很震惊。所以我无法做的事情(使用openCV)是1.将图像分成8 * 8像素段(我不知道是否有它的功能,如果没有我该怎么办)2.计算数字每个段中的行数。任何有关代码的阅读材料或提示都会非常有帮助。

4

3 回答 3

1

您检测交叉点的方式是完全错误的。有一个简单的数学公式。我给你一个纯 C. 的示例代码:

// This is a point
typedef struct{
   int x,y;
} MYintPOINT;

// This is line
typedef struct {
    MYintPOINT  pStart;
    MYintPOINT  pEnd;
} MyLine;

#define PointMinusPoint(P,Q,R)      {(P).x = (Q).x - (R).x; (P).y = (Q).y - (R).y;}
#define PointCross(P,Q)             (((P).x*(Q).y)-((P).y*(Q).x))
#define SIGN(X)             (((X)>=0)? 1:-1 )
#define ABS(a)              ((a) >= 0 ? (a) : (-(a)))
#define ROUND(a)            ((SIGN(a)) * ( ( int )( ABS(a) + 0.5 ) ) ) 

// Given 2 line segments, find their intersection point
// rerurns [Px,Py] point in 'res' or FALSE if parallel. Uses vector cross product technique.
int findLinesIntersectionPoint(const MyLine*l1, const MyLine*l2, MYintPOINT *res){
    MYintPOINT  p  = l1->pStart;
    MYintPOINT  dp;
    MYintPOINT  q  = l2->pStart;
    MYintPOINT  dq;
    MYintPOINT  qmp;            // q-p
    int         dpdq_cross;     // 2 cross products
    int         qpdq_cross;     // dp with dq,  q-p with dq
    float       a;

    PointMinusPoint(dp,l1->pEnd,l1->pStart);
    PointMinusPoint(dq,l2->pEnd,l2->pStart);
    PointMinusPoint(qmp,q,p);

    dpdq_cross = PointCross(dp,dq);
    if (!dpdq_cross){
        // Perpendicular Lines
        return 0;
    }

    qpdq_cross = PointCross(qmp,dq);
    a = (qpdq_cross*1.0f/dpdq_cross);

    res->x = ROUND(p.x+a*dp.x);
    res->y = ROUND(p.y+a*dp.y);
    return 1;
}
于 2012-12-27T09:52:07.497 回答
0

我可以帮助您将图像分成 8*8 像素段。

OpenCV 中的rowRange()colRange()函数对此很有用。(此处的文档)这是一个示例:

cv::Mat img = cv::imread("myImage.png");
cv::Mat region = img.rowRange(0,7).colRange(0,7);  //upper-left 8x8 image region
于 2012-12-27T02:46:37.953 回答
0

请注意,由于噪声,大多数线可能根本不会在某一点相交,除此之外,请尝试以下操作:

create black_image 
for each line
    create temporary_black_image
    draw a line to temporary_black_image, use cvScalar(1) as a color for the line
    cvAdd both temporary_black_image to black_image
apply cvSmooth to black_image
CvPoint minLoc; CvPoint maxLoc;
double minVal; double maxVal;
cvMinMaxLoc( black_image, &minVal, &maxVal, &minLoc, &maxLoc );

maxLoc->x and maxLoc-> y will be your estimate

您可以尝试通过改变 cvSmooth 函数的参数来稍微调整结果

于 2012-12-27T13:04:51.473 回答