OpenCV卷積操作
阿新 • • 發佈:2019-02-03
卷積操作,是各種影象處理的基礎,原理不難,在這裡不做贅述,網路上已經有了很多很好的例子,在這裡直接上程式碼。
注意程式碼中兩種的方法的使用及注意事項。
OpenCV卷積函式:
void cvFilter2D( const CvArr* src,
CvArr* dst,
const CvMat* kernel,
CvPoint anchor=cvPoint(-1,-1)
);
#include <cv.h> #include <highgui.h> using namespace std; int main() { IplImage* src1=cvLoadImage("D:\\Korea Documents\\Pictures\\Wallpaper\\Attitude.jpg"); IplImage* src=cvCreateImage(cvSize(700,400),src1->depth,src1->nChannels); cvResize(src1,src); IplImage* dst=cvCloneImage(src); /*Kernal的兩種建立方式*/ //1.cvmSet不支援分數!!! CvMat *k1; k1=cvCreateMat(3,3,CV_32FC1); /*cvmSet(k1,0,0,1/16); cvmSet(k1,0,1,2/16); cvmSet(k1,0,2,1/16); cvmSet(k1,1,0,2/16); cvmSet(k1,1,1,4/16); cvmSet(k1,1,2,2/16); cvmSet(k1,2,0,1/16); cvmSet(k1,2,1,2/16); cvmSet(k1,2,2,1/16);*/ cvmSet(k1,0,0,0.0625); cvmSet(k1,0,1,0.125); cvmSet(k1,0,2,0.0625); cvmSet(k1,1,0,0.125); cvmSet(k1,1,1,0.25); cvmSet(k1,1,2,0.125); cvmSet(k1,2,0,0.0625); cvmSet(k1,2,1,0.125); cvmSet(k1,2,2,0.0625); //這種方法很方便!! /*float k1[9]={1,2,1, 2,4,2, 1,2,1}; for(int i=0;i<9;i++) { k1[i]=(float)k1[i]/16; } CvMat k2=cvMat(3,3,CV_32F,&k1);*/ cvFilter2D(src,dst,k1);//卷積操作 cvNamedWindow("src"); cvNamedWindow("dst"); cvShowImage("src",src); cvShowImage("dst",dst); cvWaitKey(0); cvReleaseImage(&src); cvReleaseImage(&dst); cvDestroyAllWindows(); return 0; }
測試結果: