vs2015+OpenCV4.0圖形文字輪廓的生成(注意:程式是64位exe,32位機器不支持運行!)
核心代碼部分 :
#include<opencv2/opencv.hpp> //4.0 頭檔案
#include<opencv2\imgproc\types_c.h> //4.0 頭檔案 實作影像的 灰度 二值 腐蝕 頭檔案解決 未定義識別符號 CV_BGR2GRAY
#include <opencv2/core/core.hpp> //4.0 頭檔案 實作影像的 膨脹
#include <opencv2/highgui/highgui.hpp>//4.0 頭檔案 實作影像的 膨脹
#include <opencv2/imgproc/imgproc.hpp>//4.0 頭檔案 實作影像的 膨脹
void CMFCApplication1Dlg::OnBnClickedButton1() //opencv基本影像處理
{
using namespace cv;
using namespace std;
Mat matSrc = imread("D:/捕獲.JPG");
imshow("顯示原圖", matSrc);
//waitKey(0);
//destroyAllWindows();
//2 把原圖轉成灰度圖
Mat matGray;
cvtColor(matSrc, matGray, CV_BGR2GRAY);
//2 顯示灰度圖
namedWindow("顯示灰度圖", WINDOW_NORMAL);
imshow("顯示灰度圖", matGray);
imwrite("顯示灰度圖.jpg", matGray);
//3 把灰度圖二值化
Mat matBinary;
threshold(matGray, matBinary, 128, 255, THRESH_BINARY);
//3 顯示二值圖
namedWindow("顯示二值圖", WINDOW_NORMAL);
imshow("顯示二值圖", matBinary);
imwrite("顯示二值圖.jpg", matBinary);
//4 腐蝕
Mat matResult;
Mat element = getStructuringElement(MORPH_RECT, Size(17, 17));//創建17x17的核
erode(matBinary, matResult, element);
//4 顯示腐蝕
namedWindow("顯示腐蝕", WINDOW_NORMAL);
imshow("顯示腐蝕", matResult);
imwrite("顯示腐蝕圖.jpg", matResult);
//5 進行膨脹操作
Mat out;
Mat elements = getStructuringElement(MORPH_RECT, Size(15, 15));
dilate(matResult, out, elements);
//顯示效果圖
namedWindow("顯示膨脹");
imshow("顯示膨脹", out);
imwrite("顯示膨脹圖.jpg", out);
}
void CMFCApplication1Dlg::OnBnClickedButton2() //opencv影像文字提取和框選處理
{
using namespace cv;
using namespace std;
Mat matSrc = imread("D:/捕獲.JPG");
//imshow("顯示原圖", matSrc);
//waitKey(0);
//destroyAllWindows();
//2 把原圖轉成灰度圖
Mat matGray;
cvtColor(matSrc, matGray, CV_BGR2GRAY);
//2 顯示灰度圖
//namedWindow("顯示灰度圖", WINDOW_NORMAL);
//imshow("顯示灰度圖", matGray);
//00000000000000000000000000000000000000000000000000000000000000000000000000
Mat gray;
cvtColor(matSrc, gray, CV_BGR2GRAY);
//imshow("matSrc", gray);
//2.形態學變換的預處理,得到可以查找矩形的輪廓
//1.Sobel算子,x方向求梯度
Mat sobel;
Sobel(gray, sobel, CV_8U, 1, 0, 3);
//2.二值化
Mat binary;
threshold(sobel, binary, 0, 255, THRESH_OTSU + THRESH_BINARY);
//3.膨脹和腐蝕操作核設定
Mat element1 = getStructuringElement(MORPH_RECT, Size(30, 9));
//控制高度設定可以控制上下行的膨脹程度,例如3比4的區分能力更強,但也會造成漏檢
Mat element2 = getStructuringElement(MORPH_RECT, Size(24, 4));
//4.膨脹一次,讓輪廓突出
Mat dilate1;
dilate(binary, dilate1, element2);
//5.腐蝕一次,去掉細節,表格線等。這里去掉的是豎直的線
Mat erode1;
erode(dilate1, erode1, element1);
//6.再次膨脹,讓輪廓明顯一些
Mat dilate2;
dilate(erode1, dilate2, element2);
//7.存盤中間圖片
imwrite("binary.jpg", binary);
imwrite("dilate1.jpg", dilate1);
imwrite("erode1.jpg", erode1);
imwrite("dilate2.jpg", dilate2);
//以上代碼沒問題,可以實作圖形的預處理
vector<vector<Point>>contours;
vector<Vec4i>hierarchy;
findContours(dilate2, contours, hierarchy, CV_RETR_CCOMP, CV_CHAIN_APPROX_SIMPLE);
//繪制輪廓圖
Mat::zeros(dilate2.size(), CV_8UC3);
for (int i = 0; i < hierarchy.size(); i++)
{
Scalar color = Scalar(rand() % 255, rand() % 255, rand() % 255);
//drawContours(dilate2, contours, i, color, CV_FILLED, 8, hierarchy);
drawContours(matSrc, contours, i, cv::Scalar(0, 0, 255), 2, 8, hierarchy, 1, Point(0, 0));// 0,255,0 綠色 255,0,0 藍色 0,0,255 紅色
}
imshow("輪廓圖", matSrc);
imwrite("輪廓圖.jpg", matSrc);
}
1.0原始碼版本下載地址:
https://download.csdn.net/download/blackangelboy/12157111
程式運行效果如下

2.0原始碼版本下載地址:
https://download.csdn.net/download/blackangelboy/12158766
程式運行效果如下

原始碼部分代碼來自網路,請勿商用!
有開發需求可聯系我,定制開發智能識別演算法!
掃碼直接加我微信,一起探討智能識別技術!
opencv庫類設定方法:
詳細參考請到:https://blog.csdn.net/qq_39987952/article/details/90700277
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/107828.html
標籤:4PD「創式紀」大賽
