1. 程式人生 > >OpenCV卷積操作

OpenCV卷積操作

卷積操作,是各種影象處理的基礎,原理不難,在這裡不做贅述,網路上已經有了很多很好的例子,在這裡直接上程式碼。

注意程式碼中兩種的方法的使用及注意事項。

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;
}




測試結果: