OpenCV中文网站

 找回密码
 立即注册
搜索
热搜: 安装 配置
查看: 10507|回复: 10

在ccs中运行cvLoadImage函数出现问题

[复制链接]
发表于 2009-2-21 12:21:23 | 显示全部楼层 |阅读模式
编译通过,cvLoadImage()也打开了图像文件,但是函数运行到CvCreateData()函数时出现问题,
单步运行,发现是CvCreateData中CvAlloc()函数中ptr=memalign(8,size),ptr始终为空,
而在主函数中直接写ptr=memalign(8,size),ptr不为空,
何解?
回复

使用道具 举报

发表于 2009-2-21 18:52:30 | 显示全部楼层

在ccs中运行cvLoadImage函数出现问题

可能是内存不够,memalign确实分配不到新的又足够大的内存块了。
编译通过,cvLoadImage()也打开了图像文件,但是函数运行到CvCreateData()函数时出现问题,
单步运行,发现是CvCreateData中CvAlloc()函数中ptr=memalign(8,size),ptr始终为空,
而在主函数中直接写ptr=memalign(8,size),ptr不为空,
何解?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2009-3-3 11:36:31 | 显示全部楼层

在ccs中运行cvLoadImage函数出现问题

谢谢回答,确实是内存分配不够,通过修改cdb文件,分配足够的内存后这个问题解决了,
现在有一个新的问题是,读入lena图像,显示图像为全黑,对比EMCV中的cvloadimag和vc中cvloadimag,仅有一点不同
在image = cvCreateImage(cvSize(bmpinfohead.width, bmpinfohead.height), 8, channels)之后
后者为
  matrix = cvGetMat( image, &hdr );
    if( !reader->ReadData( matrix->data.ptr, matrix->step, iscolor ))
    {
        cvReleaseImage( &image );
        EXIT;
    }
图像显示结果正常
EMCV中:
fseek(p, bmpinfohead.startPosition, SEEK_SET);
for(idx=bmpinfohead.height-1; idx >= 0 ; idx--)
     fread(image->imageData+image->widthStep*idx, step, 1, p);
图像显示结果异常,
这需要对后者做什么修改?
回复 支持 反对

使用道具 举报

发表于 2009-3-3 12:58:49 | 显示全部楼层

在ccs中运行cvLoadImage函数出现问题

我没看过reader->ReadData的实现,只能粗略估计emcv中那段代码就是reader->ReadData的展开。
我只能简单跟你说下这段代码的意思,其他问题需要你结合自己的实际环境去解决:

总体来说,这段代码的目的是,把文件p中的部分内容读入缓冲区image->imageData,具体的方法是:

fseek(p, bmpinfohead.startPosition, SEEK_SET);    //从文件头开始偏移bmpinfohead.startPosition字节,开始读取
for(idx=bmpinfohead.height-1; idx >= 0 ; idx--)     //结合下面参数中的1和step,读取bmpinfohead.height*step个字节
fread(image->imageData+image->widthStep*idx, step, 1, p);    //这里,我觉得有个隐含的要求,就是image->widthStep要等于step,因为这句话的意思是每次读step*1个字节,但缓冲区的写入指针算法是image->imageData+image->widthStep*idx

你的问题,我觉得不妨怀疑几点:
1、文件是否正确打开
2、你的意图是否是从文件头开始偏移bmpinfohead.startPosition字节的位置开始读取
3、你是否要读取bmpinfohead.height*step字节
4、image->widthStep是否等于step,或是你有其他考虑

最土的调试方法是:
1、用同一个图像
2、可行的那段代码运行一下,打印出最终读取到内存缓冲区里的数据。
3、不行的那段代码运行一下,也打印出最终读取到内存缓冲区里的数据。
4、比较,如果不同,那么就是读取方法不对。如果相同,那么就是后面的显示方法不对。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2009-3-3 23:04:15 | 显示全部楼层

在ccs中运行cvLoadImage函数出现问题

非常感谢你的积极回答,认真读代码后,我在原来的基础上添加了一个语句,使得文件指针p每次指到
相应的位置,如下:
fseek(p, bmpinfohead.startPosition, SEEK_SET);
for( idx=bmpinfohead.height-1;idx >= 0 ; idx--,flag++)
{
            fread(image->imageData+image->widthStep*idx, step, 1, p);
            fseek(p, bmpinfohead.startPosition+step*flag, SEEK_SET);//添加此句
}

现在的问题是现实出来的图像大体是正常的,但有少部分像素值为0,使得图像上出现若干黑线,不解,
再次谢谢你!
回复 支持 反对

使用道具 举报

发表于 2009-7-9 16:58:54 | 显示全部楼层

在ccs中运行cvLoadImage函数出现问题

保存图片的确是有点问题,lena.bmp 图片保存时上半部没有,是黑点,下半部才有,而且是180度倒立的,强。
好象与图片大小还有关系,更小图片保存时,是正立的,但是绝大部分是黑点。
图片效果请看:http://blog.163.com/lijiehunan@126/editAlbumsInUser.do?albumId=-1#p1

blog中有一个关于行人检测移值的,可以运行,但是输出有点错。
<!-- m --><a class=\"postlink\" href=\"http://blog.163.com/lijiehunan@126/blog/static/11798298420096943431834/edit/\">http://blog.163.com/lijiehunan@126/blog ... 1834/edit/</a><!-- m -->

本人觉得可能位BMP头信息有关:
typedef struct
{
unsigned char signature[2];
long filesize;
long reserved;
long dataoffset;
}filehead;

typedef struct
{
long header_size;
long width;
long height;
unsigned planes;
unsigned bitcount;
long compression;
long imagesize;
long hres;
long vres;
long color_used;
long imp_color;
}infohead;
而cvloadimage却是

typedef struct
{
        char type1;
        char type2;
}BmpFileHead;
typedef struct
{
    unsigned int imageSize;
    unsigned int blank;
    unsigned int startPosition;
    unsigned int    length;
    unsigned int    width;
    unsigned int    height;
    unsigned short    colorPlane;
    unsigned short    bitColor;
    unsigned int    zipFormat;
    unsigned int    realSize;
    unsigned int    xPels;
    unsigned int    yPels;
    unsigned int    colorUse;
    unsigned int    colorImportant;
}BmpInfoHead;
头信息都不一样,却能保存图片,一直没有搞清,不解,请高手指点一下。
回复 支持 反对

使用道具 举报

发表于 2009-8-21 12:44:57 | 显示全部楼层

在ccs中运行cvLoadImage函数出现问题

LS  
cvLoadImage问题解决了吗??
我保存图像中间会出现一条黑线,不知道是什么原因...
回复 支持 反对

使用道具 举报

发表于 2009-11-5 00:33:10 | 显示全部楼层

在ccs中运行cvLoadImage函数出现问题

保存图片的确是有点问题,lena.bmp 图片保存时上半部没有,是黑点,下半部才有,而且是180度倒立的,强。
好象与图片大小还有关系,更小图片保存时,是正立的,但是绝大部分是黑点。
图片效果请看:http://blog.163.com/lijiehunan@126/editAlbumsInUser.do?albumId=-1#p1

blog中有一个关于行人检测移值的,可以运行,但是输出有点错。
<!-- m --><a class=\"postlink\" href=\"http://blog.163.com/lijiehunan@126/blog/static/11798298420096943431834/edit/\">http://blog.163.com/lijiehunan@126/blog ... 1834/edit/</a><!-- m -->

本人觉得可能位BMP头信息有关:
typedef struct
{
unsigned char signature[2];
long filesize;
long reserved;
long dataoffset;
}filehead;

typedef struct
{
long header_size;
long width;
long height;
unsigned planes;
unsigned bitcount;
long compression;
long imagesize;
long hres;
long vres;
long color_used;
long imp_color;
}infohead;
而cvloadimage却是

typedef struct
{
        char type1;
        char type2;
}BmpFileHead;
typedef struct
{
    unsigned int imageSize;
    unsigned int blank;
    unsigned int startPosition;
    unsigned int    length;
    unsigned int    width;
    unsigned int    height;
    unsigned short    colorPlane;
    unsigned short    bitColor;
    unsigned int    zipFormat;
    unsigned int    realSize;
    unsigned int    xPels;
    unsigned int    yPels;
    unsigned int    colorUse;
    unsigned int    colorImportant;
}BmpInfoHead;
头信息都不一样,却能保存图片,一直没有搞清,不解,请高手指点一下。

BMP中先存最后一行数据。注意文件头到数据区的偏移量。
回复 支持 反对

使用道具 举报

发表于 2009-11-5 00:34:05 | 显示全部楼层

在ccs中运行cvLoadImage函数出现问题

LS  
cvLoadImage问题解决了吗??
我保存图像中间会出现一条黑线,不知道是什么原因...
头文件与数据区之间的偏移量大了,或者写入了空白数据。
回复 支持 反对

使用道具 举报

发表于 2010-5-11 00:14:10 | 显示全部楼层

在ccs中运行cvLoadImage函数出现问题

谢谢回答,确实是内存分配不够,通过修改cdb文件,分配足够的内存后这个问题解决了,
现在有一个新的问题是,读入lena图像,显示图像为全黑,对比EMCV中的cvloadimag和vc中cvloadimag,仅有一点不同
在image = cvCreateImage(cvSize(bmpinfohead.width, bmpinfohead.height), 8, channels)之后
后者为
  matrix = cvGetMat( image, &hdr );
    if( !reader->ReadData( matrix->data.ptr, matrix->step, iscolor ))
    {
        cvReleaseImage( &image );
        EXIT;
    }
图像显示结果正常
EMCV中:
fseek(p, bmpinfohead.startPosition, SEEK_SET);
for(idx=bmpinfohead.height-1; idx >= 0 ; idx--)
     fread(image->imageData+image->widthStep*idx, step, 1, p);
图像显示结果异常,
这需要对后者做什么修改?
emcv的loadimage函数里,是以“r”方式打开图片的,改成“rb”方式即可。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|OpenCV中文网站

GMT+8, 2024-4-26 09:35 , Processed in 0.012253 second(s), 15 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表