原来一直做的是8位图,现在改成24位图了,以下是获取灰度值方法,大家来看对不对,谢谢了。
1.首先打开一张24位BMP图,将读到的数据保存在m_pDibBits中。
定义:unsigned char *m_pDibBits;
2.将图转为灰度图像
unsigned char* lpSrc1;
    unsigned char* lpSrc2;
double result=0;    for (int i = 0; i <  m_height; i++)
{
lpSrc1 = (unsigned char *)m_pDibBits + m_width *3* i;
    for(int j = 0; j < m_width; j++)
{
     lpSrc2 = lpSrc1+j*3;
result=0.114*(*(lpSrc2+0))+0.587*(*(lpSrc2+1))+0.3*(*(lpSrc2+2));
*(lpSrc2+0)=(BYTE)result;
*(lpSrc2+1)=(BYTE)result;
*(lpSrc2+2)=(BYTE)result;
}
}
3.进行图像的二值化
unsigned char* lpSrc; for(int i = 0; i <m_height*m_width*lBitCount/8; i++)
{

if(m_pDibBits[i]>thresholdValue)
m_pDibBits[i]=255;
 else
m_pDibBits[i]=0;
}
4.循环去找寻图像亮值
这段代码该如何写呢?

解决方案 »

  1.   

    你怎么不用opencv二值化的函数呢
      

  2.   

    置灰二值化都完成了应该很好写了呀。for(int x=0; x<m_height;x++)
       {
         for(int y=0; y<m_width*lbitCount/8;y++)
           {
             if(m_pDbiBits[x*m_width*lbitCount/8+y]==255)  
                 // 输出亮点坐标
         printf("xPos = %d,yPos = %d",x,y/lbitCount*8);
           }
       }
      

  3.   

    话说上面的x和y好像写反了,你看着改改应该就能用了
    没有看到有错呀。
    if(m_pDbiBits[x*m_width*lbitCount/8+y]==255)?这句?
      

  4.   

    哦,对的就好。主要是通过找寻图像的中心,比如这个图用这个代码就可以找出图像的中心吗?
    for(int x=0; x<m_height;x++)
       {
         for(int y=0; y<m_width*lbitCount/8;y++)
           {
             if(m_pDbiBits[x*m_width*lbitCount/8+y]==255)  
                 // 输出亮点坐标
         printf("xPos = %d,yPos = %d",x,y/lbitCount*8);
           }
       }
      

  5.   

    哦,对的就好。主要是通过找寻图像的中心,比如这个图用这个代码就可以找出图像的中心吗?
    for(int x=0; x<m_height;x++)
       {
         for(int y=0; y<m_width*lbitCount/8;y++)
           {
             if(m_pDbiBits[x*m_width*lbitCount/8+y]==255)  
                 // 输出亮点坐标
         printf("xPos = %d,yPos = %d",x,y/lbitCount*8);
           }
       }
    这段代码注释写的很清楚了,就是遍历整个图像,输出图像中像素值为255的亮点的坐标。不是找图像的中心。图像的中心也不用找啊,图像的中心不就是图像的中心点吗?
      

  6.   

    哦,对的就好。主要是通过找寻图像的中心,比如这个图用这个代码就可以找出图像的中心吗?
    for(int x=0; x<m_height;x++)
       {
         for(int y=0; y<m_width*lbitCount/8;y++)
           {
             if(m_pDbiBits[x*m_width*lbitCount/8+y]==255)  
                 // 输出亮点坐标
         printf("xPos = %d,yPos = %d",x,y/lbitCount*8);
           }
       }
    这段代码注释写的很清楚了,就是遍历整个图像,输出图像中像素值为255的亮点的坐标。不是找图像的中心。图像的中心也不用找啊,图像的中心不就是图像的中心点吗?
    通过遍历整个图像的亮点,记住起亮点的始点和终点,然后运算后得出中心位置,是这样的吧。
      

  7.   

    话说上面的x和y好像写反了,你看着改改应该就能用了
    没有看到有错呀。
    if(m_pDbiBits[x*m_width*lbitCount/8+y]==255)?这句?我是说我把x和y 的顺序写错了,应该是x对应m_width,y对应m_Hight,其余都对。另外,上面程序遍历亮点的时候只是输出了坐标值,并没有记录,你要是需要记录,就把x和y 分别push到两个vector里面,然后分别去取vector的平均值,就得到亮点坐标的均值。
      

  8.   

    话说上面的x和y好像写反了,你看着改改应该就能用了
    没有看到有错呀。
    if(m_pDbiBits[x*m_width*lbitCount/8+y]==255)?这句?我是说我把x和y 的顺序写错了,应该是x对应m_width,y对应m_Hight,其余都对。另外,上面程序遍历亮点的时候只是输出了坐标值,并没有记录,你要是需要记录,就把x和y 分别push到两个vector里面,然后分别去取vector的平均值,就得到亮点坐标的均值。
    恩好的,正在把值记录在vector里面。
    应该是这样哇
    是输出的时候
    printf("xPos = %d,yPos = %d",x,y/lbitCount*8);
    改为
    printf("xPos = %d,yPos = %d",y/lbitCount*8,,x);