《图像处理实例》 之 寻找图纸标注
要求:寻找图纸零件所有标注的字符,包括位置信息+图像信息
方法:
1.利用形态学+轮廓信息去查询
这里精度不是很高,计算难度也比较复杂,好处是思想简单。
2.利用模板匹配
这里是保证模板和实际相差不大,不然匹配精度就很差了。
1 #include <opencv2/opencv.hpp> 2 #include <iostream> 3 #include "math.h" 4 using namespace cv; 5 using namespace std; 6 7 typedef struct MyStruct 8 { 9 Rect my_rec; 10 Mat my_img; 11 }MyStruct; 12 13 int main(int argc, char*argv[]) 14 { 15 Mat inputImage = imread("1.png"); 16 Mat showImage = inputImage.clone(); 17 cvtColor(inputImage, inputImage, CV_BGR2GRAY); 18 Mat morph, gray = inputImage.clone(), showGray; 19 showGray.create(inputImage.size(), CV_8UC1); 20 showGray.setTo(0); 21 vector<vector<Point>> contours; 22 vector<Vec4i> hierarchy; 23 findContours(inputImage, contours, hierarchy, RETR_TREE, CHAIN_APPROX_SIMPLE, Point(-1, -1)); 24 Rect rec_adapt; 25 for (size_t i = 0; i < contours.size(); i++) 26 { 27 int x = minAreaRect(contours[i]).boundingRect().x; 28 int y = minAreaRect(contours[i]).boundingRect().y; 29 int width = minAreaRect(contours[i]).boundingRect().width; 30 int height = minAreaRect(contours[i]).boundingRect().height; 31 Mat true_image; 32 int true_pix_count; 33 double true_pix_rate; 34 if (x < 0 || y < 0) true_pix_rate = 1; 35 else 36 { 37 true_image = gray(Rect(x, y, width, height)); 38 true_pix_count = countNonZero(true_image); 39 true_pix_rate = static_cast<double>(true_pix_count) / static_cast<double>(minAreaRect(contours[i]).boundingRect().area()); 40 } 41 double angle = minAreaRect(contours[i]).angle; 42 bool flag_angle = (angle == 9 || angle == 180 || angle == 0 ) ? true : false;//|| angle == 270 43 if (minAreaRect(contours[i]).size.height >= 10 && minAreaRect(contours[i]).size.height <= 20 && minAreaRect(contours[i]).size.width >= 4 && minAreaRect(contours[i]).size.width <= 30 && flag_angle && true_pix_rate <= 0.8)// 44 { 45 drawContours(showGray, contours, static_cast<int>(i), Scalar(255, 255, 255), 1); 46 } 47 } 48 Mat img1; 49 Mat kernel_x = getStructuringElement(MORPH_RECT, Size(20,1)); 50 Mat kernel_y = getStructuringElement(MORPH_RECT, Size(1, 28)); 51 Mat kernel_x_l = getStructuringElement(MORPH_RECT, Size(20, 1)); 52 morphologyEx(showGray, showGray, MORPH_DILATE, kernel_x); 53 morphologyEx(showGray, showGray, MORPH_DILATE, kernel_x); 54 morphologyEx(showGray, img1, MORPH_OPEN, kernel_y); 55 showGray = showGray - img1; 56 morphologyEx(showGray, showGray, MORPH_CLOSE, kernel_x_l); 57 findContours(showGray, contours, hierarchy, RETR_TREE, CHAIN_APPROX_SIMPLE, Point(-1, -1)); 58 vector<MyStruct> my_class; 59 for (size_t i = 0; i < contours.size(); i++) 60 { 61 if (boundingRect(contours[i]).width > 60) 62 { 63 int x = minAreaRect(contours[i]).boundingRect().x; 64 int y = minAreaRect(contours[i]).boundingRect().y; 65 int width = minAreaRect(contours[i]).boundingRect().width; 66 int height = minAreaRect(contours[i]).boundingRect().height; 67 MyStruct Struct_temp; 68 Struct_temp.my_rec = boundingRect(contours[i]); 69 Struct_temp.my_img = showImage(Rect(x, y, width, height)).clone(); 70 my_class.push_back(Struct_temp); 71 rectangle(showImage, boundingRect(contours[i]), Scalar(0, 0, 255)); 72 } 73 } 74 75 76 waitKey(0); 77 return 0; 78 79 }
效果图不上了,不想再去运行了
作者:影醉阏轩窗
-------------------------------------------
个性签名:衣带渐宽终不悔,为伊消得人憔悴!
如果觉得这篇文章对你有小小的帮助的话,记得关注再下的公众号,同时在右下角点个“推荐”哦,博主在此感谢!