0
我已經學會如何使用line(frame, Point(15, 20), Point(70, 50), 'r', 2, 8);
無法得出使用鼠標點擊
我也學會了如何使用鼠標點擊來繪製圖像的線畫在OpenCV的圖像上線圖像上的多條線路。例如,下面的代碼繪製的圖像上連接兩個點用戶點擊一條線:
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');
但問題是,這樣一來,即使不是一條線會被拉伸,之後點擊幾下,然後輸入「Y」,該應用程序榮獲」沒有迴應。
請幫我解決這個問題。
你並沒有清除點向量。它會填充更多的座標,但您總是使用第一個和第二個繪製線條。 – jasal
@Jasal感謝您指出錯誤。由於我對矢量類型不熟悉,無法理解正在發生的事情。你介意把幾行代碼解釋一下嗎? – user2799508
你在「while」循環和附加的for循環後的意圖是什麼?現在沒有做任何事情。 – jasal