感谢
基于C++的OpenCV项目实战——零部件的自动光学检测_opencv 滤波增强 零件测量-CSDN博客和
基于opencv的c++图像处理(图像二值化)_opencv c++ 二值化-CSDN博客
代码实现
main函数
#include<opencv2/opencv.hpp>
#include<iostream>
#include<string>
#include "Display.h"
#include "Blur.h"
using namespace cv;
using namespace std;
// 使用智能指针
shared_ptr<Display> multi_window;
int main(int argc, char** argv)
{
//图片和背景图
String total_path = "./resource/原图.jpeg";
String background_path = "./resource/背景图.jpg";
Mat image = imread(total_path);
Mat backgroud_image = imread(background_path);
//图片去噪处理
Mat image_denoising = image.clone();
Mat backgroud = backgroud_image.clone();
Blur br;
image_denoising = br.smooth_image(image);
backgroud = br.smooth_image(backgroud_image);
//去除背景
Mat image_no_backgroud = br.remove_background_minus(image_denoising, backgroud);
//连通域检测
Mat image_connection_check = br.connection_check(image_no_backgroud);
// 边缘检测
Mat image_contour = br.get_contour(image_no_backgroud);
//展示
multi_window = make_shared<Display>("Review for all", 3, 2, WINDOW_NORMAL);
multi_window->add_window("image", image);
multi_window->add_window("denoise", image_denoising);
multi_window->add_window("bg", backgroud);
multi_window->add_window("remove bg", image_no_backgroud);
multi_window->add_window("segment", image_connection_check);
multi_window->add_window("contour", image_contour);
// 保存结果
imwrite("./result/结果展示.png", multi_window->canvas);
waitKey(0);
return 0;
}
构建多窗口展示Display类
Display.cpp文件
#include "Display.h"
//初始化窗口
Display::Display(String t, int c, int r, int flags) :title(t), cols(c), rows(r) {
height = 1080;
width = 1920;
namedWindow(title, flags);
canvas = Mat(heigh