让opencv读取tif图象

来源:互联网 发布:章燎原的学历知乎 编辑:程序博客网 时间:2024/04/30 08:57

(如转载请注明出处)

花了imagesoft一个上午时间,终于改好了,问题不在libtiff,而是opencv的问题,发现问题后在网上搜了一下,找不到原因,而同样的图象在freeimage和cximage都是能打开的。都是使用libtiff,没道理呀,下载最新的libtiff,覆盖进去重新生成dll,还是不行;这也难不倒我,从freeimage提取libtiff,覆盖,编译,运行,仍然不行。我晕。没办法,上法宝,跟踪调试,如此这般,终于找到原因了,个中苦乐就不说了,直接说怎么修改好了。

 

修改grfmt_tiff.cpp

1) bool TiffDecoder::readHeader()

没具体分析,反正是compression不对,直接注释掉了,有时间再来慢慢想

        if( TIFFRGBAImageOK( tif, errmsg ) &&
            TIFFGetField( tif, TIFFTAG_IMAGEWIDTH, &width ) &&
            TIFFGetField( tif, TIFFTAG_IMAGELENGTH, &height ) &&
            TIFFGetField( tif, TIFFTAG_PHOTOMETRIC, &photometric )/* &&
            (!TIFFGetField( tif, TIFFTAG_COMPRESSION, &compression ) ||
            (compression != COMPRESSION_LZW &&
             compression != COMPRESSION_OJPEG))*/)

2) bool  TiffDecoder::readData( Mat& img )

我手头有些图读TIFFTAG_ROWSPERSTRIP属性返回0,到freeimage跟踪去看,一回事,既然不行,改!

/*
        if( (!is_tiled &&
            TIFFGetField( tif, TIFFTAG_ROWSPERSTRIP, &tile_height0 )) ||
            (is_tiled &&
            TIFFGetField( tif, TIFFTAG_TILEWIDTH, &tile_width0 ) &&
            TIFFGetField( tif, TIFFTAG_TILELENGTH, &tile_height0 )))
*/
  if(!is_tiled)
  {
   TIFFGetField( tif, TIFFTAG_ROWSPERSTRIP, &tile_height0 );
  }

  if(is_tiled)
  {
   TIFFGetField( tif, TIFFTAG_TILEWIDTH, &tile_width0 );
   TIFFGetField( tif, TIFFTAG_TILELENGTH, &tile_height0 );
  }

改了以上两步,已经能读一部分tif了,但还有一些tif仍然读不出来,继续跟踪

 

修改image.cpp

3) bool  CvvImage::Create( int w, int h, int bpp, int origin )
这里限制了图象大小为10000,改掉

    //const unsigned max_img_size = 10000;

    if( (bpp != 8 && bpp != 24 && bpp != 32) ||
        /*(unsigned)w >=  max_img_size || (unsigned)h >= max_img_size ||*/
        (origin != IPL_ORIGIN_TL && origin != IPL_ORIGIN_BL))
    {
        assert(0); // most probably, it is a programming error
        return false;
    }

如此,大功告成。

 

原创粉丝点击