// ConsoleApplication1.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//
#include <opencv2/core.hpp>
#include <opencv2/imgcodecs.hpp>
#include <opencv2/highgui.hpp>
#include <opencv2/imgproc.hpp>
#include <iostream>
using namespace cv;
using namespace std;
void onMouse(int event, int x, int y, int flags, void* imgTmp);
void onChange(int pos, void* userdata);
void mouseTest() {
Mat img(500, 500, CV_8UC3, Scalar(0, 0, 0));
namedWindow("Mouse", CV_WINDOW_AUTOSIZE);
setMouseCallback("Mouse", onMouse, &img); // 设置鼠标相关的回调函 数
imshow("Mouse", img);
waitKey(0);
}
void trackBar() {
// 0表示灰度图
int value = 25;
Mat src = imread("..\\..\\bin\\123.jpg", 0);
if (src.empty() == true) {
cout << "图片读取失败" << endl;
return ;
}
namedWindow("TrackBar", CV_WINDOW_AUTOSIZE);
createTrackbar("Threshold", "TrackBar", &value, 255, onChange, &src);
waitKey(0);
}
void onMouse(int event, int x, int y, int flags, void* imgTmp) {
Mat* img = (Mat*)imgTmp;
// 实现鼠标点击画圆
if (event == CV_EVENT_LBUTTONDOWN) {// 鼠标左键按下
cout << "onMouse" << endl;
circle(*img, Point(x, y), 80, Scalar(255, 255, 0), 2, 8);
imshow("Mouse", *img); // 这个imshow一定要调用,因为上面的circle函数仅仅是在img上画了,但是没有显示出来,需要手动显示,也可以在主函数中while调用imshow
}
}
void onChange(int pos, void * userdata){
Mat* img = (Mat*)userdata;
Mat dst;
// 滑动的时候做二值化处理
threshold(*img, dst, getTrackbarPos("Threshold", "TrackBar"), 255, THRESH_BINARY);
imshow("TrackBar", dst);
}
int main()
{
// mouseTest();
trackBar();
return 0;
}