我的数据时怎么丢失的?

那朵花 发布于 2013/03/22 16:07
阅读 168
收藏 0
我写了一个mfc的dll以供delphi调用
其中我写了一个自定义的类CDib用来处理图像的
这个类的定义如下:
C/C++ code
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
class CDib : public CObject
{
public:
    CDib(void);//构造函数,初始化函数成员
    ~CDib(void);//析构函数,释放内存空间
    BOOL LoadFromFile(LPCTSTR lpszPath);//从文件加载位图
    BOOL SaveToFile(LPCTSTR lpszPath);//将位图保存到文件
    BOOL Create1BitBMP(unsigned char* chData,int width,int height);//创建一个单色位图
    LPCTSTR GetFileName();//获取位图文件名
    LONG GetWidth();//获取位图宽度
    LONG GetHeight();//获取位图高度
    CSize GetDimension();//获取位图的高度和宽度 
    DWORD GetSize();//获取位图大小
    WORD GetBitCount();//获取单个像素所占位数
    UINT GetLineByte();//获取每行像素所占字节数
    UINT GetRowByte();//获取每列像素所占字节数
    DWORD GetNumOfColor();//获取位图颜色数
    LPRGBQUAD GetRgbQuad();//获取位图颜色表
    LPBYTE GetData();//获取位图数据
    BOOL RgbToGrade();//将24位真彩图转8位灰度图
    BOOL Threshold();//利用OSTU值二值化
    BOOL Extraction();//把图片中某个部分提取出来成为新的图片
    BOOL Erosion(int (*)[3]);//二值化图像的腐蚀
    BOOL Dilation(int (*)[3]);//二值化图像的起始位置
    BOOL HasRgbQuad();//判断是否含有颜色表
    BOOL IsGrade();//判断是否是灰度图
    BOOL IsValid();//判断位图是否有效
  
protected:
    DWORD CalcRgbQuadLength();//计算位图颜色表长度
    BOOL MakePalette();//根据颜色表生成调色板
    UINT OSTU();//计算图片的OSTU自适应阀值
    Position PlatePosition();//计算车牌图片中车牌的位置
    void Empty(BOOL bflag=TRUE);//清理空间
private:
    CString m_FileName;//位图文件名
    LPBITMAPFILEHEADER m_lpBmpFileHeader;//位图文件头,需动态分配和释放
    LPBYTE m_lpDib;//位图指针,包含除位图文件头的所有内容,需动态分配和释放
    LPBITMAPINFO m_lpBmpInfo;//位图信息指针
    LPBITMAPINFOHEADER m_lpBmpInfoHeader;//位图信息头指针
    LPRGBQUAD m_lpRgbQuad;//位图颜色表指针
    LPBYTE m_lpData;//位图数据指针
    HPALETTE m_hPalette;//调色板句柄
    BOOL m_bHasRgbQuad;//是否有调色板
    BOOL m_bValid;//位图是否有效    
};

被调用的过程中
跟踪到以下代码的时候编译器发现认不得CDib里面的成员了
C/C++ code
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
//计算图片OSTU自适应阀值
UINT CDib::OSTU()
{
    UINT width=GetWidth();
    UINT height=GetHeight();
    UINT x=0,y=0;
    UINT pixelCount[256];
    float pixelPro[256];
    UINT i,j,pixelSum=width*height,threshold;
    unsigned char *data=(unsigned char*)GetData();
    UINT nLineByte=GetLineByte();
    //初始化
    for(i = 0; i < 256; i++)
    {
        pixelCount[i] = 0;
        pixelPro[i] = 0;
    }
  
    //统计灰度级中每个像素在整幅图像中的个数(像素在灰度级中的个数)
    for(i = y; i < height; i++)
    {
        for(j = x;j <width;j++)
        {
            pixelCount[data[i * nLineByte + j]]++;
        }
    }
  
  
    //计算每个像素在整幅图像中的比例(灰度级比率)
    for(i = 0; i < 256; i++)
    {
        pixelPro[i] = (float)(pixelCount[i]) / (float)(pixelSum);
    }
  
    //经典ostu算法,得到前景和背景的分割
    //遍历灰度级[0,255],计算出方差最大的灰度值,为最佳阈值
    float w0, w1, u0tmp, u1tmp, u0, u1, u,deltaTmp, deltaMax = 0;
    for(i = 0; i < 256; i++)
    {
        w0 = w1 = u0tmp = u1tmp = u0 = u1 = u = deltaTmp = 0;
  
        for(j = 0; j < 256; j++)
        {
            if(j <= i) //背景部分
            {
                w0 += pixelPro[j];
                u0tmp += j * pixelPro[j];
            }
            else //前景部分
            {
                w1 += pixelPro[j];
                u1tmp += j * pixelPro[j];
            }
        }
  
        u0 = u0tmp / w0;
        u1 = u1tmp / w1;
        u = u0tmp + u1tmp;
        //计算方差
        deltaTmp = w0 * (u0 - u)*(u0 - u) + w1 * (u1 - u)*(u1 - u);
        if(deltaTmp > deltaMax)
        {
            deltaMax = deltaTmp;
            threshold = i;
        }
    }
    //返回最佳阈值;
    return threshold;
}

这个函数是被
BOOL Threshold();//利用OSTU值二值化
所调用
整个类是在以下函数中被调用的
C/C++ code
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
//Win32图像二值化
BOOL Win32BMPThreshould(LPCTSTR srcFileName,LPCTSTR dstFileName)
{
     if(srcFileName==NULL||dstFileName==NULL) return FALSE;
     CDib n_dib;
     if(n_dib.LoadFromFile(srcFileName)==FALSE) return FALSE;
     if(n_dib.RgbToGrade()==FALSE) return FALSE;
     if(n_dib.Threshold()==FALSE) return FALSE;
     int Structure[3][3]={0,1,0,
                          1,1,0,
                          0,0,0};
     if(n_dib.Erosion(Structure)==FALSE) return FALSE;
     if(n_dib.Dilation(Structure)==FALSE) return FALSE;
     if(n_dib.Extraction()==FALSE) return FALSE;
     if(n_dib.SaveToFile(dstFileName)==FALSE) return FALSE;
     Win32BMPReduce(dstFileName,dstFileName,112,20);
     Win32Bitmap(dstFileName);
     return TRUE;
}
加载中
返回顶部
顶部