首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 其他教程 > 其他相关 >

【OpenCV】学习札记与源码分析: imread( )函数

2013-09-18 
【OpenCV】学习笔记与源码分析: imread( )函数引言imread()函数在opencv使用比较。imread()函数声明:boolBmpD

【OpenCV】学习笔记与源码分析: imread( )函数
引言

imread()函数在opencv使用比较。

imread()函数声明:
bool  BmpDecoder::readData(Mat& img){    uchar* data = img.data;    int step = (int)img.step;    bool color = img.channels() > 1;    uchar  gray_palette[256];    bool   result = false;    int  src_pitch = ((m_width*(m_bpp != 15 ? m_bpp : 16) + 7)/8 + 3) & -4;    int  nch = color ? 3 : 1;    int  y, width3 = m_width*nch;    if( m_offset < 0 || !m_strm.isOpened())        return false;    if( m_origin == IPL_ORIGIN_BL ){        data += (m_height - 1)*step;        step = -step;    }    AutoBuffer<uchar> _src, _bgr;    _src.allocate(src_pitch + 32);    if(!color){        if(m_bpp <= 8){            CvtPaletteToGray( m_palette, gray_palette, 1 << m_bpp );        }        _bgr.allocate(m_width*3 + 32);    }    uchar *src = _src, *bgr = _bgr;    try{        m_strm.setPos(m_offset);        switch(m_bpp){        /************************* 1 BPP ************************/        case 1:            for( y = 0; y < m_height; y++, data += step){                m_strm.getBytes( src, src_pitch );                FillColorRow1( color ? data : bgr, src, m_width, m_palette );                if( !color )                    icvCvt_BGR2Gray_8u_C3C1R( bgr, 0, data, 0, cvSize(m_width,1));            }            result = true;            break;        /************************* 4 BPP ************************/        case 4:            if( m_rle_code == BMP_RGB){                for( y = 0; y < m_height; y++, data += step )                {                    m_strm.getBytes( src, src_pitch );                    if( color )                        FillColorRow4( data, src, m_width, m_palette );                    else                        FillGrayRow4( data, src, m_width, gray_palette );                }                result = true;            }            else if( m_rle_code == BMP_RLE4 ) // rle4 compression            {                uchar* line_end = data + width3;                y = 0;                for(;;)                {                    int code = m_strm.getWord();                    int len = code & 255;                    code >>= 8;                    if( len != 0 ) // encoded mode                    {                        PaletteEntry clr[2];                        uchar gray_clr[2];                        int t = 0;                        clr[0] = m_palette[code >> 4];                        clr[1] = m_palette[code & 15];                        gray_clr[0] = gray_palette[code >> 4];                        gray_clr[1] = gray_palette[code & 15];                        uchar* end = data + len*nch;                        if( end > line_end ) goto decode_rle4_bad;                        do                        {                            if( color )                                WRITE_PIX( data, clr[t] );                            else                                *data = gray_clr[t];                            t ^= 1;                        }                        while( (data += nch) < end );                    }                    else if( code > 2 ) // absolute mode                    {                        if( data + code*nch > line_end ) goto decode_rle4_bad;                        m_strm.getBytes( src, (((code + 1)>>1) + 1) & -2 );                        if( color )                            data = FillColorRow4( data, src, code, m_palette );                        else                            data = FillGrayRow4( data, src, code, gray_palette );                    }                    else                    {                        int x_shift3 = (int)(line_end - data);                        int y_shift = m_height - y;                        if( code == 2 )                        {                            x_shift3 = m_strm.getByte()*nch;                            y_shift = m_strm.getByte();                        }                        len = x_shift3 + ((y_shift * width3) & ((code == 0) - 1));                        if( color )                            data = FillUniColor( data, line_end, step, width3,                                                 y, m_height, x_shift3,                                                 m_palette[0] );                        else                            data = FillUniGray( data, line_end, step, width3,                                                y, m_height, x_shift3,                                                gray_palette[0] );                        if( y >= m_height )                            break;                    }                }                result = true;            decode_rle4_bad: ;            }            break;        /************************* 8 BPP ************************/        case 8:            if( m_rle_code == BMP_RGB )            {                for( y = 0; y < m_height; y++, data += step )                {                    m_strm.getBytes( src, src_pitch );                    if( color )                        FillColorRow8( data, src, m_width, m_palette );                    else                        FillGrayRow8( data, src, m_width, gray_palette );                }                result = true;            }            else if( m_rle_code == BMP_RLE8 ) // rle8 compression            {                uchar* line_end = data + width3;                int line_end_flag = 0;                y = 0;                for(;;)                {                    int code = m_strm.getWord();                    int len = code & 255;                    code >>= 8;                    if( len != 0 ) // encoded mode                    {                        int prev_y = y;                        len *= nch;                        if( data + len > line_end )                            goto decode_rle8_bad;                        if( color )                            data = FillUniColor( data, line_end, step, width3,                                                 y, m_height, len,                                                 m_palette[code] );                        else                            data = FillUniGray( data, line_end, step, width3,                                                y, m_height, len,                                                gray_palette[code] );                        line_end_flag = y - prev_y;                    }                    else if( code > 2 ) // absolute mode                    {                        int prev_y = y;                        int code3 = code*nch;                        if( data + code3 > line_end )                            goto decode_rle8_bad;                        m_strm.getBytes( src, (code + 1) & -2 );                        if( color )                            data = FillColorRow8( data, src, code, m_palette );                        else                            data = FillGrayRow8( data, src, code, gray_palette );                        line_end_flag = y - prev_y;                    }                    else                    {                        int x_shift3 = (int)(line_end - data);                        int y_shift = m_height - y;                        if( code || !line_end_flag || x_shift3 < width3 )                        {                            if( code == 2 )                            {                                x_shift3 = m_strm.getByte()*nch;                                y_shift = m_strm.getByte();                            }                            x_shift3 += (y_shift * width3) & ((code == 0) - 1);                            if( y >= m_height )                                break;                            if( color )                                data = FillUniColor( data, line_end, step, width3,                                                     y, m_height, x_shift3,                                                     m_palette[0] );                            else                                data = FillUniGray( data, line_end, step, width3,                                                    y, m_height, x_shift3,                                                    gray_palette[0] );                            if( y >= m_height )                                break;                        }                        line_end_flag = 0;                    }                }                result = true;            decode_rle8_bad: ;            }            break;        /************************* 15 BPP ************************/        case 15:            for( y = 0; y < m_height; y++, data += step )            {                m_strm.getBytes( src, src_pitch );                if( !color )                    icvCvt_BGR5552Gray_8u_C2C1R( src, 0, data, 0, cvSize(m_width,1) );                else                    icvCvt_BGR5552BGR_8u_C2C3R( src, 0, data, 0, cvSize(m_width,1) );            }            result = true;            break;        /************************* 16 BPP ************************/        case 16:            for( y = 0; y < m_height; y++, data += step )            {                m_strm.getBytes( src, src_pitch );                if( !color )                    icvCvt_BGR5652Gray_8u_C2C1R( src, 0, data, 0, cvSize(m_width,1) );                else                    icvCvt_BGR5652BGR_8u_C2C3R( src, 0, data, 0, cvSize(m_width,1) );            }            result = true;            break;        /************************* 24 BPP ************************/        case 24:            for( y = 0; y < m_height; y++, data += step )            {                m_strm.getBytes( src, src_pitch );                if(!color)                    icvCvt_BGR2Gray_8u_C3C1R( src, 0, data, 0, cvSize(m_width,1) );                else                    memcpy( data, src, m_width*3 );            }            result = true;            break;        /************************* 32 BPP ************************/        case 32:            for( y = 0; y < m_height; y++, data += step )            {                m_strm.getBytes( src, src_pitch );                if( !color )                    icvCvt_BGRA2Gray_8u_C4C1R( src, 0, data, 0, cvSize(m_width,1) );                else                    icvCvt_BGRA2BGR_8u_C4C3R( src, 0, data, 0, cvSize(m_width,1) );            }            result = true;            break;        default:            assert(0);        }    }    catch(...)    {    }    return result;}
=========================================================转载请注明出处:http://blog.csdn.net/songzitea/article/details/11096287=========================================================

热点排行