鼠标事件
#include<opencv2/opencv.hpp>
#include<iostream>
using namespace cv;
using namespace std;
/*
Mat img(500, 500, CV_8UC3, Scalar(255, 255, 255));//定义全局变量
void OnMouse(int event, int x, int y, int flags, void* param) {
if (event == CV_EVENT_LBUTTONDOWN)//如果鼠标按下
{
cout << "mouse down" << endl;//控制台输出
circle(img, Point(x, y), 80, Scalar(255, 255, 0), 2, 8);//在img上画圆
}
}
void main() {
namedWindow("mouse", CV_WINDOW_AUTOSIZE);
setMouseCallback("mouse", OnMouse, 0);
while (1) {
imshow("mouse", img);
if (27 == waitKey(10))//每隔10ms检测按时是否按下
break;
}
}
*/
/*将Mat img设置为指针传入
Point pt;
void OnMouse(int event, int x, int y, int flag, void* param) {
Mat img = *(Mat*)param;//将param强制转换为Mat指针,*(Mat*)=Mat, 类比*(int*)= int一样
switch (event)
{
case CV_EVENT_LBUTTONDOWN: //鼠标左键按下时
pt.x = x;
pt.y = y;
break;
case CV_EVENT_LBUTTONUP: //鼠标左键抬起时
rectangle(img, pt, Point(x, y), Scalar(0, 255, 0), 2, 8);
break;
default:
break;
}
}
void main()
{
Mat img(500, 500, CV_8UC3, Scalar(255, 255, 255));
namedWindow("mouse", CV_WINDOW_AUTOSIZE);
setMouseCallback("mouse", OnMouse, &img);//传入img地址这样就不必将img设置为全局变量
while (1) {
imshow("mouse", img);
if (27 == waitKey(10))
break;
}
}
滑条操作
Mat dst;
int value = 20;
void onChange(int, void* param) {
Mat src = *(Mat*)param;
threshold(src, dst, value, 255, THRESH_BINARY);//二值化
imshow("TrackBar", dst);
}
void main() {
Mat src = imread("../source/1.jpg", 0);//读入灰度图像
namedWindow("TrackBar", CV_WINDOW_AUTOSIZE);
createTrackbar("Threshold", "TrackBar", &value, 255, onChange, &src);
threshold(src, dst, value, 255, THRESH_BINARY);
imshow("TrackBar", dst);
waitKey(0);
}