基于OpenCV的裂纹纹检测系统C++源代码_第1页
基于OpenCV的裂纹纹检测系统C++源代码_第2页
基于OpenCV的裂纹纹检测系统C++源代码_第3页
基于OpenCV的裂纹纹检测系统C++源代码_第4页
基于OpenCV的裂纹纹检测系统C++源代码_第5页
已阅读5页,还剩12页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、本文中代码为作者参考网络相关资料基础上的开发成果,仅供参考学习,如有其他机器视觉领域算法和软件定制需要,请联系作者email:2466650587基于opencv实现的裂纹检测系统c+源代码(亲测可用)1. 功能介绍本程序可实现从原始包含裂纹的图像中检测出裂纹的位置并进行标识。待测图片2. 实现源代码共包含main.cpp,crackdetection.cpp,crackdetection.h三个文件。main.cpp#include #include #include #include crackdetection.husing namespace cv;using namesp

2、ace std;list findallfile(const string &filespath)_finddata_t fileinfo;list file_list;long findresult = _findfirst(filespath.c_str(), &fileinfo);if (-1l = findresult)_findclose(findresult);return file_list;dofile_list.push_back(filei); while (0l = _findnext(findresult, &fileinfo);_findclose(f

3、indresult);return file_list;int main(int argc, char* argv)list filelist;double totaltime;filelist = findallfile(img_inputs*.jpg);filelist.splice(filelist.begin(), findallfile(img_inputs*.png);for (list:iterator it = filelist.begin(); it != filelist.end(); it+)mat imgraw = imread(.img_samples + *it);

4、/imshow(src img,imgraw);crackdetection crackinfo(imgraw, *it);imwrite(.img_crackdetection + *it, crackinfo.getimgcrackhighlight();cout *it crackinfo.getcracksscale() endl;/system(pause);waitkey();return 0;crackdetection.cpp#includecrackdetection.hstatic inline int getcontourspan(vector &contours)int

5、 minx = 0x7fffffff, miny = 0x7fffffff;int maxx = 0, maxy = 0;for (vector:iterator it = contours.begin(); it != contours.end(); it+)if (it-x maxx)maxx = it-x;if (it-y maxy)maxy = it-y;if (it-x x;if (it-y y;return maxy - miny maxx - minx ? maxy - miny : maxx - minx;static inline bool contourssortbyare

6、a(vector &contour1, vector &contour2)return (contourarea(contour1) contourarea(contour2);static inline bool contourssortbyspan(vector &contour1, vector &contour2)return (getcontourspan(contour1) getcontourspan(contour2);void crackdetection:cracklocate(mat &srcimg, mat &binimg)vector vector contours;

7、if (binimg.data)findcontours(binimg, contours, cv_retr_external, cv_chain_approx_none);if (contours.size() 0)for (size_t i = 0; i contours.size(); i+)rect maxrect;maxrect = boundingrect(contoursi);rectangle(srcimg, maxrect, cv:scalar(0, 0, 255);float crackdetection:crackanalysis(mat &srcimg, mat &bi

8、nimg)vector vector crackslist;double cracksproportion = 0, carcksareasum = 0;if (binimg.data)findcontours(binimg, crackslist, cv_retr_external, cv_chain_approx_none);if (crackslist.size() 0)drawcontours(srcimg, crackslist, -1, scalar(255, 0, 0), cv_filled, 8, vector(), 2, point();vector vector :iter

9、ator it;for (it = crackslist.begin(); it != crackslist.end(); it+)carcksareasum += contourarea(*it);cracksproportion = carcksareasum / (srcimg.rows*srcimg.cols);return cracksproportion;void crackdetection:gethist(mat& srcimg, mat& dstimg)int bins = 256;int hist_size = bins ;float range = 0, 256 ;con

10、st float* ranges = range ;matnd hist;int channels = 0 ;calchist(&srcimg, 1, channels, mat(), / do not use mask hist, 1, hist_size, ranges,true, / the histogram is uniform false);double max_val;minmaxloc(hist, 0, &max_val, 0, 0);int scale = 2;int hist_height = 256;mat hist_img = mat:zeros(hist_height

11、, bins*scale, cv_8uc3);for (int i = 0; ibins; i+)float bin_val = hist.at(i);int intensity = cvround(bin_val*hist_height / max_val); /要绘制的高度 rectangle(hist_img, point(i*scale, hist_height - 1),point(i + 1)*scale - 1, hist_height - intensity),cv_rgb(255, 255, 255);dstimg = hist_img;int crackdetection:

12、filtercontours(mat &imgsrc, mat &imgdst, bool isspecify = true, int numcontours = 100, double ratiothreshold = 2)mat imgtmp = mat:zeros(imgsrc.size(), cv_8uc1);vectorvector contourstokeep;vectorvector contoursall;vector hierarchy;/ 寻找轮廓findcontours(imgsrc, contoursall, hierarchy, cv_retr_list, cv_ch

13、ain_approx_tc89_kcos, point(0, 0);if (contoursall.size() (imgsrc.cols + imgsrc.rows)*0.01)/isspecify=false: so we just filter the img with no specificationsif (false = isspecify)for (int i = 0; i contoursall.size() & i (imgsrc.rows + imgsrc.cols)*0.015)contourstokeep.push_back(contoursalli);elsethre

14、sholdarea += contourarea(contoursall0);sort(contoursall.begin(), contoursall.end(), contourssortbyspan);thresholdspan += getcontourspan(contoursall0);for (int i = 0; i contoursall.size() & i ratiothreshold& tmpspan / thresholdspan 0.1 & tmparea / thresholdarea 0.01)/删除面积小于设定值的轮廓 contourstokeep.push_

15、back(contoursalli);drawcontours(imgtmp, contourstokeep, -1, scalar(255), cv_filled, 8, vector(), 2, point();imgdst = imgtmp;return contourstokeep.size();crackdetection:crackdetection(mat &imgraw, string &filename)if (null = imgraw.data)return;_imgraw = imgraw;mat imgcracksgray;cvtcolor(_imgraw, imgc

16、racksgray, cv_rgb2gray);mat imgcracksfiltedgray;imshow(imgcracksgray, imgcracksgray);for (int i = 1; i = 1; iteration+)dilate(imgcracksbinary, imgcracksbinary, elementdialate);erode(imgcracksbinary, imgcracksbinary, elementerode);if (numcountours 30)numcountours = (int)ceil(numcountours*0.6);else if

17、 (numcountours 15)numcountours = (int)ceil(numcountours*0.8);else if (numcountours 5)numcountours-;numcountours = filtercontours(imgcracksbinary, imgcracksbinary, true, numcountours, 0);if (numcountours 4)break;numcountours = filtercontours(imgcracksbinary, imgcracksbinary, true, numcountours, 2);im

18、write(.img_crackbinary + filename, imgcracksbinary);imshow(imgcracksbinary-filtercontour, imgcracksbinary);imgraw.copyto(_imgcrackhighlight);_cracksascale = crackanalysis(_imgcrackhighlight, imgcracksbinary);crackdetection:crackdetection()mat& crackdetection:getimgcrackhighlight()return _imgcrackhighlight;float crackdetection:getcra

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论