⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 image.cpp

📁 这是一个实现Adaboost算法的程序
💻 CPP
📖 第 1 页 / 共 4 页
字号:
        TRY {
                pFile->Read(m_pData, dwFileLength);
        }
        CATCH (CFileException, e) {
                AfxMessageBox("Read error");
                GlobalFreePtr(m_pDib);  // free the DIB memory
                return FALSE;
        }
        END_CATCH

                SetDIB(true);
        Dib();
        return TRUE;
}

BOOL CImage::ReadFromDAT(CFile* pFile)
{
        LPBITMAPINFOHEADER pBMIH;
        DWORD dwFileLength = pFile->GetLength();
        WORD w,h;
        ///////just for MIT facebase!!!
        w = 256;
        h = 240;
        //w = 128;
        //h = 120;
        //for bern faces
        w = 512;
        h = 342;

        if(dwFileLength <= (DWORD)(w * h))
        {
                AfxMessageBox("Wrong Data!");
                return false;
        }

        DWORD dwBytes = Transform(w);//bytes per line

        m_dwLength = DWORD(dwBytes * h) + sizeof(BITMAPINFOHEADER)
                + sizeof(RGBQUAD) * 256;
        if (!AllocateMemory()) {
                AfxMessageBox("Allocmemory Error");
                return FALSE;}

        pBMIH=BMInfoHdPtr();
        pBMIH->biSize = sizeof(BITMAPINFOHEADER);
        pBMIH->biWidth = w;
        pBMIH->biHeight = h;
        pBMIH->biPlanes = 1;
        pBMIH->biBitCount = 8;
        pBMIH->biCompression = BI_RGB;
        pBMIH->biSizeImage = 0;
        pBMIH->biXPelsPerMeter = 0;
        pBMIH->biYPelsPerMeter = 0;
        pBMIH->biClrUsed = 0;
        pBMIH->biClrImportant = 0;
        m_pData = (BYTE*) m_pDib + sizeof(BITMAPINFOHEADER) +
                sizeof(RGBQUAD) * NumColors();
        CreateGreyPalette();

        //for bern faces
        pFile->Seek(32L, CFile::begin);

        TRY {
                pFile->Read(m_pData, (long(w) * h));
        }
        CATCH (CFileException, e) {
                AfxMessageBox("Read error");
                GlobalFreePtr(m_pDib);  // free the DIB memory
                return FALSE;
        }
        END_CATCH

                SetDIB(false);
        Dib();
        return TRUE;
}
/////////////////the property of the image////////////////
/////////Mean grey value
BYTE	CImage::MeanGrey()
{
        BYTE	avegrey;
        double sum = 0.0;
        DWORD i, imgsize;
        imgsize = (DWORD) Width() * Height();
        BYTE*	pData = Data();
        for(i=0;i<imgsize;i++)
                sum += pData[i];
        avegrey = (BYTE)(sum / imgsize);
        Dib();
        return avegrey;
}


double	CImage::CleanMeasure()
{
        double	diff	=	0.0;
        DWORD	i;
        BYTE	mean	=	MeanGrey();
        BYTE*	pData	=	Data();
        DWORD	imgSize	=	Width() * Height();
        for(i=0,diff=0.0; i<imgSize; i++)
                diff += (pData[i] - mean) * (pData[i] - mean);
        diff = sqrt(diff) / imgSize;
        Dib();
        return diff;
}

BYTE	CImage::Get8NeiborAver(BYTE* pGreyData, WORD w, WORD h, CPoint pos)
{
        double temp;
        int x = pos.x;
        int y = pos.y;
        int t = y * w + x;
        if(x == 0 && y != 0)
        {
                temp  =	pGreyData[t-w] + pGreyData[t-w+1] +
                        pGreyData[t+1] + 
                        pGreyData[t+w] + pGreyData[t+w+1];
                temp /= 5;
                return (BYTE)temp;
        }
        if(x != 0 && y == 0)
        {
                temp  =	pGreyData[t-1] + pGreyData[t+1] + 
                        pGreyData[t+w-1] + pGreyData[t+w] + pGreyData[t+w+1];
                temp /= 5;
                return (BYTE)temp;
        }
        if(x == 0 && y != 0)
        {
                temp  =	pGreyData[t+1] +
                        pGreyData[t+w] + pGreyData[t+w+1];
                temp /= 3;
                return (BYTE)temp;
        }

        if(x == w-1 && y != h-1)
        {
                temp  =	pGreyData[t-w-1] + pGreyData[t-w] +
                        pGreyData[t-1] + 
                        pGreyData[t+w-1] + pGreyData[t+w];
                temp /= 5;
                return (BYTE)temp;
        }
        if(x != w-1 && y == h-1)
        {
                temp  =	pGreyData[t-w-1] + pGreyData[t-w] + pGreyData[t-w+1] +
                        pGreyData[t-1] + pGreyData[t+1];
                temp /= 5;
                return (BYTE)temp;
        }
        if(x = w-1 && y == h-1)
        {
                temp  =	pGreyData[t-w-1] + pGreyData[t-w] + 
                        pGreyData[t-1];
                temp /= 3;
                return (BYTE)temp;
        }
        temp  =	pGreyData[t-w-1] + pGreyData[t-w] + pGreyData[t-w+1] +
                pGreyData[t-1]   + pGreyData[t+1] +
                pGreyData[t+w-1] + pGreyData[t+w] + pGreyData[t+w+1];
        temp /= 8;
        return (BYTE)temp;
}


///////////////////////////////////////////////
/*
* SSG, 1999.6. 2
* Save the data as text
*/
///////////////////////////////////////////////
BOOL CImage::SaveAsText(CString	 filename, BOOL	bIsBinary)
{
        int		w;
        long	l, size;
        char	buf[20];
        CFile	f;
        BYTE	*pData;

        pData = Data();

        if (m_pDib == NULL)
                return FALSE;
        if(Bits() != 8) {
                AfxMessageBox("It is not 8-greylevel image!");		
                return false;	
        }
        w = Width();
        size = w * Height();

        f.Open(filename, CFile::modeCreate | CFile::modeWrite );
        if(bIsBinary)
        {
                for(l=0; l<size; l++)
                {
                        if(*(pData + l) != 0)
                                sprintf(buf, "*");
                        else
                                sprintf(buf, ".");
                        f.Write(buf, strlen(buf));
                        if( (l+1)%w == 0){
                                f.Write("\n", 1);
                        }
                }
        }
        else
        {
                for(l=0; l<size; l++)
                {
                        sprintf(buf, "%3d ", *(pData + l) );
                        f.Write(buf, strlen(buf));
                        if( (l+1)%w == 0){
                                f.Write("\n", 1);
                        }
                }
        }
        f.Close();

        Dib();
        return TRUE;
}

BOOL CImage::ValidImage()
{
        if(m_dwLength == 0L || m_pData == NULL || m_pDib == NULL)
                return FALSE;
        else
                return TRUE;
}

/********************************************************************
///////////////////////////from the CImage///////////////////
********************************************************************/



BOOL CImage::Convert2I_Image()
{
        if(Bits() != 24)
                return FALSE;

        int		w = Width();
        int		h = Height();

        CImage	*pI_Img = new CImage(CSize(w, h), 256, 8);

        BYTE		*pI_Data = pI_Img->Data();
        BYTE		*pColorData = Data();

        long		size, l;
        double		I, Q;
        BYTE		R, G, B, Y;
        size = long(Width() * Height());
        for(l=0; l<size; l++)
        {
                B = *pColorData++;
                G = *pColorData++;
                R = *pColorData++;
                RGB2YIQ(R, G, B, Y, I, Q);
                *pI_Data++ = BYTE( I );
        }

        pI_Data = pI_Img->Dib();
        *this = *pI_Img;
        delete pI_Img;

        return TRUE;
}

BOOL CImage::GetRImage(CImage * pRImg)
{
        if(Bits() != 24)
                return FALSE;

        int		w = Width();
        int		h = Height();

        BYTE		*pRData = pRImg->Data();
        BYTE		*pColorData = Data();

        long		size, l;
        size = long(Width() * Height() * 3);

        for(l=0; l<size; l+=3)
                *pRData++ = *(pColorData+l+2);

        Dib();
        pRImg->Dib();

        return TRUE;
}

BOOL CImage::GetGImage(CImage * pGImg)
{
        if(Bits() != 24)
                return FALSE;

        int		w = Width();
        int		h = Height();

        BYTE		*pGData = pGImg->Data();
        BYTE		*pColorData = Data();

        long		size, l;
        size = long(Width() * Height() * 3);

        for(l=0; l<size; l+=3)
                *pGData++ = *(pColorData+l+1);

        Dib();
        pGImg->Dib();

        return TRUE;
}

BOOL CImage::GetBImage(CImage * pBImg)
{
        if(Bits() != 24)
                return FALSE;

        int		w = Width();
        int		h = Height();

        BYTE		*pBData = pBImg->Data();
        BYTE		*pColorData = Data();

        long		size, l;
        size = long(Width() * Height() * 3);

        for(l=0; l<size; l+=3)
                *pBData++ = *(pColorData+l);

        Dib();
        pBImg->Dib();

        return TRUE;
}

/*
* return paras:
* pfr:  f(u,v) 实部
* pfi:  f(u,v) 虚部
* pfm:  模
* pfa:  幅角
*/


BOOL CImage::CenterRotateInImagePlane(double angle, BOOL bClockWise)
{
        double	radianAngle;
        double	oldx, oldy;
        double  cofX, cofY, FTmp;
        double  SinCita, CosCita;
        int		i, j, x1;
        long	w, h, ImageSize;

        w = Width();
        h = Height();
        ImageSize = (long)w*h;

        CPoint fixpos = CPoint(w/2, h/2);
        if(bClockWise)
                radianAngle = angle*3.1415926/180.0;
        else
                radianAngle = -angle*3.1415926/180.0;
        SinCita = sin(radianAngle);
        CosCita = cos(radianAngle);

        CImage* pTempImg = new CImage;
        *pTempImg = *this;

        BYTE* pOriData = Data();
        BYTE* pNewData = pTempImg->Data();

        double t1, t2;
        long t3 = 0;
        for(j=0; j<h; j++)
        {
                t1 = SinCita * (j - fixpos.y);
                t2 = CosCita * (j - fixpos.y);
                t3 = j * w;
                for(i=0; i<w; i++)
                {
                        oldx = fixpos.x +  (CosCita * (i - fixpos.x) + t1);
                        oldy = fixpos.y +  (t2 - SinCita * (i - fixpos.x));
                        if(oldx < w-1 && oldy < h-1 && oldx >= 0 && oldy >= 0)
                        {	
                                cofX = oldx - int(oldx);
                                cofY = oldy - int(oldy);
                                x1 = ((int)oldy) * w + (int)oldx;
                                FTmp = (1-cofX) * (double)pOriData[x1] + cofX * (double)pOriData[x1 + 1];
                                FTmp = (1-cofY) * FTmp + cofY * ((1-cofX) * (double)pOriData[x1 + w] + cofX * (double)pOriData[x1 + w + 1]);
                                pNewData[j * w + i] = int (FTmp + 0.5);
                        }
                        else 
                                pNewData[j * w + i] = 0;
                }
        }

        pTempImg->Dib();
        *this = *pTempImg;
        Dib();
        delete pTempImg;
        return true;

}


DWORD CImage::ByteNumForOneLine(WORD nDIBWidth, int nBpp)
{
        DWORD dwBytes = (nDIBWidth * nBpp) / 32;
        if ((nDIBWidth * nBpp) % 32) 
                dwBytes ++;

        dwBytes *= 4;//bytes per line

        return	dwBytes;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -