//例6-1 使用cvHoughCircles返回在灰階映像中找到的圓序列<br />//輸入:程式名 映像名<br />//輸出:帶有圓序列的映像<br />#include "stdafx.h"<br />#include <cv.h><br />#include <highgui.h><br />#include <math.h></p><p>int main(int argc, char** argv)<br />{<br />cvNamedWindow("lala",1);<br />IplImage* image=cvLoadImage(argv[1],CV_LOAD_IMAGE_GRAYSCALE);//以灰階格式載入映像<br />cvShowImage("原映像",image);<br />CvMemStorage* storage=cvCreateMemStorage(0);//bolck_size預設為0<br />cvSmooth(image,image,CV_GAUSSIAN,5,5);//進行高斯平滑處理,模糊了點<br />cvShowImage("高斯5,5處理之後",image);<br />CvSeq* result=cvHoughCircles(image,storage,CV_HOUGH_GRADIENT,2,image->width/10);<br />for (int i=0;i<result->total;i++)<br />{<br />float* p=(float*)cvGetSeqElem(result,i);<br />CvPoint pt=cvPoint(cvRound(p[0]),cvRound(p[1]));<br />cvCircle(image,pt,cvRound(p[2]),CV_RGB(0xff,0xff,0xff));<br />}<br />cvShowImage("霍夫變換處理之後",image);<br />cvWaitKey(0);<br />cvReleaseImage(&image);<br />cvDestroyWindow("lala");<br />return 0;<br />}<br />//運行結果在6-1運行結果.JPG
//例 6-2 仿射變換<br />//輸入:程式名 映像<br />//輸出:變換後的映像<br />#include "stdafx.h"<br />#include <cv.h><br />#include <highgui.h></p><p>int main(int argc, char** argv)<br />{<br />cvNamedWindow("Affine_Transform",1);<br />CvPoint2D32f srcTri[3],dstTri[3];<br />CvMat* rot_mat=cvCreateMat(2,3,CV_32FC1);<br />CvMat* warp_mat=cvCreateMat(2,3,CV_32FC1);<br />IplImage *src,*dst;<br />if ((argc==2)&&((src=cvLoadImage(argv[1],1))!=0))<br />{<br />dst=cvCloneImage(src);<br />dst->origin=src->origin;<br />cvZero(dst);</p><p>//計算warp矩陣<br />srcTri[0].x=0;<br />srcTri[0].y=0;</p><p>srcTri[1].x=src->width-1;<br />srcTri[1].y=0;</p><p>srcTri[2].x=0;<br />srcTri[2].y=src->height-1;</p><p>dstTri[0].x=src->width*0.0;<br />dstTri[0].y=src->height*0.33;</p><p>dstTri[1].x=src->width*0.85;<br />dstTri[1].y=src->height*0.25;</p><p>dstTri[2].x=src->width*0.15;<br />dstTri[2].y=src->height*0.7;</p><p>cvGetAffineTransform(srcTri,dstTri,warp_mat);<br />cvWarpAffine(src,dst,warp_mat);<br />cvCopy(dst,src);</p><p>CvPoint2D32f center=cvPoint2D32f(src->width/2,src->height/2);</p><p>double angle=-50.0;<br />double scale=0.6;</p><p>cv2DRotationMatrix(center,angle,scale,rot_mat);</p><p>//轉換<br />cvWarpAffine(src,dst,rot_mat);</p><p>cvShowImage("Affine_Transform",dst);<br />cvWaitKey(0);<br />}<br />cvReleaseImage(&dst);<br />cvReleaseMat(&rot_mat);<br />cvReleaseMat(&warp_mat);<br />cvDestroyAllWindows();<br />return 0;<br />}<br />//程式運行在:6-2運行結果.JPG<br />
//例 6-3 透視變換代碼<br />//輸入:程式名 原映像<br />//輸出:變換後的映像<br />#include "stdafx.h"<br />#include <cv.h><br />#include <highgui.h></p><p>int main(int argc,char** argv)<br />{<br />CvPoint2D32f srcQuad[4],dstQuad[4];<br />CvMat* warp_matrix=cvCreateMat(3,3,CV_32FC1);<br />IplImage *src,*dst;<br />if ((argc==2)&&((src=cvLoadImage(argv[1]))!=0))<br />{<br />dst=cvCloneImage(src);<br />dst->origin=src->origin;<br />cvZero(dst);</p><p>srcQuad[0].x=0;<br />srcQuad[0].y=0;</p><p>srcQuad[1].x=src->width-1;<br />srcQuad[1].y=0;</p><p>srcQuad[2].x=0;<br />srcQuad[2].y=src->height-1;</p><p>srcQuad[3].x=src->width-1;<br />srcQuad[3].y=src->height-1;</p><p>dstQuad[0].x=src->width*0.05;<br />dstQuad[0].y=src->height*0.33;</p><p>dstQuad[1].x=src->width*0.9;<br />dstQuad[1].y=src->height*0.25;</p><p>dstQuad[2].x=src->width*0.2;<br />dstQuad[2].y=src->height*0.7;</p><p>dstQuad[3].x=src->width*0.8;<br />dstQuad[3].y=src->height*0.9;</p><p>cvGetPerspectiveTransform(srcQuad,dstQuad,warp_matrix);</p><p>cvWarpPerspective(src,dst,warp_matrix);</p><p>cvNamedWindow("Perspective_Warp",1);<br />cvShowImage("Perspective_Warp",dst);<br />cvWaitKey(0);<br />}<br />cvReleaseImage(&dst);<br />cvDestroyAllWindows();<br />return 0;<br />}</p><p>//程式運行在 6-3運行結果.JPG
//例 6-4 對數極變換<br />//輸入:程式名 映像名 一個浮點數,程式預設為40<br />//輸出:變換之後的映像</p><p>#include "stdafx.h"<br />#include <cv.h><br />#include <highgui.h><br />#include <cxcore.h></p><p>int main(int argc, char** argv)<br />{<br />cvNamedWindow("lala",1);<br />IplImage* src1=cvLoadImage(argv[1],1);<br />cvShowImage("原映像src1",src1);<br />//double M=atof(argv[2]);//以浮點形式讀取<br />double M=40;<br />IplImage* dst=cvCreateImage(cvGetSize(src1),8,3);//depth=8,channels=3<br />IplImage* src2=cvCreateImage(cvGetSize(src1),8,3);<br />//cvShowImage("src2 create 之後",src2);//正確運行,灰的<br />cvLogPolar(src1,dst,cvPoint2D32f(src1->width/4,src1->height/2),M,CV_INTER_LINEAR+CV_WARP_FILL_OUTLIERS);<br />//輸入映像,輸出映像,變換的中心,幅度的尺度參數,<br />//(填充輸出映像所有像素,如果這些點有和外點對應的,則置零)+<br />//(表示矩陣由輸出映像到輸入映像的逆變換,並且因此可以直接用於像素插值。否則,函數從map_matrix中尋找逆變換)<br />cvShowImage("極數變換,原映像,1+8。本映像dst",dst);</p><p>cvLogPolar(src1,src2,cvPoint2D32f(src1->width/4,src1->height/2),M,CV_INTER_LINEAR|CV_WARP_INVERSE_MAP);<br />cvShowImage("極數變換,原映像,1|16。本映像src2",src2);</p><p>cvLogPolar(dst,src2,cvPoint2D32f(src1->width/4,src1->height/2),M,CV_INTER_LINEAR|CV_WARP_INVERSE_MAP);<br />cvShowImage("極數變換,dst,1|16。本映像src2",src2);</p><p>cvWaitKey(0);<br />cvReleaseImage(&src1);<br />cvReleaseImage(&src2);<br />cvReleaseImage(&dst);<br />cvDestroyWindow("lala");<br />return 0;<br />}<br />//總結:<br />//虧死啦,把輸出映像的參數格式弄錯了,費了半天勁</p><p>/*<br />//以下是參考例題,經運行,正常<br />#include "stdafx.h"<br />#include <cv.h><br />#include <highgui.h><br />#include <cxcore.h><br />int main(int argc, char** argv)<br />{<br />IplImage* src;</p><p>if( (argc == 2 )&& ((src=cvLoadImage(argv[1],1)) != 0 ))<br />{<br />cvNamedWindow("原映像",1);<br />cvShowImage("原映像",src);<br />IplImage* dst = cvCreateImage( cvGetSize(src), 8, 3 );<br />IplImage* src2 = cvCreateImage( cvGetSize(src), 8, 3 );<br />cvLogPolar( src, dst, cvPoint2D32f(src->width/2,src->height/2), 40, CV_INTER_LINEAR+CV_WARP_FILL_OUTLIERS );<br />cvLogPolar( dst, src2, cvPoint2D32f(src->width/2,src->height/2), 40, CV_INTER_LINEAR+CV_WARP_FILL_OUTLIERS+CV_WARP_INVERSE_MAP );<br />cvNamedWindow( "log-polar(極數變換)", 1 );<br />cvShowImage( "log-polar(極數變換)", dst );<br />cvNamedWindow( "inverse log-polar(反逆極數變換)", 1 );<br />cvShowImage( "inverse log-polar(反逆極數變換)", src2 );<br />cvWaitKey();<br />}<br />return 0;<br />}<br />*/
//例6-5 用cvDFT()加快卷積計算(離散傅立葉變換)<br />//本例用於熟悉流程,沒有輸入,固定矩陣,逐步查看結果<br />#include "stdafx.h"<br />#include <cv.h><br />#include <highgui.h></p><p>void printMat( CvMat* M)<br />{<br />printf("/n/n%d*%d:",M->rows,M->cols);<br />for (int i=0;i<M->rows;i++)<br />{<br />printf("/n第%d行:/n",i);<br />for (int j=0;j<M->cols;j++)<br />{<br />float temp=0;<br />temp=CV_MAT_ELEM(*M,float,i,j);<br />printf("%f",temp);<br />}<br />}<br />}</p><p>int main(int argc, char** argv)<br />{<br />CvMat* A=cvCreateMat(2,3,CV_32FC1);//size:M1*N1,這裡2*3<br />float vals1[]={1,2,3,4,5,6};<br />cvInitMatHeader(A,2,3,CV_32FC1,vals1);<br />//printMat(A);//成功<br />/*<br />2*3:<br />第0行:<br />1.000000 2.000000 3.000000<br />第1行:<br />4.000000 5.000000 6.000000<br />*/</p><p> CvMat* B=cvCreateMat(3,4,CV_32FC1);//size:M2*N2,這裡3*4<br /> float vals2[]={7,8,9,10,11,12,13,14,15,16,17,18};<br /> cvInitMatHeader(B,3,4,CV_32FC1,vals2);<br />//printMat(B);//成功<br />/*<br />3*4:<br />第0行:<br />7.000000 8.000000 9.000000 10.000000<br />第1行:<br />11.000000 12.000000 13.000000 14.000000<br />第2行:<br />15.000000 16.000000 17.000000 18.000000<br />*/</p><p> CvMat* C=cvCreateMat(4,6,CV_32FC1);//size:(A->rows+B->rows-1)*(A->cols+B->cols-1),這裡4*6<br />float vals3[]={19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42};<br />cvInitMatHeader(C,4,6,CV_32FC1,vals3);<br />//printMat(C);//成功<br />/*<br />4*6:<br />第0行:<br />19.000000 20.000000 21.000000 22.000000 23.000000 24.000000<br />第1行:<br />25.000000 26.000000 27.000000 28.000000 29.000000 30.000000<br />第2行:<br />31.000000 32.000000 33.000000 34.000000 35.000000 36.000000<br />第3行:<br />37.000000 38.000000 39.000000 40.000000 41.000000 42.000000<br />*/</p><p> int dft_M=cvGetOptimalDFTSize(A->rows+B->rows-1);//擷取向量的長度,返回一個相等或者較大的合適尺寸值<br />//printf("/ndft_M=%d",dft_M);//結果為4<br /> int dft_N=cvGetOptimalDFTSize(A->cols+B->cols-1);<br />//printf("/ndft_N=%d",dft_N);//結果為6</p><p> CvMat* dft_A=cvCreateMat(dft_M,dft_N,A->type);//4*6,浮點型,-431602080.000000<br /> CvMat* dft_B=cvCreateMat(dft_M,dft_N,B->type);//4*6,浮點型,-431602080.000000<br /> CvMat tmp;<br />//printf("here");//聲明成功</p><p> cvGetSubRect(dft_A,&tmp,cvRect(0,0,A->cols,A->rows));//返回輸入的映像或矩陣的矩形數組子集的矩陣頭<br />//arr:輸入數組。submat:指向矩形數組子集矩陣頭的指標。rect:以0座標為基準的ROI。</p><p> cvCopy(A,&tmp);<br />//printMat(A);//還是以前的</p><p> cvGetSubRect(dft_A,&tmp,cvRect(A->cols,0,dft_A->cols-A->cols,A->rows));<br />//printMat(&tmp);//2*3的-431602080.000000</p><p> cvZero(&tmp);<br />//printMat(&tmp);//全成了0</p><p> cvDFT(dft_A,dft_A,CV_DXT_FORWARD,A->rows);//CV_DXT_FORWARD:0<br />//printMat(dft_A);//做了傅立葉變換,我不認識了......<br />/*<br />4*6:<br />第0行:<br />21.000000 4.000000 -13.856405 -3.000000 1.7320507.000000<br />第1行:<br />6.000000 -9.026278 -7.830127 -0.633975 2.3660252.000000<br />第2行:<br />-15.000000 -3.000000 5.196152 0.000000 0.000000-5.000000<br />第3行:<br />-9.000000 10.026278 -0.830127 -2.366025 -0.633975 -3.000000<br />*/</p><p> cvGetSubRect(dft_B,&tmp,cvRect(0,0,B->cols,B->rows));<br /> cvCopy(B,&tmp);<br /> cvGetSubRect(dft_B,&tmp,cvRect(B->cols,0,dft_B->cols-B->cols,B->rows));<br /> cvZero(&tmp);<br /> cvDFT(dft_B,dft_B,CV_DXT_FORWARD,B->rows);<br />//printMat(dft_B);//做了傅立葉變換,我不認識了......<br />/*<br />4*6:<br />第0行:<br />150.000000 -10.499998 -64.951904 37.500000 2.598076-6.000000<br />第1行:<br />-32.000000 -21.650637 17.356407 -7.133974 -12.499998 0.000000<br />第2行:<br />-50.000000 -3.500000 -21.650633 12.500001 0.8660242.000000<br />第3行:<br />50.000000 21.650637 10.356408 -8.866026 12.500000 -2.000000<br />*/</p><p> cvMulSpectrums(dft_A,dft_B,dft_A,0);//頻譜乘法,A=A*B<br />//printMat(dft_A);//更不認識了<br />/*<br />4*6:<br />第0行:<br />3150.000000 -941.999878 -114.315392 -117.000000 57.157654 -42.000000<br />第1行:<br />-942.000000 331.327545 12.863465 34.098072 -8.954475 10.000000<br />第2行:<br />180.000000 122.999977 46.765366 -0.000000 0.0000034.000000<br />第3行:<br />-450.000000 225.672440 85.863457 28.901924 -23.954475 6.000000<br />*/</p><p> cvDFT(dft_A,dft_A,CV_DXT_INV_SCALE,C->rows);//CV_DXT_INV_SCALE:3,C->rows:4<br />//printMat(dft_A);//不認識<br />/*<br />4*6:<br />第0行:<br />7.000010 22.000006 45.999996 51.999992 46.999996 30.000006<br />第1行:<br />39.000011 101.000015 188.000000 209.000000 171.000000 102.000015<br />第2行:<br />59.000011 149.000015 272.000000 293.000000 235.000000 138.000000<br />第3行:<br />60.000000 139.000000 238.000000 253.000000 192.000000 108.000000<br />*/</p><p> cvGetSubRect(dft_A,&tmp,cvRect(0,0,C->cols,C->rows));//相當於複製<br />//printMat(dft_A);<br /> cvCopy(&tmp,C);<br />//printMat(&tmp);//和現在的dft_A是一樣的<br />//printMat(C);//和現在的dft_A是一樣的</p><p> cvReleaseMat(&dft_A);<br /> cvReleaseMat(&dft_B);</p><p>cvWaitKey(0);<br />return 0;<br />}<br />
使用映像進行傅立葉變換還沒有實現