函数貌似很长,可是结构很简单,大家稍停一下看看哈。
我想显示出的图片是那种云雾状的有白色集中区的hough变换。
但是显示出来的不知什么东西。lpDIBBits:经过canny变换后的图像数据指针
LpHoughDibBits :用来存储hough变换后图像数据的指针BOOL CPreImageProcess::Hough(unsigned char *lpDIBBits, int lWidth, int lHeight ,unsigned char * LpHoughDibBits ,int& iMaxAngleNumber ,int& iMaxDist)
{   
//变换域的坐标
int iDist;
int iAngleNumber;
     
//计算变换域的尺寸
//最大距离
iMaxDist = (int) sqrt(lWidth*lWidth + lHeight*lHeight); //角度从0-180,每格2度
iMaxAngleNumber = 180; LpHoughDibBits = new unsigned char [iMaxAngleNumber*iMaxDist] ;
memset(LpHoughDibBits, 0, iMaxAngleNumber*iMaxDist);
   
// 计算图像每行的字节数
   int lLineBytes = (lWidth * 8+31)/32 * 4;
    
//像素值
unsigned char pixel; for(int j = 0; j <lHeight; j++)
{
for(int i = 0;i <lWidth; i++)
{
//目标图像中含有0和255外的其它灰度值
if(  ((unsigned char)*lpDIBBits + lLineBytes * j + i) != 255 && ( (unsigned char)*lpDIBBits + lLineBytes * j + i ) != 0)
*(lpDIBBits + lLineBytes * j + i )= 255 ;

pixel = (unsigned char)*lpDIBBits + lLineBytes * j + i;
//如果是黑点,则在变换域的对应各点上加1
if(pixel == 0)
{
//注意步长是2度
for(iAngleNumber=0; iAngleNumber<iMaxAngleNumber; iAngleNumber++)
{
iDist = (int) fabs(i*cos(iAngleNumber*2*pi/180.0) + \
j*sin(iAngleNumber*2*pi/180.0));
//变换域的对应点设为白的
*(LpHoughDibBits+iDist*iMaxAngleNumber+iAngleNumber) = *(LpHoughDibBits+iDist*iMaxAngleNumber+iAngleNumber)+1;
}
}
}
}
return TRUE ;
}望高手提示一下,谢谢!

解决方案 »

  1.   

    其实基本上是照住书上那些提取直线的hough变换中提取的一部分,不知为什么不行
      

  2.   

    似乎这部分代码的逻辑有问题
    应该是这样的吧....
    (unsigned char)*(lpDIBBits + lLineBytes * j + i)
    /---------------------------------------------------------------------
    //目标图像中含有0和255外的其它灰度值
    if( ((unsigned char)*lpDIBBits + lLineBytes * j + i) != 255 && ( (unsigned char)*lpDIBBits + lLineBytes * j + i ) != 0)
    *(lpDIBBits + lLineBytes * j + i )= 255 ;pixel = (unsigned char)*lpDIBBits + lLineBytes * j + i;
    //如果是黑点,则在变换域的对应各点上加1