【问题标题】:OpenCV - can't draw long lineOpenCV - 不能画长线
【发布时间】:2013-05-17 13:14:03
【问题描述】:

我使用 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 个对应点之间的虚线,而不是点之间的直线。

所以我应该画线段而不是总线。但这不是很方便。是因为画线算法的限制还是可以通过某种方式纠正?

【问题讨论】:

  • 也许您可以使用内置函数drawMatchesdocs.opencv.org/modules/features2d/doc/… drawMatches(const Mat& img1, const vector& keypoints1, const Mat& img2, const vector& keypoints2, const vector&matches1to2, Mat& outImg, const Scalar& matchColor, const Scalar& singlePointColor, const vector &matchesMask, int flags)
  • Alex,感谢您提示drawMatches,它在其他一些情况下对我有用。但是我试过了,结果是一样的,因为这个函数也尝试用 line 函数绘制全长的长线,这在我的情况下不起作用。

标签: c++ opencv drawing line


【解决方案1】:

画线功能不能画很长的线。

下面是一些代码,演示不会渲染 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,这会导致不同的代码路径,看看会发生什么。

【讨论】:

    猜你喜欢
    • 2016-03-05
    • 2016-03-27
    • 2023-03-10
    • 1970-01-01
    • 2012-10-21
    • 1970-01-01
    • 2016-07-29
    • 2016-08-21
    • 1970-01-01
    相关资源
    最近更新 更多