这段时间一直在用opencv搞图像处理的问题,发现虽然可调用的函数多,但是直接找相应代码还是很困难,就行寻找连通域,并在连通域外侧加框,对于习惯使用垫矩形操作的我,真心感觉代码少之又少,为防止以后自己还会用的到,特在此记录一下。
要对下面的图像进行字符的边缘检测。
程序中具体的步骤为:
(1)灰度化,二值化
(2)图像膨胀
(3)检测膨胀图像的边缘并叫外矩形框
实现代码如下:
# include“stdafx.h” # include“stdio . h” # include“Base_process.h” # include“opencv/cv.h” # include“opencv/highgui.h” # include & lt; opencv2/opencv.hpp> # include & lt; tchar.h> # include & lt; iostream> # include & lt; fstream> 使用名称空间性病; 使用名称空间的简历; void main () { 垫src=https://www.yisu.com/zixun/imread (“D: \ \ Recognize_Form_Project \ \ test_images \ \ 0. jpg”);//图片路径/* image180.jpg */垫gray_image; cvtColor (gray_image src CV_BGR2GRAY); imwrite (“src.jpg src); 垫binary_image; CV_ADAPTIVE_THRESH_MEAN_C adaptiveThreshold (gray_image binary_image, 255年, 25岁的CV_THRESH_BINARY_INV 10);///局部自适应二值化函数 imwrite (“erzhi.jpg”, binary_image);//去噪 垫de_noise=binary_image.clone ();//中值滤波 medianBlur (binary_image de_noise 5);/////////////////////////膨胀////////////////////垫dilate_img; 垫元素=getStructuringElement (MORPH_RECT、大小(20、20/* 15、15 */)); 扩张(de_noise dilate_img元素); imwrite (“dilate.jpg”, dilate_img);//外部加框//检测连通域,每一个连通域以一系列的点表示,FindContours方法只能得到第一个域 vector比;轮廓; vector 层次结构; findContours (dilate_img、轮廓、层次结构、CV_RETR_EXTERNAL CV_CHAIN_APPROX_NONE);//CV_RETR_EXTERNAL只检测外部轮廓,可根据自身需求进行调整 垫contoursImage (dilate_img。行,dilate_img。关口,CV_8U标量(255)); int指数=0; (;指数在=0;指数=层次结构(指数)[0]){ 简历:标量颜色(rand (),255年,兰德(),255年,兰德(),255);//2 opencv//简历::drawContours (dstImage、轮廓、指数、颜色、CV_FILLED 8层次);//CV_FILLED所在位置表示轮廓线条粗细度,如果为负值(如厚度==CV_FILLED),绘制在轮廓内部//opencv 3//简历::drawContours (contoursImage、轮廓、索引、颜色、简历::,8,层次结构); 简历::drawContours (contoursImage、轮廓、指数、标量(0),1,8,层次);//描绘字符的外轮廓 矩形矩形=boundingRect(轮廓(指数));//检测外轮廓 矩形,矩形(contoursImage标量(0,0255),3);//对外轮廓加矩形框 } imwrite (“zt.jpg”, contoursImage); cout & lt; & lt;“完成检测”; de_noise.release (); element.release (); dilate_img.release (); binary_image.release (); gray_image.release (); }
相应的结果图:
膨胀图:
连通域检测图:
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。