首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 平面设计 > 图形图像 >

关于Opencv中cvFilter2D的使用有关问题

2013-09-07 
关于Opencv中cvFilter2D的使用问题最近需要使用卷积,用到了cvFilter2D,输入和输出必须是IplImage类吗?CvMa

关于Opencv中cvFilter2D的使用问题
    最近需要使用卷积,用到了cvFilter2D,输入和输出必须是IplImage类吗?CvMat类可以吗?
    自己做了几个实验,但是好像实验本身有问题,不知道哪里出了错
    代码如下:

#include <iostream>
#include <highgui.h>
#include <cv.h>
#include <afx.h>
using namespace std;

int main(int argc,char *argv[])
{
//创建CvMat类并0初始化
   CvMat* mat = cvCreateMat(3,3,CV_32FC1); //卷积模板
   CvMat* f = cvCreateMat(4,3,CV_32SC1);   //输入
   cvZero(mat);
   cvZero(f);
   //CvMat* g = cvCreateMat(4,3,CV_32FC1);   //输出
   //cvZero(g);
   IplImage* pg = cvCreateImage(cvGetSize(f),IPL_DEPTH_32F,1);  //输出

   //赋值操作
   int row,col;
   for (row=0;row<mat->height;row++)
   {
   float* pData=(float*)(mat->data.ptr+row*mat->step);//获取第row行的行首指针,因为数据类型为浮点型,因此,通过data.ptr与step获得的字节指针需要转换为float* 这样的指针
   for (col=0;col<mat->width;col++)
   {
   *pData = 1;
   pData++;//因为,指针后移一位,也即是指向下一个浮点数
   }
   }
   for (row=0;row<f->height;row++)
   {
   int* pData=(int*)(f->data.ptr+row*f->step);//获取第row行的行首指针,因为数据类型为浮点型,因此,通过data.ptr与step获得的字节指针需要转换为int* 这样的指针
   for (col=0;col<f->width;col++)
   {
   *pData = (row+col);
   pData++;//因为,指针后移一位,也即是指向下一个浮点数
   }
   }

   //输入 CvMat类转换为IplImage类
   IplImage* pf = cvCreateImage(cvGetSize(f),IPL_DEPTH_32F,1);
   cvGetImage(f,pf);

   //显示CvMat里的值
   for (row=0;row<mat->height;row++)

float* pData=(float*)(mat->data.ptr+row*mat->step);//我们通过转换成float*这样的指针
for (col=0;col<mat->width;col++)
{
std::cout<<*pData<<" ";
pData++;//指向下一个元素
}
cout<<endl;
}
for (row=0;row<f->height;row++)

int* pData=(int*)(f->data.ptr+row*f->step);//我们通过转换成int*这样的指针
for (col=0;col<f->width;col++)
{
std::cout<<*pData<<" ";
pData++;//指向下一个元素
}
cout<<endl;
}

//进行卷积
cvFilter2D( pf, pg, mat ); //wrong!



return 0;
}


    实验结果如下:
关于Opencv中cvFilter2D的使用有关问题
    请问我这是哪里出了问题? opencv cvFilter2D CvMat IplImage
[解决办法]
Filter2D
对图像做卷积
void cvFilter2D( const CvArr* src, CvArr* dst, const CvMat* kernel, CvPoint anchor=cvPoint(-1,-1)); #define cvConvolve2D cvFilter2D
src
输入图像.
dst
输出图像.
kernel
卷积核, 单通道浮点矩阵. 如果想要应用不同的核于不同的通道,先用 cvSplit 函数分解图像到单个色彩通道上,然后单独处理。
anchor
核的锚点表示一个被滤波的点在核内的位置。 锚点应该处于核内部。缺省值 (-1,-1) 表示锚点在核中心。
函数 cvFilter2D 对图像进行线性滤波,支持 In-place 操作。当核运算部分超出输入图像时,函数从最近邻的图像内部象素差值得到边界外面的象素值。

 
核心是将图像IplImage结构转换为图像数组。
例子:
#include <highgui.h>  
#include <cv.h>  
#include <stdio.h>  
 
int main(int argc,char**argv) 

    IplImage* src, *dst; 
    float k[9] = { 1.0, -2.0, 1.0,
               4.0, -2.0, -1.0,
       4.0, -2.0, 2.0 };  //核  
    CvMat km = cvMat( 3, 3, CV_32FC1, k );  //构造单通道浮点矩阵,将图像IplImage结构转换为图像数组  
     
    src = cvLoadImage( "lena.jpg" ); 
    dst = cvCreateImage( cvGetSize(src), IPL_DEPTH_8U, 3 ); 
    cvNamedWindow( "src", 0 ); 
    cvShowImage( "src", src ); 
    cvNamedWindow( "Filtering", 0 ); 
    cvFilter2D( src, dst, &km, cvPoint( -1, -1 ) );  //设参考点为核的中心  
    cvShowImage( "Filtering", dst ); 
    cvWaitKey(0); 


    cvReleaseImage( &src ); 
    cvReleaseImage( &dst ); 
    cvDestroyWindow("src");
    cvDestroyWindow("Filtering");
    return 0; 

 

热点排行