如何在c ++中使用自定义形状的光标检测图像上的鼠标单击位置

时间:2015-12-10 05:47:33

标签: c++ windows windows-forms-designer custom-component

在我的问题中,有一个图像,我需要让用户选择该图像中的某个特定位置。为此,我需要用光标提供方形(由我自己定制的宽度和高度)。然后用户只想将其放在给定图像的位置并单击。然后我想拿那些位置。任何有这种经历的人都可以用c ++窗体中的示例代码向我指导。

2 个答案:

答案 0 :(得分:2)

这是解决此问题的理想方法。参考这个来源

#include "stdafx.h"
#include "test.h"

#include <stdlib.h>
#include <stdio.h>
#include <math.h>
#include <string.h>
#include <cv.h>
#include <highgui.h>

IplImage* frame, *img1;
CvPoint point;
int drag = 0;
CvCapture *capture = 0;
int key = 0;
CvRect rect;

void mouseHandler(int event, int x, int y, int flags, void* param)
{
    /* user press left button */
    if (event == CV_EVENT_LBUTTONDOWN && !drag)
    {
        point = cvPoint(x, y);
        drag = 1;
    }
    /* user drag the mouse */
    if (event == CV_EVENT_MOUSEMOVE && drag)
    {
        img1 = cvCloneImage(frame);
        cvRectangle(img1, point, cvPoint(x, y), CV_RGB(255, 0, 0), 1, 8, 0);
        cvShowImage("result", img1);
    }
    /* user release left button */
    if (event == CV_EVENT_LBUTTONUP && drag)
    {
        rect = cvRect(point.x, point.y, x - point.x, y - point.y);
        cvSetImageROI(frame, rect);
        cvShowImage("result", frame);
        drag = 0;
    }

    /* user click right button: reset all */
    if (event == CV_EVENT_RBUTTONUP)
    {
        drag = 0;
    }
}

int main(int argc, char *argv[])
{
    capture = cvCaptureFromCAM(0);
    if (!capture)
    {
        printf("Cannot open initialize webcam!\n");
        exit(0);
    }

    /* create a window for the video */
    cvNamedWindow("result", CV_WINDOW_AUTOSIZE);

    while (key != 'q')
    {
        frame = cvQueryFrame(capture);
        if (rect.width>0)
            cvSetImageROI(frame, rect);
        cvSetMouseCallback("result", mouseHandler, NULL);
        key = cvWaitKey(10);
        if ((char)key == 'r') { rect = cvRect(0, 0, 0, 0); cvResetImageROI(frame); }
        cvShowImage("result", frame);
    }
    cvDestroyWindow("result");
    cvReleaseImage(&img1);
    return 0;
}

答案 1 :(得分:0)

我建议使用VTK工具包,因为它有光标位置,但要确保你的图像左上角有VTK(世界坐标系统)(0,0),或者如果你不想定位图像那样你就需要保持偏移量并在你获得鼠标位置时使用这个偏移量来加/减。首先,您可以参考以下链接,了解VTK光标位置代码的工作原理:

http://www.vtk.org/Wiki/VTK/Examples/Cxx/Interaction/ClickWorldCoordinates