您的位置:首页 > 运维架构

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;
}




演示下结果:

  

嗯,应该算完成了任务了吧~~~嘎嘎~~~
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  opencv 画框 曲线