针对MATLAB(imfilter)翻译C语言(opencv)遇到的问题

//在做项目的过程中把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;
    }


 
 


   
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值