基础功能类封装
#pragma once#include <opencv2/opencv.hpp>
#include <functional>#define SHOW_FOREVER 0#define SHOW_WINDOW(title, image)\cv::namedWindow(title, cv::WINDOW_AUTOSIZE);\cv::imshow(title, image);class Base_function_image
{
public:static Base_function_image* Instance();~Base_function_image();bool load_image(const char* pImage_path, cv::Mat& image);bool save_image(const char* pImage_path, cv::Mat& image);void show_image(const char* pTitle, cv::Mat& image, int delay_ms);void show_image_with_func(const char* pImage_path, const char* pTitle, cv::MouseCallback func);private:Base_function_image();
};#define BASE_FUNC Base_function_image::Instance()
#include "base_function_image.h"
#include <future>namespace{
#define IS_NULLPTR(ptr, result)\if(!ptr){return result;}
}Base_function_image* Base_function_image::Instance()
{static Base_function_image instance;return &instance;
}Base_function_image::Base_function_image(){}Base_function_image::~Base_function_image(){}bool Base_function_image::load_image(const char* pImage_path, cv::Mat& image)
{IS_NULLPTR(pImage_path, false);std::cout<<"[Base_function_image::load_image] pImage_path:"<<pImage_path<<std::endl;image = cv::imread(pImage_path, cv::IMREAD_COLOR);if (image.empty()) {std::cerr << "无法打开或找到图片: " << pImage_path << std::endl;return false;}return true;
}bool Base_function_image::save_image(const char* pImage_path, cv::Mat& image)
{IS_NULLPTR(pImage_path, false);std::cout<<"[Base_function_image::save_image] pImage_path:"<<pImage_path<<std::endl;cv::imwrite(pImage_path, image);return true;
}void Base_function_image::show_image(const char* pTitle, cv::Mat& image, int delay_ms)
{IS_NULLPTR(pTitle, ;);std::cout<<"[Base_function_image::show_image] pTitle:"<<pTitle<<std::endl;cv::namedWindow(pTitle, cv::WINDOW_AUTOSIZE);cv::imshow(pTitle, image);cv::waitKey(delay_ms);
}void Base_function_image::show_image_with_func(const char *pImage_path, const char *pTitle, cv::MouseCallback func)
{IS_NULLPTR(pTitle, ;);IS_NULLPTR(pImage_path, ;);cv::Mat image;load_image(pImage_path, image);cv::namedWindow(pTitle);cv::setMouseCallback(pTitle, func, &image);char key = 0;for(cv::imshow(pTitle, image); 27 != key;)key = cv::waitKey(10);
}
原始图片
鼠标事件
#include "base_function_image.h"
#include <iostream>#define IMAGE_1 "1.jpeg"void onMouse(int event, int x, int y, int flags, void* userdata)
{if (cv::EVENT_LBUTTONDOWN == event) { std::cout << "左键点击位置: (" << x << ", " << y << ")" << std::endl;}
}int main()
{BASE_FUNC->show_image_with_func(IMAGE_1, "test", onMouse);return 0;
}
绘制
#include "base_function_image.h"
#include <iostream>#define IMAGE_1 "1.jpeg"int main()
{cv::Mat image;BASE_FUNC->load_image(IMAGE_1, image);cv::circle(image, cv::Point(122, 476), 65, // radius 0, // color3); // thicknesscv::putText(image, "hello world", cv::Point(40,200),cv::FONT_HERSHEY_PLAIN, // font type2.0, // font scale255, // text color2); // text thicknessBASE_FUNC->save_image("write1.jpeg", image);return 0;
}
翻转
#include "base_function_image.h"
#include <iostream>#define IMAGE_1 "1.jpeg"int main()
{auto flip_image =[&](const char* pSrc_img, const char* pNew_name, int flipCode){cv::Mat image_src;if(!BASE_FUNC->load_image(pSrc_img, image_src))return;cv::Mat image_res;cv::flip(image_src, image_res, flipCode);BASE_FUNC->show_image(pNew_name, image_res, SHOW_FOREVER);};flip_image(IMAGE_1, "code_1", 1);flip_image(IMAGE_1, "code_2", 2);flip_image(IMAGE_1, "code_0", 0);flip_image(IMAGE_1, "code_-1", -1);return 0;
}