资源描述:
《Zedboard甲诊opencv图像处理(一).doc》由会员上传分享,免费在线阅读,更多相关内容在应用文档-天天文库。
1、Zedboard甲诊opencv图像处理(一) 首先基于前面的工作,通过调整已经很好的把指甲边缘显示出来了,不曾想我却从那时开始走上了弯路,使用matlab去处理静态图片,以获得更好的指甲和特征提取效果,结果就是,效果不理想(光照影响)并且用到摄像头上来一点都不实用。辛辛苦苦的研究了n多的图像处理算法,几乎把边缘提取的算法全部过了一遍,阅读了不下100篇论文,还折腾出B样条曲线拟合进行边缘连接,现在想想太可笑了,其实OpenCV现有的图像处理方法已经可以满足我提取指甲的要求了,只不过我需要进行合理的组合搭配,从而实现我想要的效果。 总有那么一句话叫:摸着石头过河。我今
2、天算是体会到了,不过中间老板还让写创业计划,总之,该回归正道了! 接着之前的canny提取的边缘,我想进一步提取出指甲,把其他背景都省略,这样就只留下指甲了,从而进一步提取特征。首先我想到的是findContours函数及其轮廓操作 //!retrievescontoursandthehierarchicalinformaTIonfromblack-n-whiteimage.CV_EXPORTS_WvoidfindContours(InputOutputArrayimage,OutputArrayOfArrayscontours,OutputArrayhierarch
3、y,intmode,intmethod,Pointoffset=Point()); //!retrievescontoursfromblack-n-whiteimage.CV_EXPORTSvoidfindContours(InputOutputArrayimage,OutputArrayOfArrayscontours,intmode,intmethod,Pointoffset=Point()); 其中image为输入的binaryimage,输出是一个向量数组,每个向量是Points类型的指针向量数组。这个数组会用做后面的轮廓处理。 mode代表提取轮廓的类型,
4、可以是以下几种类型//CV_RETR_LIST,//retrieveallcontours//CV_RETR_EXTERNAL,//retrievetheexternalcontours//CV_RETR_TREE,//retrieveallcontoursintreeformat//CV_RETR_CCOMPissimilarbutlimitsthehierarchyattwolevels.建立两个等级的轮廓,上面的一层为外边界,里面的一层为内孔的边界信息。如果内孔内还有一个连通物体,这个物体的边界也在顶层。 method代表轮廓点的类型,可以有//CV_CHAIN_
5、APPROX_NONE//allpixelsofeachcontours存储所有的轮廓点,相邻的两个点的像素位置差不超过1,即max(abs(x1-x2),abs(y2-y1))==1//CV_CHAIN_APPROX_SIMPLE//onlytheendpointswouldbeincludedforhorizontal,verTIcal,ordiagonalcontours.压缩水平方向,垂直方向,对角线方向的元素,只保留该方向的终点坐标,例如一个矩形轮廓只需4个点来保存轮廓信息 最后一个不用管先,然后就是一个OutputArrayhierarchy代表分层结构,h
6、ierarchy,//hierarchicalrepresentaTIon 接下来用cv::Matresult(image.size(),CV_8U,cv::Scalar(255));cv::drawContours(result,contours,-1,//drawallcontourscv::Scalar(0),//inblack2);//withathicknessof2 出来的效果还不错,利用黑背景,能将指甲分离出来,但是接下来的分离过程除了错误。就是在我将多余的或者不符合要求的轮廓去除过程中报错了 //Eliminatetooshortortoolongc
7、ontoursintcmin=100;//minimumcontourlengthintcmax=1000;//maximumcontourlengthstd::vector>::const_iteratoritc=contours.begin();while(itc!=contours.end()){if(itc->size()size()>cmax)itc=contours.erase(itc);else++itc;} 错误如下:错误:nomatchingfuncTIonforcallto‘std::vector>>::