搭建网站要多少钱,龙岩融胤网络科技有限公司,珠海市网站,做网站需要网站负责人前言
最近开始做这个裂缝识别的任务了#xff0c;大大小小的问题我已经摸得差不多了#xff0c;然后关于识别任务和分割任务我现在也弄的差不多了。
现在开始做正式的业务#xff0c;也就是我们说的裂缝识别的任务。作为前言#xff0c;先来说说场景#xff1a;
现在相…前言
最近开始做这个裂缝识别的任务了大大小小的问题我已经摸得差不多了然后关于识别任务和分割任务我现在也弄的差不多了。
现在开始做正式的业务也就是我们说的裂缝识别的任务。作为前言先来说说场景
现在相机返回过来的照片
都是jpeg格式的照片当然也可能是别的格式目前主流是jpeg格式大小约为11mb-14mb左右图片大小为5120x5120
我们现在如果说想直接使用这个图片来进行图片识别的话会有很多的问题。其中最主要的问题就是图片实在是过大5120x5120的图片会导致图片不论是训练还是推理期都太长了并且为了更好地处理图片我们都会要求图片的训练期和推断图片都必须是比较小的这样才有利于我们后续不论是实例分割还是目标识别任务。
目标
前言说了我们的目标主要是两个那就是 将现有图片分割成1280 * 1280 的小块。 为什么这么做因为我们的图片边界刚好是51205120 / 4 1280也就是说我们要把原先一张照片切成 4 * 4 16块 将现有图片全部增亮 这里需要注意一点就是在增亮图片的同时不能让图片过曝。这里我们需要做一点特殊的处理下文中会说。
准备
既然有了目标那么我们就来一步步写实现。这里因为我们后续要使用opencv等各种库所以从现在开始我们所有的c项目统一使用cmake管理。
那么在正式开始之前我们需要准备opencv环境
这里可以参考以下文章 windows下安装Visual Studio CMakeOpenCV OpenCV contribTensorRT 有关cmake编译与安装opencv的内容我觉得是比较中肯的这里因为我已经安装好了opencv就不再重复这个内容了。
那么现在默认就是大伙已经安装上了opencv 了那么我这里就开始写图像分割和增强了。
首先使用vs 2022新建一个cmake项目 创建完毕后打开cmake gui程序 这里我使用vs 2022来编译和管理这个项目点击configure然后再点击gernerate这样一个空项目就被我编辑出来了就在我们的build目录下 点击Lev_PictureManager.sln进入项目管理。 当然了我这里开发的这个工程是需要以后去做移植的所以肯定是做成dll的这个有关图形的库后续我也会做一些更新相当于是一个自己的小工具箱所以为了更好的使用这里需要修改一下 cmake 工程
Lev_PictureManager的CMakeList.txt改成这样每一条为什么这么改我都写在了注释里面可以看看
# CMakeList.txt: Lev_PictureManager 的 CMake 项目在此处包括源代码并定义
# 项目特定的逻辑。
#
#如果环境变量中没有声明opencv的路径则需要加上这一条如果加上了则无所谓
set(OpenCV_DIR C:\\Program Files (x86)\\opencv\\build)
#找到opencv 的 package
find_package(OpenCV REQUIRED)
#引入opencv的头文件
include_directories(${OpenCV_INCLUDE_DIRS})
#导出windows下的.lib静态链接库用以链接符号
set(WINDOWS_EXPORT_ALL_SYMBOLS ON)
# 导出为动态链接库的形式
add_library (Lev_PictureManager SHARED Lev_PictureManager.cpp Lev_PictureManager.h)
#链接到opencv的.lib文件
target_link_libraries(${PROJECT_NAME} ${OpenCV_LIBRARIES})if (CMAKE_VERSION VERSION_GREATER 3.12)set_property(TARGET Lev_PictureManager PROPERTY CXX_STANDARD 20)
endif()# TODO: 如有需要请添加测试并安装目标。
接下来在项目中编译一下这个CMakeList.txt再尝试在头文件中引入
#include opencv2/opencv.hpp如果引入成功则说明调用是成功的接下来就可以进入正式的 编码阶段了
流程
我们之前说的有两个内容一个是切分图片一个是提升亮度
切分图片
切分图片的话主要是用到了opencv的Rect来对roi切分具体思路见下代码 std::vectorcv::Mat splitImage(const cv::Mat inputImage, int rows, int cols) {std::vectorcv::Mat subImages;int subImageWidth inputImage.cols / cols;int subImageHeight inputImage.rows / rows;for (int y 0; y rows; y) {for (int x 0; x cols; x) {// 定义矩形区域切分图像cv::Rect roi(x * subImageWidth, y * subImageHeight, subImageWidth, subImageHeight);// 获取子图像cv::Mat subImage inputImage(roi).clone();// 添加到结果集subImages.push_back(subImage);}}return subImages;}修改亮度 cv::Mat enhanceBrightnessImage(const cv::Mat image) {// 转换为YUV颜色空间cv::Mat imgYUV;cv::cvtColor(image, imgYUV, cv::COLOR_BGR2YUV);// 应用CLAHE到Y通道(YUV中的Y代表亮度)cv::Ptrcv::CLAHE clahe cv::createCLAHE(2.0, cv::Size(8, 8));clahe-apply(0, imgYUV); // 修正此行代码// 将结果转换回BGR格式cv::Mat imgOutput;cv::cvtColor(imgYUV, imgOutput, cv::COLOR_YUV2BGR);return imgOutput;}项目整体代码如下 头文件Lev_PictureManager.h
// Lev_PictureManager.h: 标准系统包含文件的包含文件
// 或项目特定的包含文件。#pragma once#include iostream
// TODO: 在此处引用程序需要的其他标头。
#include filesystem
#include opencv2/opencv.hppnamespace Lev_PictureManager {/// summary/// 判断文件后缀是否为支持的图片/// /summary/// param nameextension传入后缀支持输入.jpg .png .jpeg/param/// returns是否支持/returnsbool isImageFileExtend(const std::string extension);/// summary/// 缩放图片大小到指定大小/// /summary/// param nameinsertPath输入图片的绝对路径包括图片名称/param/// param nameoutputPath输出图片的绝对路径包括图片名称/param/// param nametar_width目标缩放宽度/param/// param nametar_height目标缩放高度/param/// returns成功与否/returnsbool ResizeSingleImage(const std::string insert_picture, const std::string output_path, int tar_width, int tar_height);/// summary/// 将指定图片路径输入导到指定目录中去/// /summary/// param nameinsert_picture输入图片路径/param/// param nameoutput_path输出分裂图片的路径/param/// param namerow指定切分行数/param/// param namecol指定切分列数/param/// param namesuffix后缀默认是_不同的图片会在指定后缀后加上row-col的后缀比如 test_1-12.jpeg/param/// returns是否切分成功/returnsbool TearPicture(const std::string insert_picture, const std::string output_path, int row, int col,const std::string suffix);/// summary/// 调整图片亮度到最佳/// /summary/// param nameinput_picture输入图片的路径/param/// param nameoutput_path图片输出路径/param/// returns/returnsbool adjustBrightness(const std::string input_picture, const std::string output_path);}Lev_PictureManager.cpp
// Lev_PictureManager.cpp: 定义应用程序的入口点。
//#include Lev_PictureManager.h
using namespace std;
namespace fs std::filesystem;
//使用命名空间是一种美德:D
namespace Lev_PictureManager {bool isImageFileExtend(const std::string extension){// 在这里添加你需要支持的图片格式的判断条件return extension .jpg || extension .png || extension .jpeg;}bool ResizeSingleImage(const std::string insertPath, const std::string outputPath, int tar_width, int tar_height) {cv::Mat originalImage cv::imread(cv::String(insertPath), cv::IMREAD_COLOR);cv::String outString cv::String(outputPath);if (originalImage.empty()) {std::cerr Failed to open image! std::endl;return false;}// 获取原始图像的宽高int originalWidth originalImage.cols;int originalHeight originalImage.rows;// 计算缩放比例double scaleWidth static_castdouble(tar_width) / originalWidth;double scaleHeight static_castdouble(tar_height) / originalHeight;// 使用 resize 函数进行缩放cv::Mat resizedImage;cv::resize(originalImage, resizedImage, cv::Size(), scaleWidth, scaleHeight, cv::INTER_LINEAR);// 保存压缩后的图像if (!cv::imwrite(outString, resizedImage)) return false;return true;}std::vectorcv::Mat splitImage(const cv::Mat inputImage, int rows, int cols) {std::vectorcv::Mat subImages;int subImageWidth inputImage.cols / cols;int subImageHeight inputImage.rows / rows;for (int y 0; y rows; y) {for (int x 0; x cols; x) {// 定义矩形区域切分图像cv::Rect roi(x * subImageWidth, y * subImageHeight, subImageWidth, subImageHeight);// 获取子图像cv::Mat subImage inputImage(roi).clone();// 添加到结果集subImages.push_back(subImage);}}return subImages;}bool TearPicture(const std::string insert_picture, const std::string output_path, int row, int col, const std::string suffix){//判断输入图片是否是支持的文件fs::path insertPath(insert_picture);if(!fs::is_regular_file(insertPath)) return false;if(!isImageFileExtend(insertPath.extension().string())) return false;//不带后缀的后缀名std::string insert_picture_name insertPath.stem().string();//将图片切分成vectorcv::Mat mat_insert cv::imread(insert_picture);std::vectorcv::Mat vec_ret splitImage(mat_insert, row, col);//将vector中的图片保存到指定路径for (int i 0; i row; i) {for (int j 0; j col; j) {std::string output_name output_path / insert_picture_name _ std::to_string(i) - std::to_string(j) . suffix;if (!cv::imwrite(output_name, vec_ret[i j])) return false;}}return true;}cv::Mat enhanceBrightnessImage(const cv::Mat image) {// 转换为YUV颜色空间cv::Mat imgYUV;cv::cvtColor(image, imgYUV, cv::COLOR_BGR2YUV);// 应用CLAHE到Y通道(YUV中的Y代表亮度)cv::Ptrcv::CLAHE clahe cv::createCLAHE(2.0, cv::Size(8, 8));clahe-apply(0, imgYUV); // 修正此行代码// 将结果转换回BGR格式cv::Mat imgOutput;cv::cvtColor(imgYUV, imgOutput, cv::COLOR_YUV2BGR);return imgOutput;}bool adjustBrightness(const std::string input_picture, const std::string output_path){//判断输入图片是否是支持的文件fs::path insertPath(input_picture);if (!fs::is_regular_file(insertPath)) return false;if (!isImageFileExtend(insertPath.extension().string())) return false;std::string input_filename insertPath.filename().string();std::string output_filename output_path / input_filename;cv::Mat mat_input cv::imread(input_picture);cv::Mat mat_output enhanceBrightnessImage(mat_input);if (!cv::imwrite(output_filename, mat_output)) return false;return true;}}
完整工程带Demo见本人Github:
LeventureQys/Lev_PictureManager