文章目录

一、Trackbar 可视化调整亮度

头文件 ​​quick_opencv.h​​:用于声明类与公共函数

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

class QuickDemo {
public:
void track_bar_Demo(Mat& image);
void keys_Demo(Mat& image);
};

源文件 ​​quick_demo.cpp​​:实现类与公共函数

Mat src, dst, m;
int lightness = 50;

static void on_track(int, void*) {
m = Scalar(lightness, lightness, lightness);
add(src, m, dst);
imshow("亮度调整", dst);
}

// 新增实现方法
void QuickDemo::track_bar_Demo(Mat& image) {
namedWindow("亮度调整", WINDOW_AUTOSIZE);
dst = Mat::zeros(image.size(), image.type());
m = Mat::zeros(image.size(), image.type());

src = image;
int max_value = 100;
createTrackbar("Value Bar","亮度调整", &lightness,max_value, on_track);
on_track(50, 0);
}

OpenCV + CPP 系列(五)Trackbar 与键盘_源文件


添加:亮度与对比度调整 两个调节按钮

源文件 ​​quick_demo.cpp​​:实现类与公共函数

static void on_constrast(int b, void* userdata) {
Mat image = *((Mat*)userdata);
Mat dst = Mat::zeros(image.size(), image.type());
Mat m = Mat::zeros(image.size(), image.type());
double contrast = b / 100.0;
addWeighted(image, contrast, m, 0.0, 0, dst);
imshow("亮度与对比度调整", dst);
}

static void on_lightness(int gamma, void* userdata) {
Mat image = *((Mat*)userdata); // 引用转 mat类型指针,再解引用
Mat dst = Mat::zeros(image.size(), image.type());
Mat m = Mat::zeros(image.size(), image.type());
addWeighted(image, 1.0, m, 0, gamma, dst);
imshow("亮度与对比度调整", dst);
}

void QuickDemo::track_bar_Demo(Mat& image) {
namedWindow("亮度与对比度调整", WINDOW_AUTOSIZE);
int lightness = 50;
int max_light = 100;
int constrast = 100;
int max_constrast = 200;
createTrackbar("Value Bar", "亮度与对比度调整", &lightness, max_light, on_lightness,(void*)(&image));
createTrackbar("Contrast Bar", "亮度与对比度调整", &constrast, max_constrast, on_constrast,(void*)(&image));
on_lightness(50, &image);
}

OpenCV + CPP 系列(五)Trackbar 与键盘_头文件_02

模板匹配:Trackbar (不使用全局变量)

单文件,无头文件示例:

说明:如下示例拆分为头文件,主函数文件,方法实现文件时,实现trackbar遇到问题了,每次移动trackbar出现闪退,并没有解决 ​​(如:直方图反向投影)​​, 故如下示例使用单一文件。

#include <opencv2/opencv.hpp>
#include <iostream>

using namespace cv;
using namespace std;


class Match_Info {
public:
Mat img;
Mat templ;
const char* image_window;
const char* result_window;
};



/// 函数声明
void MatchingMethod(int match_method, void* p_MatchInfo);


/** @主函数 */
int main(int argc, char** argv)
{
/// 载入原图像和模板块
Mat img = imread("D:\\Desktop\\nangua.png", 1);
Mat templ = imread("D:\\Desktop\\nangua_.png", 1);
namedWindow("templ", WINDOW_NORMAL);
imshow("img", img);
imshow("templ", templ);


const char* image_window = "Source Image";
const char* result_window = "Result window";

Match_Info match_info;
match_info.img = img;
match_info.templ = templ;
match_info.image_window = image_window;
match_info.result_window = result_window;

int match_method = 0;
int max_Trackbar = 5;


/// 创建窗口
namedWindow(image_window, WINDOW_AUTOSIZE);
namedWindow(result_window, WINDOW_AUTOSIZE);

/// 创建滑动条
const char* trackbar_label = "Method: \n 0: SQDIFF \n 1: SQDIFF NORMED \n 2: TM CCORR \n 3: TM CCORR NORMED \n 4: TM COEFF \n 5: TM COEFF NORMED";
createTrackbar(trackbar_label, image_window, &match_method, max_Trackbar, MatchingMethod, (void*)(&match_info));

MatchingMethod(match_method, &match_info);

waitKey(0);
destroyAllWindows();
return 0;
}

/**
* @函数 MatchingMethod
* @简单的滑动条回调函数
*/
void MatchingMethod(int match_method, void* p_MatchInfo)
{
/// 将被显示的原图像
Mat img_display;
Match_Info match_info = *((Match_Info*)p_MatchInfo);
Mat img = match_info.img;
Mat templ = match_info.templ;
const char* image_window = match_info.image_window;
const char* result_window = match_info.result_window;

match_info.img.copyTo(img_display);

/// 创建输出结果的矩阵
int result_cols = img.cols - templ.cols + 1;
int result_rows = img.rows - templ.rows + 1;

Mat result = Mat::zeros(result_cols, result_rows, CV_32FC1);

/// 进行匹配和标准化
matchTemplate(img, templ, result, match_method);
normalize(result, result, 0, 1, NORM_MINMAX, -1, Mat());

/// 通过函数 minMaxLoc 定位最匹配的位置
double minVal; double maxVal; Point minLoc; Point maxLoc;
Point matchLoc;

minMaxLoc(result, &minVal, &maxVal, &minLoc, &maxLoc, Mat());

/// 对于方法 SQDIFF 和 SQDIFF_NORMED, 越小的数值代表更高的匹配结果. 而对于其他方法, 数值越大匹配越好
if (match_method == TM_SQDIFF || match_method == TM_SQDIFF_NORMED){
matchLoc = minLoc;
}else{
matchLoc = maxLoc;
}

rectangle(img_display, matchLoc, Point(matchLoc.x + templ.cols, matchLoc.y + templ.rows), Scalar::all(0), 2, 8, 0);
rectangle(result, matchLoc, Point(matchLoc.x + templ.cols, matchLoc.y + templ.rows), Scalar::all(0), 2, 8, 0);

imshow(image_window, img_display);
imshow(result_window, result);
return;
}

OpenCV + CPP 系列(五)Trackbar 与键盘_源文件_03

二、键盘响应

源文件 ​​quick_demo.cpp​​:实现类与公共函数

void QuickDemo::keys_Demo(Mat& image) {
Mat dst = Mat::zeros(image.size(),image.type());
while (true) {
int c = waitKey(200);
if (c == 27) {
break;
}
if (c == 49) {
std::cout << "you enter key #" << c << std::endl;
cvtColor(image, dst, COLOR_BGR2GRAY);
}
if (c == 50) {
std::cout << "you enter key #" << c << std::endl;
cvtColor(image, dst, COLOR_BGR2HSV);
}
if (c == 51) {
std::cout << "you enter key #" << c << std::endl;
add(image, Scalar(30, 30, 30), dst);
}
imshow("键盘响应",dst);
}
}

OpenCV + CPP 系列(五)Trackbar 与键盘_scala_04