Utilisez [] événements de souris OpenCV OpenCV

Utilisez la souris

Fonction souris personnalisée


void cv::setMouseCallback	(	
	const String & 	winname,
	MouseCallback 	onMouse,
	void * 	userdata = 0 )

La définition de la fonction contient trois paramètres, à savoir la fonction de la souris lorsqu'il est placé dans la fenêtre à laquelle l'événement de souris a eu lieu que la fonction de rappel est appelée, et quelles valeurs transmises à la fonction de rappel.

fonction de rappel définie

La fonction de rappel doit satisfaire la structure suivante

void MouseCallback(
	int event,
	int x,
	int y,
	int flag,
	void *userdata
	)

Événement premier paramètre, est une variable de type int, en particulier pour recevoir le type d'événement de souris reçu qui, brièvement quelques exemples où

Les noms de variables sens
EVENT_MOUSEMOVE mouvement de la souris
EVENT_LBUTTONDOWN Appuyez sur le bouton gauche de la souris
EVENT_RBUTTONDOWN Appuyez sur le bouton droit de la souris
EVENT_LBUTTONUP Relâchez le bouton gauche de la souris
EVENT_RBUTTONUP Droit sortie

Les deuxième et troisième paramètres pour recevoir les coordonnées de la position de la souris, cette position est une image compagnon, non coordonnées de la fenêtre du
quatrième indicateur de paramètre, ce qui signifie l'événement est tout à fait les mêmes paramètres, indique que la souris vers le bas événement terminé, changement et la clé de contrôle comme est pressée.

Des exemples particuliers

Cet exemple est une référence à « l'entrée de programmation Opencv3 » Écrivez (page P79)

Le principe de fonctionnement est le programme suivant, lorsque le bouton de la souris est enfoncé alors que le début du dessin, lorsque le bouton gauche de la souris pour mettre fin à la libération en tirant, la souris mouvement longueur et la largeur de décalage de l'image. srcImage image en tant que feuille de fond, la longueur du côté du rectangle tracé ci-dessus est décalé vers le bas à la souris connues. Et l'image tempImage est un montant intermédiaire, tiré du bouton gauche de la souris enfoncé pour libérer le bouton de la souris tous les rectangles dans ce processus. Cependant, selon le livre de programme, dessiner des images de longueur de côté négatif srcImage de temps pour faire une correction, mais cette étape n'a pas été fait sur tempImage.

Mais je ne ai pas besoin de trouver les coordonnées de la re-conversion rect rectangle, la largeur et la hauteur sont négatives, il peut encore être un dessin normal.

#include<opencv2/opencv.hpp>
using namespace cv;

//程序说明:实现功能为鼠标按下后可以拖动进行绘制矩形框

bool g_value = false;//全局变量,用来判断什么时候开始画矩形框
Rect g_rect(-1,-1,0,0);//用来绘图的矩阵


void DrawRectangle(Mat& m, Rect r) //用来绘制矩形的函数
{
	Scalar s(255, 0, 255);//相当于定义三通道的颜色,三通道分别是255,0,255
	rectangle(m, g_rect, s);//用定义的颜色s,在图像m中绘制矩形g_rect
}
void MouseCallBack(int event,int x,int y,int flags,void* param)//回调函数
{
	Mat m = *(Mat*)param;
	switch (event)
	{
	case(EVENT_MOUSEMOVE):
		if (g_value)//如果鼠标左键按下,g_value变为真,运行进行绘图,绘图矩阵记录鼠标移动的距离,作为宽和高
		{
			g_rect.width = x - g_rect.x;
			g_rect.height = y - g_rect.y;
		}
		break;

	case(EVENT_LBUTTONDOWN):  //鼠标左键按下的时候,给矩阵重新定义初始位置
		g_value = true;
		g_rect = Rect(x, y, 0, 0);
		break;
	case(EVENT_LBUTTONUP): //鼠标左键放开的时候,把矩形画入srcImage。
		g_value = false;
		DrawRectangle(m, g_rect);
		
		
		break;

	}
}

int main()
{

	Mat srcImage, tempImage;  //两个用来存放图片的变量,在绘图中srcImage绘制最后的图片,tempImage绘制绘制中间过程的图片
	srcImage = imread("1.jpg");
	srcImage.copyTo(tempImage);
	namedWindow("a", WINDOW_AUTOSIZE);
	setMouseCallback("a", MouseCallBack, (void*)&srcImage); //鼠标函数

		while(1)
		{
			srcImage.copyTo(tempImage);
			if (g_value)
			{
				DrawRectangle(tempImage, g_rect); //这句话实际上是在记录整个鼠标的移动过程
			}
			imshow("a", tempImage);
			if (waitKey(10) == 27)break;//按ESC键退出
		}



	return 0;
}


Les résultats d'exploitation sont les suivants:

Insérer ici l'image Description

Publié 14 articles originaux · louange gagné 1 · vues 505

Je suppose que tu aimes

Origine blog.csdn.net/qq_41741344/article/details/104334662
conseillé
Classement