2014-08-27 5 views
0

Opencv에서 웹캠 프레임의 mouse-event를 사용하여 선을 그립니다. MS- 페인트의 지우개처럼 지우고 싶습니다. 어떻게해야합니까? 나는 그것에 대해 많은 생각을 갖고 있지 않다. 그러나 나는 완전히 틀릴 수있는 나의 머리에서이 뒤섞인 pseduo 부호가있다 그러나 나는 어쨌든 그것을 적어 둘 것이다. C++로 구현하는 방법을 알고 싶습니다. 그러면 두 개의 세 가지 마우스 이벤트가 생깁니다. 이벤트 1- 마우스 왼쪽 단추 - 그리기를 시작하는 데 사용됩니다. 이벤트 2- 마우스 이동 - 마우스를 움직여 이벤트 3을 그리는 데 사용됩니다. Mouse leftbuttondown- 이것은 도면을 정지시키는 데 사용됩니다. 이벤트 4- 마우스 더블 클릭 -이 이벤트를 사용하여 그림을 지울 수 있습니다.웹캠 프레임의 opencv에서 mouseclick을 사용하여 선을 그릴 수있는 방법은 무엇입니까?

또한 선 (매트 이미지, Point (startx, starty), Point (endx, endy), (0,0,255), 1))과 같은 선에 대해 draw 함수를 사용합니다.

이제 코드 형식으로 구현하는 방법을 모르겠습니다. 나는 많이 시도했지만 잘못된 결과를 얻는다. 저는 Iplimage 형식이 아닌 Mat 형식의 코드를 제안 해 주시기 바랍니다. 감사.

+0

시도한 내용은 무엇입니까? '잘못된 결과'란 무엇을 의미합니까? opencv의 마우스 수신기를 사용하여 사용자가 클릭하는 위치를 결정하십시오. 많은 예제가 있습니다. – user3791372

+0

@ user3791372 : - 나를 괴롭히는 것은 내가 Lbuttontup의 시작 위치와 Lbuttondown의 끝 위치를 파악하는 방법을 파악할 수 없다는 것입니다. 대부분의 기사는 iplimages를 사용하여 Google에서 확인한 결과 매트 형식을 따랐으므로 많이 혼란스럽게합니다. 나에게 뭔가 제안 해 줄 수있어? – Rebecca

+0

두 요소 배열, 두 요소 구조체, 간단한 클래스 등은 과도하게 복잡하지 않습니다. – user3791372

답변

1

아래의 작업 코드는 Mat를 사용하여 설명 된 설명과 함께 찾으십시오.) 문제가 생기면 알려주세요.

추신 : 주된 기능에서 제 코드에 대해 결함이있는 캠 ID를 1로 변경했습니다. PC에 적합하게 유지해야합니다 .0. 행운을 비네.

#include <iostream> 

#include <opencv\cv.h> 
#include <opencv2\core\core.hpp> 
#include <opencv2\highgui\highgui.hpp> 


class WebCamPaint 
{ 
public: 

    int cam_id; 
    std::string win_name; 
    cv::VideoCapture webCam; 

    cv::Size frame_size; 
    cv::Mat cam_frame, drawing_canvas; 

    cv::Point current_pointer, last_pointer; 
    cv::Scalar erase_color, paint_color; 
    int pointer_size; 

    //! Contructor to initialize basic members to defaults 
    WebCamPaint() 
    { 
     cam_id = 0; 
     pointer_size = 5; 

     win_name = std::string("CamView"); 
     current_pointer = last_pointer = cv::Point(0, 0); 

     erase_color = cv::Scalar(0, 0, 0); 
     paint_color = cv::Scalar(250, 10, 10); 
    } 

    //! init function is required to set some members in case default members needed to change. 
    bool init() 
    { 
     //! Opening cam with specified cam id 
     webCam.open(cam_id); 
     //! Check if problem opening video 
     if (!webCam.isOpened()) 
     { 
      return false; 
     } 

     //! Reading single frame and extracting properties 
     webCam >> cam_frame; 
     //! Check if problem reading video 
     if (cam_frame.empty()) 
     { 
      return false; 
     } 
     frame_size = cam_frame.size(); 
     drawing_canvas = cv::Mat(frame_size, CV_8UC3); 

     //! Creating Activity/Interface window 
     cv::namedWindow(win_name); 
     cv::imshow(win_name, cam_frame); 

     //! Resetting drawing canvas 
     drawing_canvas = erase_color; 

     //! initialization went successful ;) 
     return true; 
    } 

    //! This function deals wih all processing, drawing and displaying ie main UI to user 
    void startAcivity() 
    { 
     //! Keep doing until user presses "Esc" from Keyboard, wait for 20ms for user input 
     for (char user_input = cv::waitKey(20); user_input != 27; user_input = cv::waitKey(20)) 
     { 
      webCam >> cam_frame; //Read a frame from webcam 

      cam_frame |= drawing_canvas; //Merge with actual drawing canvas or drawing pad, try different operation to merge incase you want different effect or solid effect 
      cv::imshow(win_name, cam_frame); //Display the image to user 

      //! Change size of pointer using keyboard +/-, don't they sound fun ;) 
      if (user_input == '+' && pointer_size < 25) 
      { 
       pointer_size++; 
      } 
      else if (user_input == '-' && pointer_size > 1) 
      { 
       pointer_size--; 
      } 
     } 
    } 

    //! Our function that should be registered in main to opencv Mouse Event Callback 
    static void onMouseCallback(int event, int x, int y, int flags, void* userdata) 
    { 
     /* NOTE: As it will be registered as mouse callback function, so this function will be called if anything happens with mouse 
     *   event : mouse button event 
     *   x, y : position of mouse-pointer relative to the window 
     *   flags : current status of mouse button ie if left/right/middle button is down 
     *   userdata: pointer o any data that can be supplied at time of setting callback, 
     *      we are using here to tell this static function about the this/object pointer at which it should operate 
     */ 

     WebCamPaint *object = (WebCamPaint*)userdata; 

     object->last_pointer = object->current_pointer; 
     object->current_pointer = cv::Point(x, y); 

     //! Drawing a line on drawing canvas if left button is down 
     if (event == 1 || flags == 1) 
     { 
      cv::line(object->drawing_canvas, object->last_pointer, object->current_pointer, object->paint_color, object->pointer_size); 
     } 

     //! Drawing a line on drawing canvas if right button is down 
     if (event == 2 || flags == 2) 
     { 
      cv::line(object->drawing_canvas, object->last_pointer, object->current_pointer, object->erase_color, object->pointer_size); 
     } 
    } 

}; 


int main(int argc, char *argv[]) 
{ 
    WebCamPaint myCam; 
    myCam.cam_id = 1; 
    myCam.init(); 
    cv::setMouseCallback(myCam.win_name, WebCamPaint::onMouseCallback, &myCam); 
    myCam.startAcivity(); 

    return 0; 
} 
+0

: - 고마워요. 정말 감사. 너는 나를 많이 도왔다. 다시 한번 감사드립니다. Bdw는 C++을 사용하여 Opencv 용 책을 추천 해 주시길 바랍니다. 그래서 몇 가지 복잡한 프로그램을 배울 수 있습니다. 저는 신입생이기 때문에 기본적으로 자기 학습자입니다. 그래서 개념을 명확하게 설명하는 책이 필요합니다. 다시 한 번 감사드립니다 – Rebecca

+0

도움이 된 것을 기쁘게 생각합니다. 이 코드를 이해하고 배웠다고 가정합니다. OpenCV는 더 많은 연구를 통해 놀라운 라이브러리와 훌륭한 리소스를 제공합니다. 당신이 단지 구글이라면 많은 책, 코드 등을 찾을 수있을 것입니다. 공식 문서에서 시작하는 것이 좋습니다 : http://opencv.org/documentation.html. 이 페이지는 모든 code-doc 및 ref, 서적, 자습서 등에 대한 링크가 있습니다. 당신은 oreilly 책과 함께 갈 수있다, 그것은 곧 새로운 판을 발매 할 예정이다. 그것이 도움이된다면, 당신은이 대답을 upvote/accept 수 있습니다, 그것은 다른 독자가 대답의 등급을 볼 수 있습니다. –

관련 문제