ソースを参照

完成部分接口;

scbc.sat2 5 年 前
コミット
3a5f582671
5 ファイル変更289 行追加9 行削除
  1. 244 2
      cv/cv/cv.cpp
  2. 37 0
      cv/cv/cv.h
  3. 5 5
      cv/cv/cv.vcxproj
  4. 3 0
      cv/cv/framework.h
  5. 0 2
      cv/cv/stdafx.h

+ 244 - 2
cv/cv/cv.cpp

@@ -28,20 +28,262 @@ int main()
         if (!AfxWinInit(hModule, nullptr, ::GetCommandLine(), 0))
         {
             // TODO: 在此处为应用程序的行为编写代码。
-            wprintf(L"错误: MFC 初始化失败\n");
+            _tprintf(_T("错误: MFC 初始化失败\n"));
             nRetCode = 1;
         }
         else
         {
             // TODO: 在此处为应用程序的行为编写代码。
+            printf("开始程序……");
+
+            cv::Mat thresholdImg;
+            if (GetBinaryImage("E:\\bin\\test.jpg", 100, 255, thresholdImg))
+            {
+                cv::imwrite("E:\\bin\\thresholdImg.jpg", thresholdImg);
+                thresholdImg.release();
+            }
+
         }
     }
     else
     {
         // TODO: 更改错误代码以符合需要
-        wprintf(L"错误: GetModuleHandle 失败\n");
+        _tprintf(_T("错误: GetModuleHandle 失败\n"));
         nRetCode = 1;
     }
 
+    //system("pause"); 
+
     return nRetCode;
 }
+
+
+CV_API bool ReadImage(std::string strImgPath, cv::Mat& img)
+{
+	// 参数有效性判断;
+	if (!PathFileExists(strImgPath.c_str())) {
+#ifdef _DEBUG
+		OutputDebugString("参数无效!");
+#endif
+		return false;
+	}
+
+	// 以BGR三通道方式读取图片;
+	img = cv::imread(strImgPath.c_str(), cv::IMREAD_COLOR);
+    // 判断图片是否为空;
+	if (!img.empty()) {
+#ifdef _DEBUG
+		OutputDebugString("读取图片失败!");
+#endif
+		return false;
+	}
+
+	return true;
+}
+
+
+CV_API bool GetBinaryImage(std::string strImgPath, long nThresholdVal, long nMaxThresholdVal, cv::Mat& thresholdImg)
+{
+    cv::Mat img;
+    // 读取图片;
+    if (!ReadImage(strImgPath, img))
+        return false;
+
+    cv::Mat grayImg;
+	// 转成灰阶图;
+	cv::cvtColor(img, grayImg, cv::COLOR_BGR2GRAY);
+    // 释放对象;
+    img.release();
+
+    cv::Mat gaussImg;
+	// 再高斯模糊处理(滤波);
+    cv::GaussianBlur(grayImg, gaussImg, cv::Size(5, 5), 0, 0);
+    // 释放对象;
+    grayImg.release();
+
+	// 全局化指定的阀值与返回值相等;
+	cv::threshold(gaussImg, thresholdImg, nThresholdVal, nMaxThresholdVal, cv::THRESH_BINARY);
+    // 释放对象;
+    gaussImg.release();
+
+    // 判断图片是否空;
+    if (!thresholdImg.empty())
+        return false;
+
+    return true;
+}
+
+CV_API bool GetOTSUBinaryImage(std::string strImgPath, long nThresholdVal, long nMaxThresholdVal, cv::Mat& thresholdImg)
+{
+	cv::Mat img;
+	// 读取图片;
+	if (!ReadImage(strImgPath, img))
+		return false;
+
+	cv::Mat grayImg;
+	// 转成灰阶图;
+	cv::cvtColor(img, grayImg, cv::COLOR_BGR2GRAY);
+	// 释放对象;
+	img.release();
+
+	cv::Mat gaussImg;
+	// 再高斯模糊处理(滤波);
+	cv::GaussianBlur(grayImg, gaussImg, cv::Size(5, 5), 0, 0);
+	// 释放对象;
+	grayImg.release();
+
+	// OTSU,此时参数3可随意设置;
+	cv::threshold(gaussImg, thresholdImg, nThresholdVal, nMaxThresholdVal, cv::THRESH_BINARY | cv::THRESH_OTSU);
+	// 释放对象;
+	gaussImg.release();
+
+	// 判断图片是否空;
+	if (!thresholdImg.empty())
+		return false;
+
+	return true;
+}
+
+
+CV_API bool GetAdaptiveBinaryImage(std::string strImgPath, long nMaxThresholdVal, cv::Mat& thresholdImg)
+{
+	cv::Mat img;
+	// 读取图片;
+	if (!ReadImage(strImgPath, img))
+		return false;
+
+	cv::Mat grayImg;
+	// 转成灰阶图;
+	cv::cvtColor(img, grayImg, cv::COLOR_BGR2GRAY);
+	// 释放对象;
+	img.release();
+
+	cv::Mat gaussImg;
+	// 再高斯模糊处理(滤波);
+	cv::GaussianBlur(grayImg, gaussImg, cv::Size(5, 5), 0, 0);
+	// 释放对象;
+	grayImg.release();
+
+	cv::Mat blurImg;
+	// 自适应阀值;
+	cv::medianBlur(gaussImg, blurImg, 3);
+	// 释放对象;
+	gaussImg.release();
+
+	// 局部二值化;//blocksize一般取3、5、7
+	cv::adaptiveThreshold(blurImg, thresholdImg, nMaxThresholdVal, cv::ADAPTIVE_THRESH_MEAN_C, cv::THRESH_BINARY, 3, 4.5);
+	// 释放对象;
+	blurImg.release();
+
+	// 判断图片是否空;
+	if (!thresholdImg.empty())
+		return false;
+
+	return true;
+}
+
+CV_API bool GaussianBlur(cv::Mat& img, cv::Size cvSize, cv::Mat& gaussImg)
+{
+	if (!img.empty())
+		return false;
+
+	// 再高斯模糊处理(滤波);
+	cv::GaussianBlur(img, gaussImg, cvSize, 0, 0);
+	// 判断图片是否空;
+	if (!gaussImg.empty())
+		return false;
+
+	return true;
+}
+
+CV_API bool GaussianBlur(std::string strImgPath, cv::Size cvSize, cv::Mat& gaussImg)
+{
+	cv::Mat img;
+	// 读取图片;
+	if (!ReadImage(strImgPath, img))
+		return false;
+
+	// 再高斯模糊处理(滤波);
+	cv::GaussianBlur(img, gaussImg, cvSize, 0, 0);
+	// 判断图片是否空;
+	if (!gaussImg.empty())
+		return false;
+
+	return true;
+}
+
+CV_API bool Color2Gray(cv::Mat& img, cv::Mat& grayImg)
+{
+	if (!img.empty())
+		return false;
+
+	// 再高斯模糊处理(滤波);
+	cv::cvtColor(img, grayImg, cv::COLOR_BGR2GRAY);
+	// 判断图片是否空;
+	if (!grayImg.empty())
+		return false;
+
+	return true;
+}
+
+CV_API bool Color2Gray(std::string strImgPath, cv::Mat& grayImg)
+{
+	cv::Mat img;
+	// 读取图片;
+	if (!ReadImage(strImgPath, img))
+		return false;
+
+	// 再高斯模糊处理(滤波);
+	cv::cvtColor(img, grayImg, cv::COLOR_BGR2GRAY);
+	// 判断图片是否空;
+	if (!grayImg.empty())
+		return false;
+
+	return true;
+}
+
+CV_API bool Gray2Color(cv::Mat& img, cv::Mat& colorImg)
+{
+	if (!img.empty())
+		return false;
+
+	// 再高斯模糊处理(滤波);
+	cv::cvtColor(img, colorImg, cv::COLOR_GRAY2BGR);
+	// 判断图片是否空;
+	if (!colorImg.empty())
+		return false;
+
+	return true;
+}
+
+CV_API bool ErodeImg(cv::Mat& img, cv::MorphShapes kernelShape, cv::Size kernelSize, cv::Mat& erodeImg)
+{
+	if (!img.empty())
+		return false;
+
+	// 获取自定义核(核形状:矩形MORPH_RECT、十字架CROSS、椭圆ELLIPSE )
+	cv::Mat element = cv::getStructuringElement(kernelShape, kernelSize);
+	// 再高斯模糊处理(滤波);
+	cv::erode(img, erodeImg, element);
+	// 判断图片是否空;
+	if (!erodeImg.empty())
+		return false;
+
+	return true;
+}
+
+CV_API bool DilateImg(cv::Mat& img, cv::MorphShapes kernelShape, cv::Size kernelSize, cv::Mat& dilateImg)
+{
+	if (!img.empty())
+		return false;
+
+	// 获取自定义核(核形状:矩形MORPH_RECT、十字架CROSS、椭圆ELLIPSE )
+	cv::Mat element = cv::getStructuringElement(kernelShape, kernelSize);
+	// 再高斯模糊处理(滤波);
+	cv::dilate(img, dilateImg, element);
+	// 判断图片是否空;
+	if (!dilateImg.empty())
+		return false;
+
+	return true;
+}

+ 37 - 0
cv/cv/cv.h

@@ -20,3 +20,40 @@ public:
 extern CV_API int ncv;
 
 CV_API int fncv(void);
+
+// 1、读取图片;
+CV_API bool ReadImage(std::string strImgPath, cv::Mat& img);
+
+// 2、获取图片全局二值化轮廓图像结果
+CV_API bool GetBinaryImage(std::string strImgPath, long nThresholdVal, long nMaxThresholdVal, cv::Mat & thresholdImg);
+
+// 3、获取图片OTSU二值化轮廓图像结果
+CV_API bool GetOTSUBinaryImage(std::string strImgPath, long nThresholdVal, long nMaxThresholdVal, cv::Mat& thresholdImg);
+
+// 4、获取图片自适应二值化轮廓图像结果
+CV_API bool GetAdaptiveBinaryImage(std::string strImgPath, long nMaxThresholdVal, cv::Mat& thresholdImg);
+
+// 5、图片高斯模糊处理,cv::Size一般为(3,3)或(5,5)
+CV_API bool GaussianBlur(cv::Mat& img, cv::Size cvSize, cv::Mat& gaussImg);
+CV_API bool GaussianBlur(std::string strImgPath, cv::Size cvSize, cv::Mat& gaussImg);
+
+// 6、图片转灰阶处理(BGR三通道转单通道)
+CV_API bool Color2Gray(cv::Mat& img, cv::Mat& grayImg);
+CV_API bool Color2Gray(std::string strImgPath, cv::Mat& grayImg);
+
+// 7、灰阶图转BGR处理(单通道转BGR三通道)
+CV_API bool Gray2Color(cv::Mat& img, cv::Mat& colorImg);
+
+// 8、对图片腐蚀处理
+CV_API bool ErodeImg(cv::Mat& img, cv::MorphShapes kernelShape, cv::Size kernelSize, cv::Mat& erodeImg);
+
+// 9、对图片膨胀处理
+CV_API bool DilateImg(cv::Mat& img, cv::MorphShapes kernelShape, cv::Size kernelSize, cv::Mat& dilateImg);
+
+//8、获取图片指定RGB颜色域的轮廓图像结果
+//9、裁剪图片指定区域
+//10、单个模板图片匹配
+//11、多个模板图片匹配
+//12、获取图片的LUV平均值
+//13、输出图片二值化轮廓填充图像结果
+//14、两图片相似度比较

+ 5 - 5
cv/cv/cv.vcxproj

@@ -27,10 +27,10 @@
   </PropertyGroup>
   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
-    <ConfigurationType>DynamicLibrary</ConfigurationType>
+    <ConfigurationType>Application</ConfigurationType>
     <UseDebugLibraries>true</UseDebugLibraries>
     <PlatformToolset>v142</PlatformToolset>
-    <CharacterSet>Unicode</CharacterSet>
+    <CharacterSet>MultiByte</CharacterSet>
     <UseOfMfc>Dynamic</UseOfMfc>
   </PropertyGroup>
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
@@ -38,7 +38,7 @@
     <UseDebugLibraries>false</UseDebugLibraries>
     <PlatformToolset>v142</PlatformToolset>
     <WholeProgramOptimization>true</WholeProgramOptimization>
-    <CharacterSet>Unicode</CharacterSet>
+    <CharacterSet>MultiByte</CharacterSet>
     <UseOfMfc>Dynamic</UseOfMfc>
   </PropertyGroup>
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
@@ -100,10 +100,10 @@
       <AdditionalIncludeDirectories>..\include</AdditionalIncludeDirectories>
     </ClCompile>
     <Link>
-      <SubSystem>Windows</SubSystem>
+      <SubSystem>Console</SubSystem>
       <GenerateDebugInformation>true</GenerateDebugInformation>
       <EnableUAC>false</EnableUAC>
-      <AdditionalDependencies>opencv_aruco331.lib;opencv_bgsegm331.lib;opencv_bioinspired331.lib;opencv_calib3d331.lib;opencv_ccalib331.lib;opencv_core331.lib;opencv_datasets331.lib;opencv_dnn331.lib;opencv_dpm331.lib;opencv_face331.lib;opencv_features2d331.lib;opencv_flann331.lib;opencv_fuzzy331.lib;opencv_highgui331.lib;opencv_imgcodecs331.lib;opencv_imgproc331.lib;opencv_img_hash331.lib;opencv_line_descriptor331.lib;opencv_ml331.lib;opencv_objdetect331.lib;opencv_optflow331.lib;opencv_phase_unwrapping331.lib;opencv_photo331.lib;opencv_plot331.lib;opencv_reg331.lib;opencv_rgbd331.lib;opencv_saliency331.lib;opencv_shape331.lib;opencv_stereo331.lib;opencv_stitching331.lib;opencv_structured_light331.lib;opencv_superres331.lib;opencv_surface_matching331.lib;opencv_text331.lib;opencv_tracking331.lib;opencv_video331.lib;opencv_videoio331.lib;opencv_videostab331.lib;opencv_xfeatures2d331.lib;opencv_ximgproc331.lib;opencv_xobjdetect331.lib;opencv_xphoto331.lib;%(AdditionalDependencies)</AdditionalDependencies>
+      <AdditionalDependencies>opencv_aruco331d.lib;opencv_bgsegm331d.lib;opencv_bioinspired331d.lib;opencv_calib3d331d.lib;opencv_ccalib331d.lib;opencv_core331d.lib;opencv_datasets331d.lib;opencv_dnn331d.lib;opencv_dpm331d.lib;opencv_face331d.lib;opencv_features2d331d.lib;opencv_flann331d.lib;opencv_fuzzy331d.lib;opencv_highgui331d.lib;opencv_imgcodecs331d.lib;opencv_imgproc331d.lib;opencv_img_hash331d.lib;opencv_line_descriptor331d.lib;opencv_ml331d.lib;opencv_objdetect331d.lib;opencv_optflow331d.lib;opencv_phase_unwrapping331d.lib;opencv_photo331d.lib;opencv_plot331d.lib;opencv_python2.lib;opencv_reg331d.lib;opencv_rgbd331d.lib;opencv_saliency331d.lib;opencv_shape331d.lib;opencv_stereo331d.lib;opencv_stitching331d.lib;opencv_structured_light331d.lib;opencv_superres331d.lib;opencv_surface_matching331d.lib;opencv_text331d.lib;opencv_tracking331d.lib;opencv_ts331d.lib;opencv_video331d.lib;opencv_videoio331d.lib;opencv_videostab331d.lib;opencv_xfeatures2d331d.lib;opencv_ximgproc331d.lib;opencv_xobjdetect331d.lib;opencv_xphoto331d.lib;%(AdditionalDependencies)</AdditionalDependencies>
       <AdditionalLibraryDirectories>..\lib</AdditionalLibraryDirectories>
     </Link>
   </ItemDefinitionGroup>

+ 3 - 0
cv/cv/framework.h

@@ -22,3 +22,6 @@
 #include <iostream>
 // Windows 头文件
 #include <windows.h>
+#include <string>
+// 只需要包含一个头文件即可;
+#include "opencv2/opencv.hpp"

+ 0 - 2
cv/cv/stdafx.h

@@ -9,6 +9,4 @@
 
 // 添加要在此处预编译的标头
 #include "framework.h"
-// 只需要包含一个头文件即可;
-#include "opencv2/opencv.hpp"
 #endif //PCH_H