opencv 提取曲线并用矩形框框出来
2016-01-11 23:24
441 查看
老师提出写个提取裂缝,并用矩形框框出来的小程序,不用多好,能跑起来看看就行,由于裂纹没有现成的,就随便划了 黑线做个模仿,由于水平比较菜,就在网上抄些程序改改,拼拼,好歹算搞定了,也算个demo吧,嘿嘿~~~希望对大家有帮助
原图在这:
,,,额 ,真的好大,算了 ,不弄了,就这样了
下面直接贴代码喽~~~
演示下结果:
嗯,应该算完成了任务了吧~~~嘎嘎~~~
原图在这:
,,,额 ,真的好大,算了 ,不弄了,就这样了
下面直接贴代码喽~~~
<pre name="code" class="html">#include "stdafx.h" #include "stdio.h" #include "cv.h" #include "highgui.h" #include <iostream> #include <string> using namespace std; using namespace cv; void sum_rgb( IplImage* src, IplImage* dst) //该函数的作用就是转灰度后二值化 { IplImage* r=cvCreateImage(cvGetSize(src), IPL_DEPTH_8U,1); IplImage* g=cvCreateImage(cvGetSize(src), IPL_DEPTH_8U,1); IplImage* b=cvCreateImage(cvGetSize(src), IPL_DEPTH_8U,1); //函数 cvSplit 分割多通道数组成分离的单通道数组d cvSplit(src,r,g,b,NULL); IplImage* s=cvCreateImage(cvGetSize(src), IPL_DEPTH_8U,1); cvAddWeighted(r, 1./3, g, 1./3, 0.0, s); cvAddWeighted(s, 2./3, b, 1./3, 0.0, s); cvThreshold(s,dst,50,255,CV_THRESH_BINARY ); cvReleaseImage(&r); cvReleaseImage(&g); cvReleaseImage(&b); cvReleaseImage(&s); } int main(int argc,char** argv) { CvSeq * contour=NULL; CvSeq * contourMax=NULL; CvMemStorage * storage=cvCreateMemStorage(); cvNamedWindow("aaa",1); IplImage* src=cvLoadImage("1.png"); IplImage* dst=cvCreateImage(cvGetSize(src),src->depth,1); IplImage * tempdst1=cvCreateImage(cvGetSize(src),src->depth,3); IplImage *pCannyImg=cvCreateImage(cvGetSize(src),src->depth,1); sum_rgb(src,dst); cvErode(dst, dst, 0, 3); cvZero(tempdst1); int maxh = 0,maxw=0; int minh=100000,minw=100000; //取边缘 以便轮廓提取 cvCanny(dst,pCannyImg,0,10,3); //轮廓提取 cvFindContours(pCannyImg,storage,&contour,sizeof(CvContour),CV_RETR_CCOMP ,CV_CHAIN_APPROX_SIMPLE); cvZero(tempdst1); double areaMax=cvContourArea( contour,CV_WHOLE_SEQ ); for( ; contour != NULL; contour = contour->h_next) { //轮廓的方向影响面积的符号。因此函数也许会返回负的结果。应用函数 fabs() 得到面积的绝对值。 double area = cvContourArea( contour,CV_WHOLE_SEQ ); //计算整个轮廓或部分轮廓的面积 if(fabs(area) >= areaMax) { areaMax=area; contourMax=contour; } } //把黑线框出来 CvScalar color = CV_RGB(255, 0, 0); CvRect rect = cvBoundingRect(contourMax,0); cvRectangle(tempdst1, cvPoint(rect.x, rect.y), cvPoint(rect.x + rect.width, rect.y + rect.height),CV_RGB(255,0,0), 3, 8, 0); IplImage* temp2 = cvCreateImage(cvGetSize(tempdst1), IPL_DEPTH_8U, 1); //创建目标图像 cvCvtColor(tempdst1,temp2,CV_BGR2GRAY); //cvCvtColor(src,des,CV_BGR2GRAY) cvAddWeighted(src,1,tempdst1,0.9,0,src); cvReleaseMemStorage(&storage); storage=NULL; cvShowImage("aaa",src); cvWaitKey(0); cvDestroyAllWindows(); cvReleaseImage(&src); cvReleaseImage(&dst); return 0; }
演示下结果:
嗯,应该算完成了任务了吧~~~嘎嘎~~~
相关文章推荐
- delphi 正弦曲线图
- C#绘制曲线图的方法
- Javascript 绘制 sin 曲线过程附图
- python中使用OpenCV进行人脸检测的例子
- opencv 做人脸识别 opencv 人脸匹配分析
- 使用opencv拉伸图像扩大分辨率示例
- 基于C++实现kinect+opencv 获取深度及彩色数据
- OpenCV 2.4.3 C++ 平滑处理分析
- 利用Python和OpenCV库将URL转换为OpenCV格式的方法
- python结合opencv实现人脸检测与跟踪
- Python实现OpenCV的安装与使用示例
- 在树莓派2或树莓派B+上安装Python和OpenCV的教程
- opencv-python学习一--人脸检测
- 在Ubuntu上安装OpenCV3.0和Python-openCV的经历
- OpenCV配置,从来没有这么简单!
- ubuntu下opencv和qt的安装配置
- 用FusionCharts 绘制曲线图
- 椭圆曲线密码算法介绍
- OpenCV学习笔记(二十五)——OpenCV图形界面设计Qt+VS2008
- 分享一些OpenCV实现立体视觉的经验