




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、特征提取代碼總結(jié)顏色提取 顏色直方圖提?。篊ode:#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個(gè)等級(jí),S分量劃分為8個(gè)等級(jí)*/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 ; /* 輸入圖像轉(zhuǎn)換到HSV顏色空間*/cvCvtColor( src, hsv, CV_BGR2HSV );cvCvtPixToPlane( hsv, h_plane, s_plane, v_plane, 0 ); /* 創(chuàng)建直方圖,二維, 每個(gè)維度上均分*/CvHistogram * hist = cvCreateHist( 2, hist_size, CV_HIST_ARRAY, ranges, 1 );/* 根據(jù)H,S兩個(gè)平面數(shù)據(jù)統(tǒng)計(jì)直方圖*/cvCalcHist( planes, hist, 0, 0 ); /* 獲取直方圖統(tǒng)計(jì)的
4、最大值,用于動(dòng)態(tài)顯示直方圖*/float max_value;cvGetMinMaxHistValue( hist, 0, &max_value, 0, 0 ); /* 設(shè)置直方圖顯示圖像*/int height = 240;int width = (h_bins*s_bins*6);IplImage* hist_img = cvCreateImage( cvSize(width,height), 8, 3 );cvZero( hist_img ); /* 用來進(jìn)行HSV到RGB顏色轉(zhuǎn)換的臨時(shí)單位圖像*/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;/* 獲得直方圖中的統(tǒng)計(jì)次數(shù),計(jì)算顯示在圖像中的高度*/float bin_val = cvQueryHistValue_2D( hist, h, s );int intensity = cvRound(bin_val*height/max_v
6、alue); /* 獲得當(dāng)前直方圖代表的顏色,轉(zhuǎn)換成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);運(yùn)行效果截圖: 形狀提取 Candy算子對(duì)邊緣提取: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; /載入圖像,強(qiáng)制轉(zhuǎn)化為GraypImg = cvLoadImage( E:Downloadtest.jpg, 0); /為canny邊緣圖像申請(qǐng)空間pCannyImg = cvCreateImage(cvGetSize(pImg), IPL_DEPTH_8U, 1);/canny邊緣檢測(cè)cvCanny(pImg, pCannyImg, 50, 150, 3); /創(chuàng)建窗口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; 運(yùn)行效果截圖: 角點(diǎn)提?。篊ode: #include #include cv.h#include highgui.h#define MAX_CORNERS 100int main(void)int cornersCount=MAX_CORNERS;/得到的角點(diǎn)數(shù)目CvPoint2D32f co
10、rnersMAX_CORNERS;/輸出角點(diǎn)集合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/復(fù)制并轉(zhuǎn)為灰度圖像cvCvtColor(srcImage,grayImage,CV_BGR2GRAY);/create empty images os same size as the copied images/兩幅臨時(shí)位浮點(diǎn)圖像,cvGoodFeaturesToTrack會(huì)用到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,/角點(diǎn)的最小距離是0,/整個(gè)圖像3,0,0.4);printf(num corners found: %dn,cornersCount);/開始畫出每個(gè)點(diǎn)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; 運(yùn)行效果截圖: Hough直線提?。篊ode: #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;運(yùn)行效果截圖: Hough圓提
18、?。篊ode:#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圓心坐標(biāo)x= cvRound(p0)endl圓心坐標(biāo)y= cvRound(p1)endl; cout半徑=cvRound(p2)endl; cout圓數(shù)量=totalendl; cvNamedWindow( circles, 1 ); cvShowImage( circles, img ); cvWaitKey(0);
21、 return 0;運(yùn)行效果截圖: Hough矩形提?。篊ode: #include cv.h#include highgui.h#include #include #include 載入數(shù)張包含各種形狀的圖片,檢測(cè)出其中的正方形int thresh = 50; /閾值設(shè)為50IplImage* img = 0;IplImage* img0 = 0;CvMemStorage* storage = 0; /內(nèi)存存儲(chǔ)器是一個(gè)可用來存儲(chǔ)諸如序列,輪廓,圖形,子劃分等動(dòng)態(tài)增長(zhǎng)數(shù)據(jù)結(jié)構(gòu)的底層結(jié)構(gòu) CvPoint pt4;const char* wndname = Square Detection Dem
22、o; /定義四個(gè)整數(shù)坐標(biāo)點(diǎn)angle函數(shù)用來返回(兩個(gè)向量之間找到角度的余弦值)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、有輪廓序列,并且序列存儲(chǔ)在內(nèi)存存儲(chǔ)器中CvSeq* findSquares4( IplImage* img, CvMemStorage* storage ) /創(chuàng)建序列 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; /創(chuàng)建結(jié)果序列double s, t; 創(chuàng)建一個(gè)空序列用于存儲(chǔ)輪廓角點(diǎn)CvSeq* squares = cvCreateSeq( 0, sizeof(CvSeq), sizeof(CvPoint), storage ); /創(chuàng)建序列 cvSetImageROI( timg, cvRect( 0, 0, sz.width, sz.height ); /基于給定矩形設(shè)置感興趣區(qū)域 / down-scale and upscale the image to f
25、ilter out the noise 過濾噪音cvPyrDown( timg, pyr, 7 ); /對(duì)輸入圖像向下采樣,timg為輸入圖像,pyr為輸出圖像,高度與寬度為輸入圖像一半cvPyrUp( pyr, timg, 7 ); /對(duì)輸入圖像向上采樣,輸出圖像, 寬度和高度應(yīng)是輸入圖像的2倍tgray = cvCreateImage( sz, 8, 1 ); 紅綠藍(lán)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 ); /設(shè)置圖像感興趣通道,選擇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) ) /當(dāng)輪廓數(shù)為4,fabs為取絕對(duì)值 輪廓為凸cvContourArea計(jì)算整個(gè)輪廓的面積 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 余弦值 足夠小,可以認(rèn)定角度為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函數(shù)用來畫出在圖像中找到的所有正方形輪廓/ 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; 運(yùn)行效果截圖: 邊緣直方圖提?。篊ode: #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的個(gè)數(shù),越高越精確 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方向上的差分/此處的數(shù)據(jù)類型為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);/邊緣檢測(cè) cvConvert(canny,canny_m);/把圖像轉(zhuǎn)換為矩陣 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/梯度不是等于根號(hào)下x的導(dǎo)數(shù)的平方加上y導(dǎo)數(shù)的平方嗎? 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 到區(qū)間0,255 ,比例系數(shù) cvZero( histimg ); bin_w = histimg-width /16; / hdims: 條的個(gè)數(shù),則bin_w 為條的寬度 /
39、 畫直方圖 for( i = 0; i bins,i)*histimg-height/255 );/ 返回單通道數(shù)組的指定元素, 返回直方圖第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、矩形,左下角,右上角坐標(biāo) cvShowImage( src, src); cvShowImage( Histogram, histimg ); cvWaitKey(0); cvDestroyWindow(src); cvDestroyWindow(Histogram); cvReleaseImage( &src ); cvReleaseImage( &histimg ); cvReleaseHist ( &hist ); return 0;運(yùn)行效果截圖: 視頻流中邊緣檢測(cè):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等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 防水修繕合同范本
- 借款融資居間服務(wù)合同范本
- 加梯安裝合同范例
- 醫(yī)生技術(shù)股協(xié)議合同范本
- 單位燈具購(gòu)買合同范本
- 修車合同范本模板
- 農(nóng)村建房買房合同范本
- 農(nóng)村豬場(chǎng)合同范本
- 人事專員勞務(wù)合同范本
- 勞務(wù)供銷合同范例
- 09式 新擒敵拳 教學(xué)教案 教學(xué)法 圖解
- 《網(wǎng)店運(yùn)營(yíng)與管理》整本書電子教案全套教學(xué)教案
- 打印版 《固體物理教程》課后答案王矜奉
- CAD術(shù)語對(duì)照表
- 學(xué)術(shù)論文的寫作與規(guī)范課件
- 香港牛津新魔法Newmagic3AUnit4Mycalendar單元檢測(cè)試卷
- 中考《紅星照耀中國(guó)》各篇章練習(xí)題及答案(1-12)
- Q∕GDW 11612.43-2018 低壓電力線高速載波通信互聯(lián)互通技術(shù)規(guī)范 第4-3部分:應(yīng)用層通信協(xié)議
- 自動(dòng)化物料編碼規(guī)則
- 第1本書出體旅程journeys out of the body精教版2003版
- [英語考試]同等學(xué)力英語新大綱全部詞匯
評(píng)論
0/150
提交評(píng)論