CCD+采集卡,采集的数据,在显示、处理时爆慢,文中提供详细的程序,请有识之士给予指点

zdyyongjing 2004-09-30 10:48:41
你好,谢谢你对本贴的关注!  :)

我用CCD数据采集卡,采集了一些CCD拍摄的数据,因是线阵CCD,一次只能采集一行(采集一次时间为5ms),5000个象元(象素)。现拟采集5000行,想在显示器上显示出来。以下的程序,运行是成功的,也可以显示想要采集的数据,但就是显示速度爆慢,在采集、显示500行的时候,时间提示是11秒,当采集5000行的时候,时间竟然达到3分钟之久;
想请教在C++builder程序开发中,特别是图像显示、处理中,如何提高显示或处理的速度??程序如下,希望有识之士给予指点,谢谢!

另:我在显示的时候,发现一个不太好的现象,当我采集第一幅图的时候,Label显示的时间为11秒,而采集第二幅图的时候,显示时间就会提高,之后,每显示一幅新图,时间就会有所上升;感觉内存好像被吃完了,但我用了delete语句,为何显示速度会逐渐变慢呢?


void __fastcall TForm1::Button1Click(TObject *Sender)
{ unsigned long iCCDData[5000];
// 为采集卡指针变量开辟相应的存储空间,采集卡自带有存储器
unsigned long c;
Bitmap = new Graphics::TBitmap;
Bitmap->Width=5000;
Bitmap->Height=1500;

HANDLE m_hCcdDevice; //CCD 数据采集卡句柄
int m_iIntegralTime=0;   //设置CCD积分时间
int m_iPixelSum=5000;   //设置CCD采集一行的象元(象素)数
int m_iLineSum=1;     //设置一次采集的行数
m_hCcdDevice=Null;
  TTime a,b;
a=Time();
for(int x=0;x<4999;x++)  //采集5000行(循环)
{
 m_hCcdDevice = lcDeviceOpen(); //打开数据采集卡
  if(m_hCcdDevice == NULL)
 ShowMessage("Unsuccessful!");
lcSetCCDParam(m_hCcdDevice, CCD_PIXELS, m_iPixelSum);
 lcSetCCDParam(m_hCcdDevice, CCD_DAQLINES, m_iLineSum);
lcSetCCDParam(m_hCcdDevice, CCD_INTEGRAL, m_iIntegralTime);
  //以上三句设置采集卡采集参数

if(lcDataAcquisition(m_hCcdDevice,iCCDData,1)==0) //采集卡                              //如果采集成功
{
for(int i = 0; i <4999; i=i+1)
{
c=*(iCCDData+i)>>4; //因采集卡是12位的,即4096级灰
//度,但用RGB只能显示256级(如果能显示4096级,请告之),故而除以16
//(左移四位))
Bitmap->Canvas->Pixels[i][x] = (TColor)RGB( c,c,c);

if(i>=4999)   //采集一行完毕,关闭采集卡
{
if(m_hCcdDevice != NULL)
{
lcDeviceClose(m_hCcdDevice);
m_hCcdDevice = NULL;
}
}

}

}

}
lcDeviceClose(m_hCcdDevice);
m_hCcdDevice = NULL;


Image1->Picture->Bitmap->Assign(Bitmap);
delete Bitmap;
b=Time();
Label1->Caption =b-a;
Image1->Picture->SaveToFile("aa.bmp");
}
...全文
338 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
onemonth 2004-10-06
  • 打赏
  • 举报
回复
得用到HDC了,自己操作这快内存。用DX也是一样的操作方式,都是直接操作这个 HDC。
teatool 2004-10-03
  • 打赏
  • 举报
回复
不要不断的新建或删除经常用的对象,也不要频繁的打开关闭采集卡
在程序开始时就建立对象,关闭时删除,在开始时就打开采集卡,程序结束时再关闭
zdyyongjing 2004-10-03
  • 打赏
  • 举报
回复
谢谢各位朋友的关注与帮助、支持!
zdyyongjing 2004-10-03
  • 打赏
  • 举报
回复
我把打开与关闭采集卡的程序移出,一次只打开与关闭采集卡一次,把采集卡的参数设置语句从for循环中称出,并且采用了如下的方法,使用scanline()函数,直接用采集的数据生成位图。从而使显示速度提高了3倍(5000*1500时),不过,速度依然比较慢,下面程序是用采集的数据生成位图的程序,程序中有二句语句:ptr=(BYTE *)Bitmap->ScanLine[j]; /* memcpy(ptr, image,169); 是直接内存拷币的,可我却不知如何实现。我想把采集的一行数据直接通过内存考币给ptr指针,但是编译是成功的,却得不到我需要的图像。我个人理解是这样的:我采集进来的数据的数据类型与ptr指针所指的数据类型不相同。用scanline函数,如果是24位,将用到三个字节,分别对应RGB三个字节。希望高手能提供帮助或指点一二,不胜感激。
void __fastcall TForm1::Button1Click(TObject *Sender)
{
int i,j,k; unsigned long image[169];
for(k=0;k<169;k++)
image[k]=0;
BYTE *ptr;


Graphics::TBitmap *Bitmap=new Graphics::TBitmap();
Bitmap->PixelFormat=pf24bit;
Bitmap->Width=Image1->Width;
Bitmap->Height=Image1->Height;
for(j=0;j<Bitmap->Height-1;j++)
{
ptr=(BYTE *)Bitmap->ScanLine[j]; k=0;
/* memcpy(ptr, image,169*3); */
for(i=0;i<3*(Image1->Width-1);i+=3)
{
*(ptr+i)=image[k];
*(ptr+1+i)=image[k];
*(ptr+2+i)=image[k];
k++;
}
}
Bitmap->SaveToFile("aa.bmp");
Image1->Picture->Graphic=Bitmap;

delete Bitmap;
}
耙子 2004-10-03
  • 打赏
  • 举报
回复
感觉你的问题分两步走,
1.找瓶颈
2.优化

找瓶颈我的想法是把采样和显示分开,比如首先测试采样,屏蔽显示那部分,看看5000行的时间,再显示5000行看看时间,屏蔽采样,这样能找到哪个耗时多。

再分别优化,比如楼上各位说的方式。

另外,海量循环内部代码我建议你用汇编写,我看了一下,难度不大。

关于图片,可以采用你说的内存不知的办法,比如bitblt这些函数,采样的同时就按照格式填充好Bitmap,显示就会非常简单。
lzf20lzf 2004-10-02
  • 打赏
  • 举报
回复
学习
woshialber 2004-10-02
  • 打赏
  • 举报
回复
有一点不明白,你的采集卡没有提供二次开发包吗?
感觉每个象素都要这样计算一下
c=*(iCCDData+i)>>4;
Bitmap->Canvas->Pixels[i][x] = (TColor)RGB( c,c,c);
效率应该比较低把

这方面不太懂,Up一下,听听高手怎么说的。


zdyyongjing 2004-10-02
  • 打赏
  • 举报
回复
谢谢woshialber(吴斐),我会把程序修改一下

我想在下面这句语句中,能否有所改动?
Bitmap->Canvas->Pixels[i][x] = (TColor)RGB( c,c,c);

因为数据量比较大,是否可以采取直接内存拷币的方法?
我看到有这样的函数memcpy()
继续调试中.....
UFOBH 2004-10-01
  • 打赏
  • 举报
回复
太牛了,值得学习,帮你顶
zdyyongjing 2004-10-01
  • 打赏
  • 举报
回复
自己顶一下
woshialber 2004-10-01
  • 打赏
  • 举报
回复
感觉是这样:
for(int x=0;x<4999;x++)  //采集5000行(循环)
{
 m_hCcdDevice = lcDeviceOpen(); //打开数据采集卡
  if(m_hCcdDevice == NULL)
 ShowMessage("Unsuccessful!");
不能每采一行就开关一次采集卡和设置一次参数把,我想这个应该是最主要的瓶颈了!

应该是先打开采集卡并设置参数,如果成功则开始循环采样每行的数据
采样完成的最后在关闭采集卡。



13,873

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder相关内容讨论区
社区管理员
  • 基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧