程序是基于MFC的Gabor滤波
BOOL CDibImage::Gabor1(double sigma, double theta, double freq, double* gr)
{
double pi=3.1415926;
int x,y;
double xPrime,yPrime;
double theta1=theta*pi/180;
for (x = -int(sigma); x <= int(sigma); x++)
{
for (y = -int(sigma); y <= int(sigma); y++)
{
xPrime = x * cos(theta1) + y * sin(theta1);
yPrime = y * cos(theta1) - x * sin(theta1);
*(gr+(2*int(sigma)+1)*(x+int(sigma))+y+int(sigma))
=(1/(2*pi*pow(sigma,2)))*exp(-0.5*(pow(xPrime/sigma,2)+pow(yPrime/sigma,2)))*cos(2*pi*freq*xPrime);
}
}
return TRUE;
}以上是在DIB类里面编写的函数,应该是在指针处有问题。请各位大侠指点一下,下面是在VIEW类中的调用
void CGaborView::OnGaborfilter()
{
CGaborDoc* pDoc = GetDocument();
LPSTR lpDIB; // 指向DIB的指针
LPSTR lpDIBBits; // 指向DIB象素指针
LPSTR lpDIBReal; // 指向实部滤波后DIB的指针
LPSTR lpDIBImag; // 指向虚部滤波后DIB的指针 unsigned char* lpSrc; // 指向源图像的指针
unsigned char* lpSrc1; // 指向源图像实部滤波后的指针
unsigned char* lpSrc2; // 指向源图像虚部滤波后的指针 CSetting dlgSet;
double theta;
double sigma;
double freq;
double* gr=0; //滤波器实部
double* gi=0; //滤波器虚部
int i,j;
FLOAT fTemp; // 中间变量 lpDIB = (LPSTR) ::GlobalLock((HGLOBAL) pDoc->GetHDIB());
// 找到DIB图像象素起始位置
lpDIBBits = pDoc->GetDibImage()->FindDIBBits(lpDIB); if(dlgSet.DoModal()!=IDOK)
{
return;
}
theta = dlgSet.m_theta;
sigma = dlgSet.m_sigma;
freq = dlgSet.m_freq;
delete dlgSet;
BeginWaitCursor();
//构造滤波器实部和虚部
pDoc->GetDibImage()->Gabor1(sigma,theta,freq, gr);
pDoc->GetDibImage()->Gabor2(sigma,theta,freq, gi);
BOOL CDibImage::Gabor1(double sigma, double theta, double freq, double* gr)
{
double pi=3.1415926;
int x,y;
double xPrime,yPrime;
double theta1=theta*pi/180;
for (x = -int(sigma); x <= int(sigma); x++)
{
for (y = -int(sigma); y <= int(sigma); y++)
{
xPrime = x * cos(theta1) + y * sin(theta1);
yPrime = y * cos(theta1) - x * sin(theta1);
*(gr+(2*int(sigma)+1)*(x+int(sigma))+y+int(sigma))
=(1/(2*pi*pow(sigma,2)))*exp(-0.5*(pow(xPrime/sigma,2)+pow(yPrime/sigma,2)))*cos(2*pi*freq*xPrime);
}
}
return TRUE;
}以上是在DIB类里面编写的函数,应该是在指针处有问题。请各位大侠指点一下,下面是在VIEW类中的调用
void CGaborView::OnGaborfilter()
{
CGaborDoc* pDoc = GetDocument();
LPSTR lpDIB; // 指向DIB的指针
LPSTR lpDIBBits; // 指向DIB象素指针
LPSTR lpDIBReal; // 指向实部滤波后DIB的指针
LPSTR lpDIBImag; // 指向虚部滤波后DIB的指针 unsigned char* lpSrc; // 指向源图像的指针
unsigned char* lpSrc1; // 指向源图像实部滤波后的指针
unsigned char* lpSrc2; // 指向源图像虚部滤波后的指针 CSetting dlgSet;
double theta;
double sigma;
double freq;
double* gr=0; //滤波器实部
double* gi=0; //滤波器虚部
int i,j;
FLOAT fTemp; // 中间变量 lpDIB = (LPSTR) ::GlobalLock((HGLOBAL) pDoc->GetHDIB());
// 找到DIB图像象素起始位置
lpDIBBits = pDoc->GetDibImage()->FindDIBBits(lpDIB); if(dlgSet.DoModal()!=IDOK)
{
return;
}
theta = dlgSet.m_theta;
sigma = dlgSet.m_sigma;
freq = dlgSet.m_freq;
delete dlgSet;
BeginWaitCursor();
//构造滤波器实部和虚部
pDoc->GetDibImage()->Gabor1(sigma,theta,freq, gr);
pDoc->GetDibImage()->Gabor2(sigma,theta,freq, gi);
解决方案 »
- OCX 界面对话框 无法显示webBrower 大家帮忙看看?
- 当CreateProcess函数返回的进程ID不对时,如何在启动程序后获取程序窗口句柄
- 如何在mfc中判断某个编辑框中是否输入了数据?
- 怎样把新的数据加在已经保存的文件的后面
- 在线等:Activex注册失败(DllRegisterServer失败的返回代码是0x80040200),如何解决
- 请问如何用install shield将vc做的project打成setup安装程序?
- 怎样使一个文件夹变为共享》》
- 简单问题,各位帮帮忙,急用!!!
- 如何使用ADO打开已加密的数据库?
- 求一个vs2008c++的DCOM编程实例
- HTML中type为file的标签 即 浏览选择文件的那个 对应的接口是哪个啊?比如type为text的为IHTMLInputElement
- 如何获取进程被关闭的消息
看看pDoc是否有效指针
就是红色的语句那里存在问题,应该是等式左边的问题,但是对于指针没有很深入的理解,所以还请指教会不会是指针初始化的问题导致?我在调用这个函数之前初始化为double* gr=0,这样初始化没问题吗?在这里用到指针是为了保存一个二维数组的值,由于维数不确定所以在函数编写过程中只能使用指针代替
这里是MFC程序,读入一幅图像就有相应的pDoc,问题应该是在指针那里,但是对于指针越界这一块了解的不够深入所以没发现问题所在