標準のハフ変換を使用して、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 に答える