2016-06-30 2 views
0

У меня есть простое окно, содержащее простое черное изображение с небольшим сплошным кругом внутри него. Я написал простой код, чтобы перетащить этот круг. Я мог бы сделать это правильно. Внутри функции mouse_event:Остановка рендеринга OpenCV при перемещении мыши

void on_mouse_event(int event_type, int x, int y, int flags, void*){ 
    if (event_type == cv::EVENT_RBUTTONDOWN){ 
     //Catch the circle 
    } 
    else if (event_type == cv::EVENT_MOUSEMOVE){ 
     //Release the point 
    } 
    else if (event_type == cv::EVENT_MOUSEMOVE){ 
     //Change circle position according to curser moving 
     //re draw the circle again 
     //show the new image 
    } 
} 

Основная функция:

while (true){ 
    //show image code (simple cv::imshow); 
    if (cv::waitKey(1) == 27){ 
     break; 
    } 
} 

Проблема заключается в том, что если я перетащить круг и начать двигаться быстро, изображение не изменится, пока не остановится. Однако, если я пойду медленно, это изменится в соответствии с ходом. В чем причина этой проблемы? P.S Я вообще не сомневаюсь в медленном оборудовании. Я работаю на рабочей станции, и я наставляю использование процессора, и только один из его 8-ядерных приложений достигает 50%, а память почти бесплатна.

Я использую Windows 10, если это помогает.

ответ

1

вы можете проверить следующий код. (Адаптировано из opencv_annotation.cpp)

#include <opencv2/highgui.hpp> 
#include <opencv2/imgproc.hpp> 

using namespace std; 
using namespace cv; 

// Function prototypes 
void on_mouse(int, int, int, int, void*); 

// Public parameters 
Mat image(600, 800, CV_8UC3, Scalar(220, 220, 220)); 
Mat current_view; 
int circle_center_x = image.cols/2, circle_center_y = image.rows/2, radius = 40; 
bool dragging = false; 

const string window_name = "OpenCV Mouse Event Demo"; 

void on_mouse(int event, int x, int y, int, void *) 
{ 
    // Action when left button is clicked 
    if (event == EVENT_LBUTTONDOWN & (abs(circle_center_x - x) < 20) & (abs(circle_center_y - y) < 20)) 
    { 
     dragging = true; 
    } 

    if (event == EVENT_LBUTTONUP) 
    { 
     dragging = false; 
    } 
    // Action when mouse is moving 
    if ((event == EVENT_MOUSEMOVE) && dragging) 
    { 
     image.copyTo(current_view); 
     circle_center_x = x; 
     circle_center_y = y; 
     circle(current_view, Point(circle_center_x, circle_center_y), radius, Scalar(255, 0, 0), 5); 
     imshow(window_name, current_view); 
    } 
} 

int main(int argc, const char** argv) 
{ 
    // Init window interface and couple mouse actions 
    namedWindow(window_name, WINDOW_AUTOSIZE); 
    setMouseCallback(window_name, on_mouse); 

    image.copyTo(current_view); 
    circle(current_view, Point(circle_center_x, circle_center_y), radius, Scalar(255, 0, 0), 5); 
    imshow(window_name, current_view); 

    int key_pressed = 0; 

    do 
    { 
     // Keys for processing 
     // Based on the universal ASCII code of the keystroke: http://www.asciitable.com/ 
     //  <SPACE> = 32 add circle to current image 
     //  <ESC> = 27  exit program 
     key_pressed = 0xFF & waitKey(0); 
     if (key_pressed==32) 
     { 
      // draw a circle on the image 
      circle(image, Point(circle_center_x, circle_center_y), radius, Scalar(0, 0, 255), -1); 
      image.copyTo(current_view); 
      circle(current_view, Point(circle_center_x, circle_center_y), radius, Scalar(255, 0, 0), 5); 
      imshow(window_name, current_view); 
     } 
    } 
    // Continue as long as the <ESC> key has not been pressed 
    while (key_pressed != 27); 

    // Close down the window 
    destroyWindow(window_name); 
    return 0; 
} 
Смежные вопросы