杂项代码未分类
/**
* @file miscellaneous.hpp
* @author 鬧鬧
* @brief 雜項內容,不歸類
* @details 為天地立心,為生民立命,為往圣繼絕學,為萬世開太平。
* @version 1.0.0.1
* @date 2022年6月29日09:28:08
* @copyright Copyright (c) 2050
*
**********************************************************************************
* @par 修改日志:
* <table>
* <tr><th>Date <th>Version <th>Author <th>Description
* <tr><td> <td>1.0.0.2 <td>naonao <td>
* </table>
*
***********************************************************************************
* @par 修改日志:
* <table>
* <tr><th>Date <th>Version <th>Author <th>Description
* <tr><td>2021年1月11日15:27:52<td>1.0.0.3 <td>naonao <td>
* </table>
*
***********************************************************************************
* @par 修改日志:
* <table>
* <tr><th>Date <th>Version <th>Author <th>Description
* <tr><td> <td>1.0.0.4 <td>naonao <td>
* </table>
*
***/
#pragma once
#ifndef __MISCELLANEOUS_H__
#define __MISCELLANEOUS_H__#ifndef _CRT_SECURE_NO_WARNINGS
#define _CRT_SECURE_NO_WARNINGS
#endif
//標準庫
#include <time.h>
#include <iostream>
#include <map>
//第三方庫
#include "opencv2/opencv.hpp"
#define CV_VERSION_ID CVAUX_STR(CV_MAJOR_VERSION) \CVAUX_STR(CV_MINOR_VERSION) \CVAUX_STR(CV_SUBMINOR_VERSION)
#ifdef _DEBUG
#define cvLIB(name) "opencv_" name CV_VERSION_ID "d"
#else
#define cvLIB(name) "opencv_" name CV_VERSION_ID
#endif
//鏈接庫
//#pragma comment( lib, cvLIB("img_hash") )
#pragma comment( lib, cvLIB("world") )
namespace nao {namespace algorithm{/*** @brief gamma變換* @param img * @param gamma * @param n_c * @return */cv::Mat gamma_trans(const cv::Mat& img, double gamma, int n_c = 1) {cv::Mat img_gamma(img.size(), CV_32FC1);for (int i = 0; i < img.rows; i++) {for (int j = 0; j < img.cols; j++) {img_gamma.at<float>(i, j) = n_c * pow(img.at<uchar>(i, j), gamma);}}cv::normalize(img_gamma, img_gamma, 0, 255, cv::NormTypes::NORM_MINMAX);cv::convertScaleAbs(img_gamma, img_gamma); //將CV_32F的圖像轉成CV_8U的return img_gamma;}/*** @brief* @param img* @param sin 黑場閾值* @param hin 白場閾值* @param mt 灰度調節* @param sout 輸出黑場閾值* @param hout 輸出白場閾值* @return* @see https://blog.csdn.net/youcans/article/details/125373625*/cv::Mat gray_stairs(const cv::Mat& img, double sin = 0.0, double hin = 255.0, double mt = 1.0, double sout = 0.0, double hout = 255.0) {double Sin = std::min(std::max(sin, 0.0), hin - 2); //Sin, 黑場閾值, 0 <= Sin < Hindouble Hin = std::min(hin, 255.0); //Hin, 白場閾值, Sin<Hin<=255double Mt = std::min(std::max(mt, 0.01), 9.99); // Mt, 灰場調節值, 0.01~9.99double Sout = std::min(std::max(sout, 0.0), hout - 2); // Sout, 輸出黑場閾值, 0<=Sout<Houtdouble Hout = std::min(hout, 255.0); //Hout, 輸出白場閾值, Sout<Hout<=255double difin = Hin - Sin;double difout = Hout - Sout;uchar lutData[256];for (int i = 0; i < 256; i++) {double v1 = std::min(std::max(255 * (i - Sin) / difin, 0.0), 255.0); //輸入動態線性拉伸double v2 = 255 * std::pow(v1 / 255.0, 1.0 / Mt); //灰場伽馬調節lutData[i] = (int)std::min(std::max(Sout + difout * v2 / 255, 0.0), 255.0); //# 輸出線性拉伸}cv::Mat lut(1, 256, CV_8UC1, lutData);cv::Mat dst;cv::LUT(img, lut, dst);return dst;}/*** @brief 形態學處理種類* * @details */enum class PhologyType{FS = 1, ///<只有當卷積核對應的元素全為1時,其值才為1,否則均為0。PZ = 2, ///<當卷積核對應的元素只要有一個為1時,其值便為1,否則為0。K = 3, ///<對腐蝕后的圖像,進行膨脹處理,可以去除噪聲,并保持原有形狀。B = 4, ///<閉運算是先膨脹,后腐蝕,它有助于關閉前景物體內部的小孔,或物體上的小黑點。TD = 5, ///<梯度運算即為膨脹圖像減去腐蝕圖像從而得到輪廓圖像。DM = 6, ///<禮帽運算即為原始圖像減去開運算的圖像,得到其中的噪聲圖像HM = 7 ///<黑帽運算即為閉運算圖像減去原始圖像,得到圖片內部的小孔,或前景色中的小黑點}; // enum type/*** @brief 形態學核的種類* * @details */enum KernelShape{JUXING = cv::MorphShapes::MORPH_RECT,SHIZI = cv::MorphShapes::MORPH_CROSS,TUOYUAN = cv::MorphShapes::MORPH_ELLIPSE}; // enum shape/*** @brief 形態學運算* @param src 原圖* @param size 大小* @param type 種類* @param shape 默認矩形* @return cv:: Mat** @details*/cv:: Mat morphology(const cv::Mat src, cv::Size size, PhologyType type, KernelShape shape = KernelShape::JUXING){cv:: Mat element = cv:: getStructuringElement(shape, size);cv:: Mat dst;switch (type){case PhologyType::FS :cv:: erode(src, dst, element);break;case PhologyType::PZ :cv:: dilate(src, dst, element);break;case PhologyType::K :cv:: morphologyEx(src, dst, cv::MORPH_OPEN, element);break;case PhologyType::B :cv:: morphologyEx(src, dst, cv::MORPH_CLOSE, element);break;case PhologyType::TD :cv:: morphologyEx(src, dst, cv::MORPH_GRADIENT, element);break;case PhologyType::DM :cv:: morphologyEx(src, dst, cv::MORPH_TOPHAT, element);break;case PhologyType::HM :cv:: morphologyEx(src, dst, cv::MORPH_BLACKHAT, element);break;default: break;}return dst;}void get_rect_img(const cv::Mat& img, std::vector<cv::Point2i>& vecPt, cv::Mat& grayimg) {if (vecPt.size()<3) {grayimg = img.clone();return;}//構建凸包std::vector<cv::Point2i> hull;cv::convexHull(vecPt, hull);//構建maskcv::Mat mask = cv::Mat::zeros(cv::Size(img.cols, img.rows), img.type());std::vector<std::vector<cv::Point2i>> contour;contour.emplace_back(hull);cv::drawContours(mask, contour, 0, cv::Scalar(255, 255, 255), cv::FILLED);//輸出cv::Mat ret;img.copyTo(ret, mask);grayimg = ret.clone();}}//namespace algorithm
}// namespace nao
#endif //__MISCELLANEOUS_H__
/*----------------------------------------------------------------------------- (C) COPYRIGHT LEI *****END OF FILE------------------------------------------------------------------------------*/
總結
- 上一篇: 图像阈值类
- 下一篇: swagger使用报错:No enum