2

OpenCV 2.4.5 を使用しています。2 つの画像の一致する点の間に線を引きたい。コードは次のとおりです。

const int &w=image1.cols;
for (size_t i = 0; i<good_matches.size(); i++ )
{
    //-- Get the keypoints from the good matches
    img1.push_back(keypoints1[good_matches[i].queryIdx].pt);
    img2.push_back(keypoints2[good_matches[i].trainIdx].pt);

    circle(image1,img1[i],20,Scalar(255,0,0),5);
    circle(image2,img2[i],20,Scalar(0,255,0),5);

    line(image1,img1[i],Point2f(img2[i].x+w,img2[i].y),Scalar(255,255,255),5);
    line(image2,Point2f(img1[i].x-w,img1[i].y),img2[i],Scalar(255,255,255),5);
}

行の長さwithin the bounds of imageがそれ以上16400になると、奇妙な結果が得られます。ポイント間の直線ではなく、対応する 2 つのポイント間の三角形または破線のように見えます。

したがって、合計線ではなく線分を描画する必要があります。しかし、それはあまり便利ではありません。線画アルゴリズムの制約によるものなのか、どうにか修正できるのでしょうか?

4

1 に答える 1

0

線画機能は非常に長い線を描くことができません。

以下は、長さ 32800 ピクセルの線はレンダリングされず、長さ 32700 ピクセルの線はレンダリングされることを示すコードです。cv::line 関数は、呼び出された関数 ThickLine (drawing.cpp) 内で分解されます。

int length = 32800;
cv::Mat canvas = cv::Mat::zeros(5,length,CV_8UC3);// create blank canvas
cv::line(canvas,cv::Point(0,1),cv::Point(length,1),cv::Scalar(255,0,0),1,8); //blue line
cv::line(canvas,cv::Point(0,3),cv::Point(length-100,3),cv::Scalar(0,0,255),1,8); //red line
cv::imwrite("d:\\canvas.tif",canvas);

長さが 16400 (おそらく 2^14 ?) ピクセルを超える行が破損する理由がわかりません。厚さを 1 に設定してみてください。これにより、別のコード パスをたどり、何が起こるかを確認できます。

于 2013-05-30T18:14:56.830 に答える