2

我使用 OpenCV 2.4.5。我想在两个图像的匹配点之间画线。代码是:

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 回答