opencv特征提取代码总结_第1页
opencv特征提取代码总结_第2页
opencv特征提取代码总结_第3页
opencv特征提取代码总结_第4页
opencv特征提取代码总结_第5页
已阅读5页,还剩16页未读 继续免费阅读

下载本文档

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

文档简介

特征提取代码总结 来自 /source/3208155#acomment 特征提取代码总结 颜色提取 颜色直方图提取: 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 = cvCreateImage( 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* ranges = 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 ); /* 获取直方图统计的最大值,用于动态显示直方图*/ float max_value; cvGetMinMaxHistValue( hist, 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,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 #include “cv.h“ #include “highgui.h“ #define MAX_CORNERS 100 int main(void) int cornersCount=MAX_CORNERS;/得到的角点数目 CvPoint2D32f cornersMAX_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 processed srcImage = cvLoadImage(“E:Download1.jpg“,1); grayImage = cvCreateImage(cvGetSize(srcImage),IPL_DEPTH_8U,1); /copy the source 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),IPL_DEPTH_32F,1); cvGoodFeaturesToTrack(grayImage,corners1,corners2,corners, printf(“num corners found: %dn“,cornersCount); /开始画出每个点 if (cornersCount0) for (i=0;i #include #include int main(int argc, char* argv) IplImage* src = cvLoadImage( “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, color_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*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 ); for( 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 圆提取: 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, gray, CV_GAUSSIAN, 5, 15 ); / smooth it, otherwise a lot of false circles may be detected CvSeq* 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),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 ); couttotal #include #include int thresh = 50; IplImage* img = 0; IplImage* img0 = 0; CvMemStorage* storage = 0; CvPoint pt4;const char* wndname = “Square Detection Demo“; 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); CvSeq* findSquares4( IplImage* img, CvMemStorage* storage ) CvSeq* contours; int i, c, l, N = 11; CvSize sz = cvSize( img-width IplImage* timg = cvCloneImage( img ); IplImage* gray = cvCreateImage( sz, 8, 1 ); IplImage* pyr = cvCreateImage( cvSize(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 filter out the noise cvPyrDown( timg, pyr, 7 ); cvPyrUp( pyr, timg, 7 ); tgray = cvCreateImage( sz, 8, 1 ); / find squares in every color plane of the image for( c = 0; c total = 4 for( i = 0; i = 2 ) t = fabs(angle( (CvPoint*)cvGetSeqElem( result, i ),(CvPoint*)cvGetSeqElem( result, i- 2 ),(CvPoint*)cvGetSeqElem( result, i-1 ); s = s t ? s : t; if( s h_next; cvReleaseImage( cvReleaseImage( cvReleaseImage( cvReleaseImage( return squares; / the function draws all the squares in the image void drawSquares( IplImage* img, CvSeq* squares ) CvSeqReader reader; IplImage* cpy = cvCloneImage( img ); int i; cvStartReadSeq( squares, for( i = 0; i total; i += 4 ) CvPoint* rect = 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, reader ); memcpy( pt + 3, reader.ptr, squares-elem_size ); CV_NEXT_SEQ_ELEM( squares-elem_size, reader ); cvPolyLine( cpy, cvShowImage( wndname, cpy ); cvReleaseImage( void on_trackbar( int a ) if( img ) drawSquares( img, findSquares4( img, storage ) ); 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( “canny thresh“, wndname, on_trackbar(0); c = cvWaitKey(0); cvReleaseImage( cvReleaseImage( cvClearMemStorage( storage ); if( c = 27 ) break; cvDestroyWindow( wndname ); return 0; 运行效果截图: 边缘直方图提取: Code: #include “cv.h“ #include “highgui.h“ #include #include #define PI 3.14 int 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 gradient 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; / 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(cvGetSize(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);/梯度矩阵 gradient_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); cvAdd(dx_m,dy_m,gradient); / value of gradient/梯度不是等于根号下 x的导数的平方加上 y 导数的平方吗? cvDiv(dx_m,dy_m,gradient_dir); / direction for(i=0;ibins, hist-bins, max_val ? 255. / max_val : 0., 0 ); / 缩放 bin 到区间0,255 ,比例系数 cvZero( histimg ); bin_w = histimg-width /16; / hdims: 条的个数,则 bin_w 为条的宽度 / 画直方图 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 ); / 画直方图画矩形,左下角,右上角坐标 cvShowImage( “src“, src); cvShowImage( “Histogram“, histimg ); cvWaitKey(0); cvDestroyWindow(“src“); cvDestroyWindow(“Histogram“); cvReleaseImage( cvReleaseImage( cvReleaseHist ( return 0; 运行效果截图: 视频流中边缘检测: Code: #include “highgui.h“ #include “cv.h“ #include “stdio.h“ #include 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 */ /从文件中读取 /* else if(argc = 2)*/ capture = cvCaptureFromAVI(“1.avi“); if(!capture) fprintf(stderr,“Could not initialize capturing.n“); return -1; cvNamedWindow(“Laplacian“,1); cvNamedWindow(“video“,1); /循环捕捉,直到用户按键跳出循环体 for(;) IplImage * frame =0; /抓起一祯 frame = cvQueryFrame(capture); if(!frame) break; if(!laplace) /创建图像 for(int i=0;iwidth,frame-height),IPL_DEPTH_8U,1); laplace = cvCreateImage(cvSize(frame-width,frame-height),IPL_DEPTH_16S,1); colorlaplace=cvCreateImage(cvSize(frame-width,frame-height),IPL_DEPTH_8U,3); cvCvtPixToPlane(frame,planes0,planes1,planes2,0); for(int i=0;iorigin = frame-origin; /高斯滤波,平滑图像 / cvSmooth(colorlaplace, colorlaplace, CV_GAUSSIAN, 1, 0, 0); /形态学滤波,闭运算 cvDilate(colorlaplace, colorlaplace, 0, 1);/膨胀 cvErode(colorlaplace, colorlaplace, 0, 1);/腐蚀 cvShowImage(“video“, frame); cvShowImage(“Laplacian“,colorlaplace); if(cvWaitKey(10)0) break; cvReleaseCapture( cvDestroyWindow(“Laplacian“); cvDestroyWindow(“video“); return 0; 运行效果截图:

温馨提示

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

最新文档

评论

0/150

提交评论