标题:C语言 jpg文件保存为uchar数组之后,如何将该数组uchar数组转换成IplImage对 ...
只看楼主
sdwdrdfcercd
Rank: 1
等 级:新手上路
帖 子:3
专家分:0
注 册:2018-7-4
结帖率:50%
已结贴  问题点数:20 回复次数:3 
C语言 jpg文件保存为uchar数组之后,如何将该数组uchar数组转换成IplImage对象
  已知条件  jpg文件保存的uchar数组   求 IplImage  之前的思路是uchar数组——》Mat——》IplImage 有问题
搜索更多相关主题的帖子: C语言 jpg 文件 数组 对象 
2018-07-04 16:01
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:507
帖 子:8890
专家分:53117
注 册:2011-1-18
得分:20 
为什么不用 cv::Mat,而是快被废弃的 IplImage ? 算了,只是好奇问问而已。
红色代码就是你需要的

int main( void )
{
    FILE* f = fopen( "d:\\a.jpg", "rb" );
    if( f )
    {
        fseek( f, 0, SEEK_END );
        long n = ftell( f );
        fseek( f, 0, SEEK_SET );
        void* p = malloc( n );
        if( p )
        {
            fread( p, 1, n, f );

            CvMat mCvmat = cvMat( n, 1, CV_8UC1, p );
            IplImage* pIplImg = cvDecodeImage( &mCvmat, CV_LOAD_IMAGE_ANYDEPTH|CV_LOAD_IMAGE_ANYCOLOR );

            if( pIplImg )
            {
                cvShowImage( "", pIplImg );
                cvWaitKey( 0 );
            }

            free( p );
        }
        fclose( f );
    }
}
2018-07-04 16:56
sdwdrdfcercd
Rank: 1
等 级:新手上路
帖 子:3
专家分:0
注 册:2018-7-4
得分:0 
jpg变成二进制文件抄的这个 https://bbs.bccn.net/thread-472595-1-1.html  之后    昨晚根据你的建议 运行一个小DEMO直接运行  然后放到如下项目 跑不通
后来 把原项目的  if ((fp=fopen(cmd, "rb")) == NULL)  return; 替换成2楼的  fp= fopen( cmd, "rb" );if(fp){}之前的思路也是jpg->cvmat(写成mat了)->IplImage
红色字体的地方 原来的第一张图片是300*211 cvMat函数就这样用了 IplImage这个对象下一步要用的原材料 (xxx.jpg->IplImage(cvLoadImage)考虑的是传的就是字节流数组) 谢谢2L  问题解决了 等你给个回复再结贴可好 @rjsp
//hellobike
    buffsize = _filesize(fp);
    fprintf( stderr, " %d indexes...\n", cmd );
    buff = (char *)malloc(buffsize*sizeof(char));//buff就是uchar数组
    fread(buff, buffsize, 1, fp);
    for (i=0; i<10; i++)    //显示前10个字符
        printf("%x ", (unsigned char)buff[i]);
    //cv:: Mat img = cv::imdecode(buff,CV_LOAD_IMAGE_COLOR);
    //=======
        //mat =cvMat(300,211,CV_8UC1, buff); //300*211像素的图片
       // myimage = cvDecodeImage( &mat, 1 );
         
            mat =cvMat(buffsize,1,CV_8UC1, buff);
         myimage  = cvDecodeImage( &mat, CV_LOAD_IMAGE_ANYDEPTH|CV_LOAD_IMAGE_ANYCOLOR );

        if( ! myimage )
            fatal_error( "byte unable to load image from %s byte", cmd );
        nn= sift_features( myimage, &featn );
        fprintf( stderr, "byte Found %d features.byte\n", nn );
     free(buff);
       //hellobike
2018-07-05 10:20
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:507
帖 子:8890
专家分:53117
注 册:2011-1-18
得分:0 
回复 3楼 sdwdrdfcercd
每一个字我都认识,就是组合在一起完全看不懂你在说什么

如果可以用 cv::Mat,那更简单
#include <fstream>
#include <vector>
using namespace std;

int main( void )
{
    std::vector<char> data;
    {
        std::ifstream file( "d:\\a.txt", std::ios_base::binary );
        if( !file )
            return 1;
        file.seekg( 0, std::ios::end );
        std::ifstream::pos_type size = file.tellg();
        file.seekg( 0, std::ios::beg );
        data.resize( size );
        file.read( &data[0], size ); // C++11可以直接写成 file.read( data.data(), size );
    }

    cv::Mat img = cv::imdecode( data, CV_LOAD_IMAGE_ANYDEPTH|CV_LOAD_IMAGE_ANYCOLOR );
    if( img.data )
    {
        cv::imshow( "", img );
        cv::waitKey();
    }
}
2018-07-05 10:58



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-488371-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.219586 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved