我使用的是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
时,我得到奇怪的结果。它看起来像三角形线或有时在两个对应点之间的虚线而不是点之间的直线。
所以我应该绘制线段而不是总线。但它不是很方便。这是由于线条画algorythm的限制还是可以某种方式纠正?
答案 0 :(得分: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,从而导致不同的代码路径,并查看会发生什么。