//在做项目的过程中把MATLAB翻译成c语言过程中发现使用cvfilter2D和Imfilter结果不同,但是Opencv2.0可以使用filter2D,据网上说结果一样,但是自己懒得移植整个工程,于是只能自己写了:
#include <cv.h>
#include <highgui.h>
#include <stdio.h>#include<iostream.h>
//Function Matlab filter
CvMat* imfilter2(CvMat* src_image,CvMat filter,CvMat* dst_image)
{
int R=src_image->rows;
int C=src_image->cols;
int start_row = int(19/2) ;//R-height
int start_col = int(19/2) ;
CvMat* Mid_Mat = cvCreateMat(R+2*start_row,C+2*start_col,CV_32FC1) ;//CvMat *mat3 = cvCreateMat( R,C, CV_32FC1 );
cvZero(Mid_Mat);
for (int i = 0; i < R; i++)
{
for (int j = 0; j < C; j++)
{
CV_MAT_ELEM(*Mid_Mat,float,i+start_row,j+start_col) = CV_MAT_ELEM(*src_image,float,i,j);//CV_MAT_ELEM( mat, float, 0, 0 ) = 1.f;
}
}
int end_row = R+2*start_row -1 - start_row ;
int end_col = C+2*start_col -1 - start_col ;
int filter_row = 19;int filter_col = 19;
for (i = start_row; i <= end_row; i++)
{
for (int j = start_col; j <= end_col; j++)
{
int tmp_row = i - start_row ;
int tmp_col = j - start_col ;
for (int m = 0; m < filter_row; m++)
{
for (int n = 0; n < filter_col; n++)
{
// dst_image(tmp_row,tmp_col) += Mid_Matrix(tmp_row + m,tmp_col + n)*filter(m,n) ;
CV_MAT_ELEM(*dst_image,float,tmp_row,tmp_col) +=CV_MAT_ELEM(*Mid_Mat,float,tmp_row + m,tmp_col + n )*CV_MAT_ELEM(filter,float,m,n) ;
}
}
}
}
/* for ( i=0; i<R; i++ )
{
for ( int j=0; j<C; j++ )
{
//float v1 = CV_IMAGE_ELEM( grayim, uchar, i, j);
float v2 = CV_MAT_ELEM( *dst_image, float, i,j);
printf("%f ",v2);
}
cout<<endl;
}*/
return dst_image;//CV_MAT_ELEM( mat, float, 0, 0 ) = 1.f;
}
//end func
void main()
{
float filter2[361]//这里把滤波器省了
IplImage *im = cvLoadImage( "C:\\test12.bmp");
int R=im->height;
int C=im->width;
IplImage* floatsrc=cvCreateImage(cvSize(C,R),IPL_DEPTH_32F,3);//在外面做???
IplImage* floathsv=cvCreateImage(cvSize(C,R),IPL_DEPTH_32F,3);
IplImage* grayim=cvCreateImage(cvSize(C,R),IPL_DEPTH_32F,1);
cvConvertScale(im,floatsrc,1.0/255.0,0);//归一化
cvCvtColor(floatsrc,floathsv,CV_BGR2HSV);
cvSplit(floathsv,NULL,NULL,grayim,NULL);
/* CvScalar s;
//Test grayim
for(int r=0;r<R;r++)
{
for(int c=0;c<C;c++)
{
s=cvGet2D(grayim,r,c);
printf("%f ",s.val[0]);
}
printf("\n");
}
*/
CvMat *src = cvCreateMat( R,C, CV_32FC1 ); ///< 注意这里的类型, < CV <bit depth><S|U|F>C<number of channels
cvZero(src);
cvConvert( grayim, src ); ///< 开辟了一片新内存
CvMat* dst=cvCreateMat(R,C,CV_32FC1) ;//存放结果
cvZero(dst);
//CvMat *filter = cvCreateMat( R,C, CV_32FC1 );
CvMat filter = cvMat(19,19, CV_32FC1,filter2); //将数组转换为Mat
//printf("%f",CV_MAT_ELEM( filter, float, 10,3));
imfilter2(src,filter, dst);
/// Test:if convert success
for ( int i=0; i<R; i++ )
{
for ( int j=0; j<C; j++ )
{
//float v1 = CV_IMAGE_ELEM( grayim, uchar, i, j);
float v2 = CV_MAT_ELEM( *dst, float, i,j);
printf("%f ",v2);
}
cout<<endl;
}
}