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