- 本系列歷程啟發於“禾路老師”的視頻課程,學習到兩個重要知識點:實戰和自己的庫!
- 本系列歷程多源於answer.opencv論壇的一些牛人的解答,作為小白只是代碼的搬運工。
言歸正傳,請看項目要求:
- 求取印章的文字識別
- 圓形規則的文字等
- 場合應用較為廣泛
思路分析一:
- 直接利用預處理分割,然后CNN直接搭建學習
思路分析二:
- 利用直角坐標系到極坐標的轉化,文字轉正
- 利用投影分割
- CNN學習
代碼實現:
- 本博文利用第二種方法,識別精度和效率較高
- 預處理找到圓心和半徑,怎么預處理方法太多了,如果有實際項目可以博文留言,大家一起討論!
- Cart to Polar Translation
- 后期的投影變換之前做過,大家可以看另一篇博文--->>投影變換
#include <opencv2/opencv.hpp>
using namespace std;
using namespace cv;
int main( int argc, const char** argv )
{
Mat img=imread("123.png",0);
threshold(img,img,200,255,CV_THRESH_BINARY_INV); // to delete some noise
Mat labels;
connectedComponents(img, labels, 8, CV_16U);//連通域提取
Mat maximage = labels == 1;
maximage.convertTo(maximage, CV_8UC1);
//找圓的范圍,因為后面minEnclosingCircle函數需要輸入
Mat locations;
findNonZero(maximage, locations);
Point2f center;
float radius;
minEnclosingCircle(locations,center,radius);
Mat showImag = Mat::ones(img.size(),CV_8UC3);
circle(showImag, center, radius, Scalar(0, 255, 255), 2);
//---linear Cart to Polar
Mat matLinearPolar;
linearPolar(
img, matLinearPolar,
center,
radius, INTER_CUBIC);
//log Cart to Polar
Mat matLogPolar;
cv::logPolar(
img,
matLogPolar,
center,
radius/3,
INTER_CUBIC
);
threshold(matLinearPolar, matLinearPolar, 0, 255, CV_THRESH_BINARY_INV|THRESH_OTSU);
threshold(matLogPolar, matLogPolar, 0, 255, CV_THRESH_BINARY_INV|THRESH_OTSU);
return 0;
}
參考資料: