Как я могу получить позицию и нарисовать прямоугольник с помощью opencv?

Я хочу получить позицию при перемещении и щелчке мышью в окне изображения. Я хочу создать прямоугольник в окне изображения, когда и где щелкают мышью.

У меня есть простой код из документа

#include "stdafx.h"
#include "opencv2/highgui/highgui.hpp"
#include <iostream>

using namespace std;
using namespace cv;
 
void CallBackFunc(int event, int x, int y, int flags, void* userdata)
{
    if ( event == EVENT_LBUTTONDOWN )
    {
        cout << "Left button of the mouse is clicked - position (" << x << ", " << y << ")" << endl;    
    }
    else if( event == EVENT_RBUTTONDOWN )
    {
        cout << "Right button of the mouse is clicked - position (" << x << ", " << y << ")" << endl;
    }
    else if( event == EVENT_MBUTTONDOWN )
    {
        cout << "Middle button of the mouse is clicked - position (" << x << ", " << y << ")" << endl;
    }
    else if ( event == EVENT_MOUSEMOVE )
    {
        cout << "Mouse move over the window - position (" << x << ", " << y << ")" << endl;
    }
}

int main(int argc, char** argv)
{
    bool isDragging = false;

    // Read image from file 
    Mat img = imread("input/pic1.jpg");

    //if fail to read the image
    if( img.empty() ) 
    { 
        cout << "Error loading the image" << endl;
        return -1; 
    }

    //Create a window
    namedWindow("My Window", 1);

    //set the callback function for any mouse event
    setMouseCallback("My Window", CallBackFunc, NULL);

    //show the image
    imshow("My Window", img);

    // Wait until user press some key
    waitKey(0);

    return 0;
}

Он работает с формой Windows =, но я хочу использовать щелчки мыши. Я помещаю код в графический интерфейс. Выдает следующую ошибку:

Ошибка 3 ошибка C3867: 'ProjectFinal::MyForm::CallBackFunc': в вызове функции отсутствует список аргументов; используйте '&ProjectFinal::MyForm::CallBackFunc' для создания указателя на элемент c:\users\nungningz\documents\visual studio 2012\projects\projectfinal\projectfinal\MyForm.h 690 1 ProjectFinal

Ошибка 6, ошибка C3867: «ProjectFinal::MyForm::CallBackFunc»: в вызове функции отсутствует список аргументов; используйте '&ProjectFinal::MyForm::CallBackFunc' для создания указателя на элемент c:\users\nungningz\documents\visual studio 2012\projects\projectfinal\projectfinal\MyForm.h 690 1 ProjectFinal

7 IntelliSense: указатель на член недействителен для управляемого класса c:\Users\NungNingZ\Documents\Visual Studio 2012\Projects\ProjectFinal\ProjectFinal\MyForm.h 690 37 ProjectFinal


person Nungning    schedule 12.07.2015    source источник
comment
Ваш код отлично работает для меня. Похоже, что код, который вы разместили, не соответствует опубликованным вами ошибкам. Код, который вы разместили, компилируется и работает нормально для меня. Пожалуйста, опубликуйте фактический код, который показывает эти ошибки.   -  person Ove    schedule 12.07.2015
comment
код в теме мне тоже подходит, но подходит для windowsForms. Обычно я тестирую и разрабатываю простой код с windowsForm перед использованием. когда я применяю код к проекту с помощью Gui, возникает проблема. который должен быть нажат параметром в setMouseCallback(My Window, CallBackFunc, NULL); Я не могу решить проблему. помогите мне пожалуйста   -  person Nungning    schedule 13.07.2015


Ответы (2)


Итак, у вас есть проблема, не связанная с вашим вопросом.

Однако вы можете достичь своей цели, используя только средства OpenCV highgui:

#include <opencv2\opencv.hpp>
#include <iostream>

using namespace std;
using namespace cv;

vector<Rect> rects;
bool bDraw;
Rect r;
Point base;

Mat3b img;
Mat3b layer;
Mat3b working;


void CallBackFunc(int event, int x, int y, int flags, void* userdata)
{
    if ( event == EVENT_LBUTTONDOWN )
    {
        cout << "Left button of the mouse is clicked - position (" << x << ", " << y << ")" << endl;    

        // Init your rect
        base.x = x;
        base.y = y;
        r.x = x;
        r.y = y;
        r.width = 0;
        r.height = 0;
        bDraw = true;
    }        
    else if ( event == EVENT_MOUSEMOVE )
    {
        cout << "Mouse move over the window - position (" << x << ", " << y << ")" << endl;

        // If drawing, update rect width and height
        if(!bDraw) return;

        int dx = abs(r.x - x);
        int dy = abs(r.y - y);

        if(x < base.x) {
            r.x = x;
            r.width = abs(x - base.x);
        } else {
            r.width = dx;
        }

        if(y < base.y) {
            r.y = y;
            r.height = abs(y - base.y);
        } else {
            r.height = dy;
        }

        // Refresh
        working = layer.clone();
        rectangle(working, r, Scalar(0,255,0));
        imshow("My Window", working);
    }
    else if ( event == EVENT_LBUTTONUP)
    {
        cout << "Left button released" << endl;

        // Save rect, draw it on layer
        rects.push_back(r);
        rectangle(layer, r, Scalar(0,255,255));

        r = Rect(); 
        bDraw = false;

        // Refresh
        working = layer.clone();
        rectangle(working, r, Scalar(0,255,0));
        imshow("My Window", working);
    }
}

int main(int argc, char** argv)
{
    bool bDraw = false;
    bool isDragging = false;

    // Read image from file 
    img = imread("path_to_image");

    // initialize your temp images
    layer = img.clone();
    working = img.clone();

    //if fail to read the image
    if( img.empty() ) 
    { 
        cout << "Error loading the image" << endl;
        return -1; 
    }

    //Create a window
    namedWindow("My Window", 1);

    //set the callback function for any mouse event
    setMouseCallback("My Window", CallBackFunc, NULL);

    //show the image
    imshow("My Window", working);

    // Wait until user presses 'q'
    while((waitKey(1) & 0xFF) != 'q');

    return 0;
}
person Miki    schedule 13.07.2015
comment
спасибо старший код .it, работающий над простой формой окна, найдите, но нажмите его в графическом интерфейсе, это не нормально, и есть ошибка - person Nungning; 13.07.2015
comment
Это ответ на ваш вопрос, который не касается форм. У вас, вероятно, есть проблемы, связанные с используемым графическим интерфейсом, и вам, вероятно, лучше задать новый вопрос специально для этого (на этот раз с фактическим кодом) - person Miki; 13.07.2015