2014-07-07 78 views
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」,該應用程序榮獲」沒有迴應。

請幫我解決這個問題。

+0

你並沒有清除點向量。它會填充更多的座標,但您總是使用第一個和第二個繪製線條。 – jasal

+0

@Jasal感謝您指出錯誤。由於我對矢量類型不熟悉,無法理解正在發生的事情。你介意把幾行代碼解釋一下嗎? – user2799508

+0

你在「while」循環和附加的for循環後的意圖是什麼?現在沒有做任何事情。 – jasal

回答

2

您的代碼可能存在幾個問題,阻止它做你想做的事。首先想到的是,你不清除用於捕獲座標的矢量。畫線

line(frame, points[0], points[1], 'r', 2, 8); 

後,您應該重新設定這樣

points.clear(); 

的載體,使下鼠標點擊的座標去points[0]。否則,它會追加到矢量,並且會一直重複在前兩個鼠標座標之間繪製線條。