我使用的是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个对应点之间的折线,而不是点之间的直线。所以我应该画线段而不是总线。但这不是很方便。是由于画线算法的限制还是可以通过某种方式纠正?
最佳答案
线条绘制功能不能绘制很长的线条。
下面是一些代码,说明长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,这将导致不同的代码路径,并查看会发生什么。