特征提取代码精选_第1页
特征提取代码精选_第2页
特征提取代码精选_第3页
特征提取代码精选_第4页
特征提取代码精选_第5页
已阅读5页,还剩15页未读 继续免费阅读

下载本文档

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

文档简介

1、特征提取代码总结颜色提取 颜色直方图提取:Code:#include #include #include using namespace std; int main( int argc, char* argv )IplImage * src= cvLoadImage(E:Downloadtest1.jpg,1); IplImage* hsv = cvCreateImage( cvGetSize(src), 8, 3 );IplImage* h_plane = cvCreateImage( cvGetSize(src), 8, 1 );IplImage* s_plane = cvCreateIm

2、age( cvGetSize(src), 8, 1 );IplImage* v_plane = cvCreateImage( cvGetSize(src), 8, 1 );IplImage* planes = h_plane, s_plane ; /* H 分量划分为16个等级,S分量划分为8个等级*/int h_bins = 16, s_bins = 8;int hist_size = h_bins, s_bins; /* H 分量的变化范围*/float h_ranges = 0, 180 ; /* S 分量的变化范围*/float s_ranges = 0, 255 ;float* ra

3、nges = h_ranges, s_ranges ; /* 输入图像转换到HSV颜色空间*/cvCvtColor( src, hsv, CV_BGR2HSV );cvCvtPixToPlane( hsv, h_plane, s_plane, v_plane, 0 ); /* 创建直方图,二维, 每个维度上均分*/CvHistogram * hist = cvCreateHist( 2, hist_size, CV_HIST_ARRAY, ranges, 1 );/* 根据H,S两个平面数据统计直方图*/cvCalcHist( planes, hist, 0, 0 ); /* 获取直方图统计的

4、最大值,用于动态显示直方图*/float max_value;cvGetMinMaxHistValue( hist, 0, &max_value, 0, 0 ); /* 设置直方图显示图像*/int height = 240;int width = (h_bins*s_bins*6);IplImage* hist_img = cvCreateImage( cvSize(width,height), 8, 3 );cvZero( hist_img ); /* 用来进行HSV到RGB颜色转换的临时单位图像*/IplImage * hsv_color = cvCreateImage(cvSize(1

5、,1),8,3);IplImage * rgb_color = cvCreateImage(cvSize(1,1),8,3);int bin_w = width / (h_bins * s_bins);for(int h = 0; h h_bins; h+)for(int s = 0; s s_bins; s+)int i = h*s_bins + s;/* 获得直方图中的统计次数,计算显示在图像中的高度*/float bin_val = cvQueryHistValue_2D( hist, h, s );int intensity = cvRound(bin_val*height/max_v

6、alue); /* 获得当前直方图代表的颜色,转换成RGB用于绘制*/cvSet2D(hsv_color,0,0,cvScalar(h*180.f / h_bins,s*255.f/s_bins,255,0);cvCvtColor(hsv_color,rgb_color,CV_HSV2BGR);CvScalar color = cvGet2D(rgb_color,0,0); cvRectangle( hist_img, cvPoint(i*bin_w,height),cvPoint(i+1)*bin_w,height - intensity),color, -1, 8, 0 ); cvName

7、dWindow( Source, 1 );cvShowImage( Source, src ); cvNamedWindow( H-S Histogram, 1 );cvShowImage( H-S Histogram, hist_img ); cvWaitKey(0);运行效果截图: 形状提取 Candy算子对边缘提取:Code: #include cv.h#include cxcore.h#include highgui.h int main( int argc, char* argv ) /声明IplImage指针 IplImage* pImg = NULL; IplImage* pCa

8、nnyImg = NULL; /载入图像,强制转化为GraypImg = cvLoadImage( E:Downloadtest.jpg, 0); /为canny边缘图像申请空间pCannyImg = cvCreateImage(cvGetSize(pImg), IPL_DEPTH_8U, 1);/canny边缘检测cvCanny(pImg, pCannyImg, 50, 150, 3); /创建窗口cvNamedWindow(src, 1);cvNamedWindow(canny,1);/显示图像cvShowImage( src, pImg ); cvShowImage( canny, pC

9、annyImg ); /等待按键cvWaitKey(0);/销毁窗口cvDestroyWindow( src ); cvDestroyWindow( canny );/释放图像cvReleaseImage( &pImg ); cvReleaseImage( &pCannyImg );return 0; 运行效果截图: 角点提取:Code: #include #include cv.h#include highgui.h#define MAX_CORNERS 100int main(void)int cornersCount=MAX_CORNERS;/得到的角点数目CvPoint2D32f co

10、rnersMAX_CORNERS;/输出角点集合IplImage *srcImage = 0,*grayImage = 0,*corners1 = 0,*corners2 = 0;int i;CvScalar color = CV_RGB(255,0,0);cvNamedWindow(image,1);/Load the image to be processedsrcImage = cvLoadImage(E:Download1.jpg,1);grayImage = cvCreateImage(cvGetSize(srcImage),IPL_DEPTH_8U,1);/copy the sou

11、rce image to copy image after converting the format/复制并转为灰度图像cvCvtColor(srcImage,grayImage,CV_BGR2GRAY);/create empty images os same size as the copied images/两幅临时位浮点图像,cvGoodFeaturesToTrack会用到corners1 = cvCreateImage(cvGetSize(srcImage),IPL_DEPTH_32F,1);corners2 = cvCreateImage(cvGetSize(srcImage),

12、IPL_DEPTH_32F,1);cvGoodFeaturesToTrack(grayImage,corners1,corners2,corners,&cornersCount,0.05,30,/角点的最小距离是0,/整个图像3,0,0.4);printf(num corners found: %dn,cornersCount);/开始画出每个点if (cornersCount0)for (i=0;icornersCount;i+)cvCircle(srcImage,cvPoint(int)(cornersi.x),(int)(cornersi.y),2,color,2,CV_AA,0);cv

13、ShowImage(image,srcImage);cvSaveImage(imagedst.png,srcImage);cvReleaseImage(&srcImage);cvReleaseImage(&grayImage);cvReleaseImage(&corners1);cvReleaseImage(&corners2);cvWaitKey(0);return 0; 运行效果截图: Hough直线提取:Code: #include #include #include int main(int argc, char* argv) IplImage* src = cvLoadImage(

14、E:Download2.jpg , 0 ); IplImage* dst; IplImage* color_dst; CvMemStorage* storage = cvCreateMemStorage(0); CvSeq* lines = 0; int i; if( !src ) return -1; dst = cvCreateImage( cvGetSize(src), 8, 1 ); color_dst = cvCreateImage( cvGetSize(src), 8, 3 ); cvCanny( src, dst, 50, 200, 3 ); cvCvtColor( dst, c

15、olor_dst, CV_GRAY2BGR );#if 0 lines = cvHoughLines2( dst, storage, CV_HOUGH_STANDARD, 1, CV_PI/180, 100, 0, 0 ); for( i = 0; i total,100); i+ ) float* line = (float*)cvGetSeqElem(lines,i); float rho = line0; float theta = line1; CvPoint pt1, pt2; double a = cos(theta), b = sin(theta); double x0 = a*

16、rho, y0 = b*rho; pt1.x = cvRound(x0 + 1000*(-b); pt1.y = cvRound(y0 + 1000*(a); pt2.x = cvRound(x0 - 1000*(-b); pt2.y = cvRound(y0 - 1000*(a); cvLine( color_dst, pt1, pt2, CV_RGB(255,0,0), 3, CV_AA, 0 ); #else lines = cvHoughLines2( dst, storage, CV_HOUGH_PROBABILISTIC, 1, CV_PI/180, 50, 50, 10 ); f

17、or( i = 0; i total; i+ ) CvPoint* line = (CvPoint*)cvGetSeqElem(lines,i); cvLine( color_dst, line0, line1, CV_RGB(255,0,0), 3, CV_AA, 0 ); #endif cvNamedWindow( Source, 1 ); cvShowImage( Source, src ); cvNamedWindow( Hough, 1 ); cvShowImage( Hough, color_dst ); cvWaitKey(0); return 0;运行效果截图: Hough圆提

18、取:Code:#include #include #include #include using namespace std;int main(int argc, char* argv) IplImage* img;img=cvLoadImage(E:Download3.jpg, 1); IplImage* gray = cvCreateImage( cvGetSize(img), 8, 1 ); CvMemStorage* storage = cvCreateMemStorage(0); cvCvtColor( img, gray, CV_BGR2GRAY ); cvSmooth( gray

19、, gray, CV_GAUSSIAN, 5, 15 );/ smooth it, otherwise a lot of false circles may be detectedCvSeq* circles = cvHoughCircles( gray, storage, CV_HOUGH_GRADIENT, 2, gray-height/4, 200, 100 ); int i; for( i = 0; i total; i+ ) float* p = (float*)cvGetSeqElem( circles, i ); cvCircle( img, cvPoint(cvRound(p0

20、),cvRound(p1), 3, CV_RGB(0,255,0), -1, 8, 0 ); cvCircle( img, cvPoint(cvRound(p0),cvRound(p1), cvRound(p2), CV_RGB(255,0,0), 3, 8, 0 ); cout圆心坐标x= cvRound(p0)endl圆心坐标y= cvRound(p1)endl; cout半径=cvRound(p2)endl; cout圆数量=totalendl; cvNamedWindow( circles, 1 ); cvShowImage( circles, img ); cvWaitKey(0);

21、 return 0;运行效果截图: Hough矩形提取:Code: #include cv.h#include highgui.h#include #include #include 载入数张包含各种形状的图片,检测出其中的正方形int thresh = 50; /阈值设为50IplImage* img = 0;IplImage* img0 = 0;CvMemStorage* storage = 0; /内存存储器是一个可用来存储诸如序列,轮廓,图形,子划分等动态增长数据结构的底层结构 CvPoint pt4;const char* wndname = Square Detection Dem

22、o; /定义四个整数坐标点angle函数用来返回(两个向量之间找到角度的余弦值)double angle( CvPoint* pt1, CvPoint* pt2, CvPoint* pt0 ) double dx1 = pt1-x - pt0-x; double dy1 = pt1-y - pt0-y; double dx2 = pt2-x - pt0-x; double dy2 = pt2-y - pt0-y; return (dx1*dx2 + dy1*dy2)/sqrt(dx1*dx1 + dy1*dy1)*(dx2*dx2 + dy2*dy2) + 1e-10); /返回图像中找到的所

23、有轮廓序列,并且序列存储在内存存储器中CvSeq* findSquares4( IplImage* img, CvMemStorage* storage ) /创建序列 CvSeq* contours;int i, c, l, N = 11; CvSize sz = cvSize( img-width & -2, img-height & -2 ); /定义矩形框大小IplImage* timg = cvCloneImage( img ); IplImage* gray = cvCreateImage( sz, 8, 1 ); IplImage* pyr = cvCreateImage( cv

24、Size(sz.width/2, sz.height/2), 8, 3 ); IplImage* tgray; CvSeq* result; /创建结果序列double s, t; 创建一个空序列用于存储轮廓角点CvSeq* squares = cvCreateSeq( 0, sizeof(CvSeq), sizeof(CvPoint), storage ); /创建序列 cvSetImageROI( timg, cvRect( 0, 0, sz.width, sz.height ); /基于给定矩形设置感兴趣区域 / down-scale and upscale the image to f

25、ilter out the noise 过滤噪音cvPyrDown( timg, pyr, 7 ); /对输入图像向下采样,timg为输入图像,pyr为输出图像,高度与宽度为输入图像一半cvPyrUp( pyr, timg, 7 ); /对输入图像向上采样,输出图像, 宽度和高度应是输入图像的2倍tgray = cvCreateImage( sz, 8, 1 ); 红绿蓝3色分别尝试提取/ find squares in every color plane of the image for( c = 0; c 3; c+ ) 提取 the c-th color plane cvSetImage

26、COI( timg, c+1 ); /设置图像感兴趣通道,选择1和2和3通道 cvCopy( timg, tgray, 0 ); /把timg(输入)赋值给tgray(输出)尝试各种阈值提取得到的(N=11) for( l = 0; l total = 4 & fabs(cvContourArea(result,CV_WHOLE_SEQ) 1000 & cvCheckContourConvexity(result) ) /当轮廓数为4,fabs为取绝对值 轮廓为凸cvContourArea计算整个轮廓的面积 s = 0; for( i = 0; i = 2 ) t = fabs(angle(

27、(CvPoint*)cvGetSeqElem( result, i ),(CvPoint*)cvGetSeqElem( result, i-2 ),(CvPoint*)cvGetSeqElem( result, i-1 ); s = s t ? s : t; if 余弦值 足够小,可以认定角度为90度直角 cos0.1=83度,能较好的趋近直角 if( s 0.3 ) for( i = 0; i h_next; cvReleaseImage( &gray ); cvReleaseImage( &pyr ); cvReleaseImage( &tgray ); cvReleaseImage( &

28、timg ); return squares; drawSquares函数用来画出在图像中找到的所有正方形轮廓/ the function draws all the squares in the imagevoid drawSquares( IplImage* img, CvSeq* squares ) CvSeqReader reader; IplImage* cpy = cvCloneImage( img ); int i; cvStartReadSeq( squares, &reader, 0 ); for( i = 0; i total; i += 4 ) CvPoint* rect

29、 = pt; int count = 4; memcpy( pt, reader.ptr, squares-elem_size ); CV_NEXT_SEQ_ELEM( squares-elem_size, reader ); memcpy( pt + 1, reader.ptr, squares-elem_size ); CV_NEXT_SEQ_ELEM( squares-elem_size, reader ); memcpy( pt + 2, reader.ptr, squares-elem_size ); CV_NEXT_SEQ_ELEM( squares-elem_size, read

30、er ); memcpy( pt + 3, reader.ptr, squares-elem_size ); CV_NEXT_SEQ_ELEM( squares-elem_size, reader ); cvPolyLine( cpy, &rect, &count, 1, 1, CV_RGB(0,255,0), 3, CV_AA, 0 ); cvShowImage( wndname, cpy ); cvReleaseImage( &cpy );void on_trackbar( int a ) if( img ) drawSquares( img, findSquares4( img, sto

31、rage ) );char* names = 1.jpg, 0 ;int main(int argc, char* argv) int i, c; storage = cvCreateMemStorage(0); for( i = 0; namesi != 0; i+ ) img0 = cvLoadImage( namesi, 1 ); if( !img0 ) printf(Couldnt load %sn, namesi ); continue; img = cvCloneImage( img0 ); cvNamedWindow( wndname, 1 ); cvCreateTrackbar

32、( canny thresh, wndname, &thresh, 1000, on_trackbar ); on_trackbar(0); c = cvWaitKey(0); cvReleaseImage( &img ); cvReleaseImage( &img0 ); cvClearMemStorage( storage ); if( c = 27 ) break; cvDestroyWindow( wndname ); return 0; 运行效果截图: 边缘直方图提取:Code: #include cv.h#include highgui.h#include #include #de

33、fine PI 3.14int main() IplImage *src = 0; / source imagre IplImage *histimg = 0; / histogram image CvHistogram *hist = 0; / define multi_demention histogram IplImage* canny; CvMat* canny_m; IplImage* dx; / the sobel x difference IplImage* dy; / the sobel y difference CvMat* gradient; / value of grad

34、ient CvMat* gradient_dir; / direction of gradient CvMat* dx_m; / format transform to matrix CvMat* dy_m; CvMat* mask; CvSize size; IplImage* gradient_im; int i,j; float theta; int hdims = 8; / 划分HIST的个数,越高越精确 float hranges_arr = -PI/2,PI/2; / 直方图的上界和下界 float* hranges = hranges_arr; float max_val; /

35、int bin_w; src=cvLoadImage(E:Downloadtest.jpg, 0); / force to gray image if(src=0) return -1; cvNamedWindow( Histogram, 0 ); /cvNamedWindow( src, 0); size=cvGetSize(src); canny=cvCreateImage(cvGetSize(src),8,1);/边缘图像 dx=cvCreateImage(cvGetSize(src),32,1);/x方向上的差分/此处的数据类型为U 不怕溢出吗? dy=cvCreateImage(cv

36、GetSize(src),32,1); gradient_im=cvCreateImage(cvGetSize(src),32,1);/梯度图像 canny_m=cvCreateMat(size.height,size.width,CV_32FC1);/边缘矩阵 dx_m=cvCreateMat(size.height,size.width,CV_32FC1); dy_m=cvCreateMat(size.height,size.width,CV_32FC1); gradient=cvCreateMat(size.height,size.width,CV_32FC1);/梯度矩阵 gradie

37、nt_dir=cvCreateMat(size.height,size.width,CV_32FC1);/梯度方向矩阵 mask=cvCreateMat(size.height,size.width,CV_32FC1);/掩码 cvCanny(src,canny,60,180,3);/边缘检测 cvConvert(canny,canny_m);/把图像转换为矩阵 cvSobel(src,dx,1,0,3);/ 一阶X方向的图像差分:dx cvSobel(src,dy,0,1,3);/ 一阶Y方向的图像差分:dy cvConvert(dx,dx_m); cvConvert(dy,dy_m); c

38、vAdd(dx_m,dy_m,gradient); / value of gradient/梯度不是等于根号下x的导数的平方加上y导数的平方吗? cvDiv(dx_m,dy_m,gradient_dir); / direction for(i=0;isize.height;i+) for(j=0;jbins, hist-bins, max_val ? 255. / max_val : 0., 0 ); / 缩放bin 到区间0,255 ,比例系数 cvZero( histimg ); bin_w = histimg-width /16; / hdims: 条的个数,则bin_w 为条的宽度 /

39、 画直方图 for( i = 0; i bins,i)*histimg-height/255 );/ 返回单通道数组的指定元素, 返回直方图第i条的大小,val为histimg中的i条的高度 CvScalar color = CV_RGB(255,255,0); /(hsv2rgb(i*180.f/hdims);/直方图颜色 cvRectangle( histimg, cvPoint(100+i*bin_w,histimg-height),cvPoint(100+(i+1)*bin_w,(int)(histimg-height - val), color, 1, 8, 0 ); / 画直方图画

40、矩形,左下角,右上角坐标 cvShowImage( src, src); cvShowImage( Histogram, histimg ); cvWaitKey(0); cvDestroyWindow(src); cvDestroyWindow(Histogram); cvReleaseImage( &src ); cvReleaseImage( &histimg ); cvReleaseHist ( &hist ); return 0;运行效果截图: 视频流中边缘检测:Code: #include highgui.h#include cv.h#include stdio.h#include

41、 int main(int argc,char * argv) IplImage * laplace = 0; IplImage * colorlaplace = 0; IplImage * planes3 = 0,0,0; CvCapture *capture = 0; /从摄像头读取 /*if(argc = 1 |( argc=2 & strlen(argv1)=1 & isdigit(argv10) ) capture = cvCaptureFromCAM(argc = 2 ? argv10 -0:0);*/ /从文件中读取 /* else if(argc = 2)*/ capture = cvCaptureFromAVI(1.avi); if(!capture) fprintf(stderr,Could not initialize

温馨提示

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

评论

0/150

提交评论