我已经学会了如何使用line( frame, Point( 15, 20 ), Point( 70, 50), 'r', 2, 8 );
我还学会了如何使用鼠标点击在图像上绘制一条线。例如,以下代码绘制一条线,用于连接用户在图像上点击的两个点:
using namespace cv;
using namespace std;
void onMouse(int evt, int x, int y, int flags, void* param) {
if(evt == CV_EVENT_LBUTTONDOWN) {
std::vector<cv::Point>* ptPtr = (std::vector<cv::Point>*)param;
ptPtr->push_back(cv::Point(x,y));
}
}
int main()
{
std::vector<Point> points;
cv::namedWindow("Output Window");
Mat frame = cv::imread("chhha.png");
cv::setMouseCallback("Output Window", onMouse, (void*)&points);
int X1=0, Y1=0, X2=0, Y2=0;
while(1)
{
cv::imshow("Output Window", frame);
if (points.size() > 1) //we have 2 points
{
for (auto it = points.begin(); it != points.end(); ++it)
{
}
break;
}
waitKey(10);
}
// Now let us draw a line on the image
line( frame, points[0], points[1], 'r', 2, 8 );
cv::imshow("Output Window", frame);
waitKey( 10 );
getch();
return 0;
}
现在基本上我想要的是继续绘制线条,直到我右键单击或输入某些字符。
到目前为止,我尝试使用do-while
循环:
char m;
do{
while(1)
{
cv::imshow("Output Window", frame);
if (points.size() > 1) //we have 2 points
{
for (auto it = points.begin(); it != points.end(); ++it)
{
}
break;
}
waitKey(10);
}
// Draw a line
line( frame, points[0], points[1], 'r', 2, 8 );
cv::imshow("Output Window", frame);
cout<<"do you want more lines, if so , press 'y'"<<endl;
cin>>m;
// instead of this a right click check would be much better
if(m!='y')
{
break;
}
}while(m=='y');
但问题是这样的方式甚至不会划出一条线,只需点击几下并输入“#”,应用程序就不会响应。
请帮我解决这个问题。
答案 0 :(得分:2)
您的代码可能存在一些问题,导致它无法执行您想要的操作。首先想到的是你没有清除用于捕获坐标的矢量。画一条线后
line( frame, points[0], points[1], 'r', 2, 8 );
你应该像这样重置矢量
points.clear();
以便下一次鼠标点击的坐标转到points[0]
。否则它会附加到矢量上,你会一遍又一遍地在前两个鼠标坐标之间画线。