如何在 C++ 中使用自定义形状的光标检测图像上的鼠标单击位置
How to detect mouse clicked location on an image with custom shaped cursor in c++
在我的问题中,有一张图片,我需要向用户提供 select 该图片内的某个特定位置。为此,我需要提供一个带有光标的方形(由我自己定制的宽度和高度)。然后用户只想将其放在给定图像的位置并单击。然后我想占据那个位置。任何有这种经验的人都可以用 c++ windows 形式的示例代码指导我。
我建议使用 VTK 工具包,因为它具有光标位置,但请确保您的图像左上角位于 VTK(世界坐标系)的 (0,0) 位置,或者如果您不想以这种方式定位图像然后您需要保持偏移量并在获得鼠标位置时将此偏移量用于add/subtract。一开始你可以参考下面link VTK光标位置代码的工作原理:
http://www.vtk.org/Wiki/VTK/Examples/Cxx/Interaction/ClickWorldCoordinates
这是解决这个问题的理想方式。参考这个来源
#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;
}
在我的问题中,有一张图片,我需要向用户提供 select 该图片内的某个特定位置。为此,我需要提供一个带有光标的方形(由我自己定制的宽度和高度)。然后用户只想将其放在给定图像的位置并单击。然后我想占据那个位置。任何有这种经验的人都可以用 c++ windows 形式的示例代码指导我。
我建议使用 VTK 工具包,因为它具有光标位置,但请确保您的图像左上角位于 VTK(世界坐标系)的 (0,0) 位置,或者如果您不想以这种方式定位图像然后您需要保持偏移量并在获得鼠标位置时将此偏移量用于add/subtract。一开始你可以参考下面link VTK光标位置代码的工作原理:
http://www.vtk.org/Wiki/VTK/Examples/Cxx/Interaction/ClickWorldCoordinates
这是解决这个问题的理想方式。参考这个来源
#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;
}