前言:我们精心挑选了数篇优质图像处理技术论文文章,供您阅读参考。期待这些文章能为您带来启发,助您在写作的道路上更上一层楼。
基于图像采集卡的视频图像处理系统
计算机图像处理系统从系统层次上可分为高、中、低档三个层次,目前一般比较普及的是低档次的系统,该系统由CCD(摄像头)、图像采集卡、计算机三个部分组成,其结构简单,应用方便,效果也比较不错,得到的图像较清晰。目前网上基于VC开发经验的文章不少,可是关于如何在VC开发平台上使用图像采集卡的文章确没发现,笔者针对在科研开发中积累的使用图像采集卡经验,介绍如何自己是如何将采集卡集成到图像开发系统中,希望能够给目前正需要利用图像采集卡开发自己的图像处理系统的朋友有所帮助。
使用的摄像机采用台湾BENTECHINDUSTRIAL有限公司生产的CV-155L黑白摄像机。该摄像机分辨率为752x582。图象采集卡我们采用北京中科院科技嘉公司开发的基于PCI总线的CA-MPE1000黑白图象采集卡。使用图像采集卡分三步,首先安装采集卡的驱动程序,并将虚拟驱动文件VxD.vxd拷贝到Windows的SYSTEM目录下;这时候就可以进入开发状态了,进入VC开发平台,生成新的项目,由于生产厂家为图像采集卡提供了以mpew32.dll、mpew32.lib命名的库文件,库中提供了初始硬件、采集图像等函数,为使用这些函数,在新项目上连接该动态库;最后一步就是采集图像并显示处理了,这一步要设置系统调色板,因为采集卡提供的是裸图形式,既纯图像数据,没有图像的规格和调色板信息,这些需要开发者自己规定实现,下面是实现的部分代码:
CTestView::CTestView()
{
W32_Init_MPE1000();//初始化采集卡
W32_Modify_Contrast(50);//下面的函数是为了对采集卡进行预设置
W32_Modify_Brightness(45);//设置亮度
W32_Set_HP_Value(945);//设置水平采集点数
wCurrent_Frame=1;//当前帧为1,获取的图像就是从这帧取得的
//设置采集信号源,仅对MPE1000有效
W32_Set_Input_Source(1);
W32_CACardParam(AD_SETHPFREQ,hpGrabFreq);
W32_Set_PAL_Range(1250,1024);//设置水平采集范围
W32_Set_VGA_Mode(1);
wGrabWinX1=0;//采集窗口的左上角的坐标
wGrabWinY1=0;
firstTime=TRUE;
bGrabMode=FRAME;
bZipMode=ZIPPLE;
/
lpDib=NULL;//存放获取的图像数据
}
CTestView::~CTestView()
{
W32_Close_MPE1000();//关闭采集卡
}
////显示采集的图象,双击鼠标采集停止
voidCTestView::OnGraboneframe()
{
//TODO:Addyourcommandhandlercodehere
wCurrent_Frame=1;
//设置采集目标为内存
W32_CACardParam(AD_SETGRABDEST,CA_GRABMEM);
//启动采集
if(lpDib!=NULL)
{
GlobalUnlock(hglbDIB);
GlobalFree(hglbDIB);
}
//分配内存
hglbDIB=GlobalAlloc(GHND,(DWORD)wImgWidth*(DWORD)wImgHeight);
lpDib=(BYTE*)GlobalLock(hglbDIB);
hdc=GetDC()->GetSafeHdc();
if(lpDib!=NULL)
{
cxDib=wImgWidth;
cyDib=wImgHeight;
SetLogicPal(hdc,cxDib,cyDib,8);
SetStretchBltMode(hdc,COLORONCOLOR);
bGrabMark=TRUE;
while(bGrabMark==TRUE)
{
if(msg.message==WM_LBUTTONDBLCLK)
bGrabMark=FALSE;
W32_ReadXMS2Buf(wCurrent_Frame,lpDib);
SetDIBitsToDevice(hdc,0,0,cxDib,cyDib,0,0,
0,cyDib,(LPSTR)lpDib,
bmi,
DIB_RGB_COLORS);
}
//停止采集
W32_CAStopCapture();
::ReleaseDC(GetSafeHwnd(),hdc);
return;
}
////将下面这个函数添加在视图类的CTestView::OnSize()函数中,就可以对系统的调色板进行设置。
voidWINAPIInitLogicPal(HDChdc,shortwidth,shortheight,WORDbitCount)
{
intj,i;
shortcxDib,cyDib;
LOGPALETTE*pLogPal;
j=256;
if((pLogPal=(LOGPALETTE*)malloc(sizeof(LOGPALETTE)+(j*sizeof(PALETTEENTRY))))==NULL)
return;
pLogPal->palVersion=0x300;
pLogPal->palNumEntries=j;
for(i=0;ipLogPal->palPalEntry[i].peRed=i;
pLogPal->palPalEntry[i].peGreen=i;
pLogPal->palPalEntry[i].peBlue=i;
pLogPal->palPalEntry[i].peFlags=0;
}
hPal=::CreatePalette(pLogPal);
deletepLogPal;
::SelectPalette(hdc,hPal,0);
::RealizePalette(hdc);
cxDib=width;cyDib=height;
if((bmi=(BITMAPINFO*)malloc(sizeof(BITMAPINFOHEADER)+j*sizeof(RGBQUAD)))==NULL)
return;
//bmi为全局变量,用于显示图像时用
bmi->bmiHeader.biSize=40;
bmi->bmiHeader.biWidth=cxDib;
bmi->bmiHeader.biHeight=cyDib;
bmi->bmiHeader.biPlanes=1;
bmi->bmiHeader.biBitCount=bitCount;
bmi->bmiHeader.biCompression=0;
bmi->bmiHeader.biSizeImage=0;
bmi->bmiHeader.biXPelsPerMeter=0;
bmi->bmiHeader.biYPelsPerMeter=0;
bmi->bmiHeader.biClrUsed=0;
bmi->bmiHeader.biClrImportant=0;
for(i=0;ibmi->bmiColors[i].rgbBlue=i;
bmi->bmiColors[i].rgbGreen=i;
bmi->bmiColors[i].rgbRed=i;
bmi->bmiColors[i].rgbReserved=0;
}
}
视频"画中画"技术
"画中画"这个概念类似与彩色电视机"画中画",就是在一幅大的图像内显示另外一幅内容不同的小的图像,小图像的尺寸大小一般地说为大图像尺寸的1/4或1/9,显示位置在大图像的右上角。这种技术不仅在电视技术中,在可视电话系统也可以发现这种技术的身影,它们都是依靠硬件来实现的,但是如何在VC开发平台上用编程语言来将该功能添加到自己开发的视频监控软件,为使用者提供更大的信息量呢?也许读者最容易想到的是首先显示大图像,然后再在一个固定位置画第二幅小图像,这种技术技术如果对于静止图像当然没有问题,但是对于视频流,由于每一秒钟需要画25幀,即25幅图像,这样一来计算机需要不停的画不停的擦除,会给用户以闪烁的感觉,如何解决这个问题呢?有的参考书上将大小图像分快显示,这种方法要将待显示的图像数据与显示位置的关系对应起来,容易出错不说,而且麻烦,且速度慢,为此,我对该方法进行了改进,得到了满意的效果。实现的代码如下:
voidpictureinpicture()
{
………………………..
CBitmapbitmap,*oldmap;
pData1=(BYTE*)newchar[biWidth*biHeight*3];//biWidth和biHeight为视频采集卡获取//的图像尺寸。
Read(pData1,bih.biWidth*bih.biHeight*3);//该函数从采集卡中获取数据
CClientDCdc(this);
m_pBMI1=newBITMAPINFO;//自定义的BMP文件信息结构,用于后面的图像显示
m_pBMI1->bmiHeader.biBitCount=24;
m_pBMI1->bmiHeader.biClrImportant=0;
m_pBMI1->bmiHeader.biClrUsed=0;
m_pBMI1->bmiHeader.biCompression=0;
m_pBMI1->bmiHeader.biHeight=biHeight;
m_pBMI1->bmiHeader.biPlanes=1;
m_pBMI1->bmiHeader.biSize=40;
m_pBMI1->bmiHeader.biSizeImage=WIDTHBYTES(biWidth*8)*biHeight*3;
m_pBMI1->bmiHeader.biWidth=biWidth;
m_pBMI1->bmiHeader.biXPelsPerMeter=0;
m_pBMI1->bmiHeader.biYPelsPerMeter=0;
////////////////////////////////////////////////////////////////////////
pData2=(BYTE*)newchar[biWidth1*biHeight1*3];//申请存放小图像的缓冲区
Read(pData2,biWidth1*biHeight1*3);////向该缓冲区读数据
m_pBMI2=newBITMAPINFO;
m_pBMI2->bmiHeader.biBitCount=24;
m_pBMI2->bmiHeader.biClrImportant=0;
m_pBMI2->bmiHeader.biClrUsed=0;
m_pBMI2->bmiHeader.biCompression=0;
m_pBMI2->bmiHeader.biHeight=biHeight1;
m_pBMI2->bmiHeader.biPlanes=1;
m_pBMI2->bmiHeader.biSize=40;
m_pBMI2->bmiHeader.biSizeImage=WIDTHBYTES(biWidth1*8)*biHeight1*3;
m_pBMI2->bmiHeader.biWidth=biWidth1;
m_pBMI2->bmiHeader.biXPelsPerMeter=0;
m_pBMI2->bmiHeader.biYPelsPerMeter=0;
//下面实现画中画的显示
CDCMemDc;
MemDc.CreateCompatibleDC(&dc);
bitmap.CreateCompatibleBitmap(&dc,biWidth,biHeight);
oldmap=MemDc.SelectObject(&bitmap);
::StretchDIBits(MemDc.m_hDC,0,0,biWidth,biHeight,0,0,—biWidth,biHeight,pData1,m_pBMI1,DIB_RGB_COLORS,SRCCOPY);//首先将大图像画在内寸上下文中
::StretchDIBits(MemDc.m_hDC,20,20,biWidth1,biHeight1,_
0,0,biWidth1,biHeight1,pData2,m_pBMI2,DIB_RGB_COLORS,SRCCOPY);//再将小图像画在内寸上下文中
::StretchBlt(dc.m_hDC,0,0,bih.biWidth,bih.biHeight,_
MemDc.m_hDC,0,0,bih.biWidth,bih.biHeight,SRCCOPY);//将结果显示在屏幕上。
MemDc.SelectObject(oldmap);
deletepData1;
deletem_pBMI1;
deletepData2;
基于图像采集卡的视频图像处理系统
计算机图像处理系统从系统层次上可分为高、中、低档三个层次,目前一般比较普及的是低档次的系统,该系统由CCD(摄像头)、图像采集卡、计算机三个部分组成,其结构简单,应用方便,效果也比较不错,得到的图像较清晰。目前网上基于VC开发经验的文章不少,可是关于如何在VC开发平台上使用图像采集卡的文章确没发现,笔者针对在科研开发中积累的使用图像采集卡经验,介绍如何自己是如何将采集卡集成到图像开发系统中,希望能够给目前正需要利用图像采集卡开发自己的图像处理系统的朋友有所帮助。
使用的摄像机采用台湾BENTECHINDUSTRIAL有限公司生产的CV-155L黑白摄像机。该摄像机分辨率为752x582。图象采集卡我们采用北京中科院科技嘉公司开发的基于PCI总线的CA-MPE1000黑白图象采集卡。使用图像采集卡分三步,首先安装采集卡的驱动程序,并将虚拟驱动文件VxD.vxd拷贝到Windows的SYSTEM目录下;这时候就可以进入开发状态了,进入VC开发平台,生成新的项目,由于生产厂家为图像采集卡提供了以mpew32.dll、mpew32.lib命名的库文件,库中提供了初始硬件、采集图像等函数,为使用这些函数,在新项目上连接该动态库;最后一步就是采集图像并显示处理了,这一步要设置系统调色板,因为采集卡提供的是裸图形式,既纯图像数据,没有图像的规格和调色板信息,这些需要开发者自己规定实现,下面是实现的部分代码:
CTestView::CTestView()
{
W32_Init_MPE1000();//初始化采集卡
W32_Modify_Contrast(50);//下面的函数是为了对采集卡进行预设置
W32_Modify_Brightness(45);//设置亮度
W32_Set_HP_Value(945);//设置水平采集点数
wCurrent_Frame=1;//当前帧为1,获取的图像就是从这帧取得的
//设置采集信号源,仅对MPE1000有效
W32_Set_Input_Source(1);
W32_CACardParam(AD_SETHPFREQ,hpGrabFreq);
W32_Set_PAL_Range(1250,1024);//设置水平采集范围
W32_Set_VGA_Mode(1);
wGrabWinX1=0;//采集窗口的左上角的坐标
wGrabWinY1=0;
firstTime=TRUE;
bGrabMode=FRAME;
bZipMode=ZIPPLE;
/
lpDib=NULL;//存放获取的图像数据
}
CTestView::~CTestView()
{
W32_Close_MPE1000();//关闭采集卡
}
////显示采集的图象,双击鼠标采集停止
voidCTestView::OnGraboneframe()
{
//TODO:Addyourcommandhandlercodehere
wCurrent_Frame=1;
//设置采集目标为内存
W32_CACardParam(AD_SETGRABDEST,CA_GRABMEM);
//启动采集
if(lpDib!=NULL)
{
GlobalUnlock(hglbDIB);
GlobalFree(hglbDIB);
}
//分配内存
hglbDIB=GlobalAlloc(GHND,(DWORD)wImgWidth*(DWORD)wImgHeight);
lpDib=(BYTE*)GlobalLock(hglbDIB);
hdc=GetDC()->GetSafeHdc();
if(lpDib!=NULL)
{
cxDib=wImgWidth;
cyDib=wImgHeight;
SetLogicPal(hdc,cxDib,cyDib,8);
SetStretchBltMode(hdc,COLORONCOLOR);
bGrabMark=TRUE;
while(bGrabMark==TRUE)
{
if(msg.message==WM_LBUTTONDBLCLK)
bGrabMark=FALSE;
W32_ReadXMS2Buf(wCurrent_Frame,lpDib);
SetDIBitsToDevice(hdc,0,0,cxDib,cyDib,0,0,
0,cyDib,(LPSTR)lpDib,
bmi,
DIB_RGB_COLORS);
}
//停止采集
W32_CAStopCapture();
::ReleaseDC(GetSafeHwnd(),hdc);
return;
}
////将下面这个函数添加在视图类的CTestView::OnSize()函数中,就可以对系统的调色板进行设置。
voidWINAPIInitLogicPal(HDChdc,shortwidth,shortheight,WORDbitCount)
{
intj,i;
shortcxDib,cyDib;
LOGPALETTE*pLogPal;
j=256
if((pLogPal=(LOGPALETTE*)malloc(sizeof(LOGPALETTE)+(j*sizeof(PALETTEENTRY))))==NULL)
return;
pLogPal->palVersion=0x300;
pLogPal->palNumEntries=j;
for(i=0;ipLogPal->palPalEntry[i].peRed=i;
pLogPal->palPalEntry[i].peGreen=i;
pLogPal->palPalEntry[i].peBlue=i;
pLogPal->palPalEntry[i].peFlags=0;
}
hPal=::CreatePalette(pLogPal);
deletepLogPal;
::SelectPalette(hdc,hPal,0);
::RealizePalette(hdc);
cxDib=width;cyDib=height;
if((bmi=(BITMAPINFO*)malloc(sizeof(BITMAPINFOHEADER)+j*sizeof(RGBQUAD)))==NULL)
return;
//bmi为全局变量,用于显示图像时用
bmi->bmiHeader.biSize=40;
bmi->bmiHeader.biWidth=cxDib;
bmi->bmiHeader.biHeight=cyDib;
bmi->bmiHeader.biPlanes=1;
bmi->bmiHeader.biBitCount=bitCount;
bmi->bmiHeader.biCompression=0;
bmi->bmiHeader.biSizeImage=0;
bmi->bmiHeader.biXPelsPerMeter=0;
bmi->bmiHeader.biYPelsPerMeter=0;
bmi->bmiHeader.biClrUsed=0;
bmi->bmiHeader.biClrImportant=0;
for(i=0;ibmi->bmiColors[i].rgbBlue=i;
bmi->bmiColors[i].rgbGreen=i;
bmi->bmiColors[i].rgbRed=i;
bmi->bmiColors[i].rgbReserved=0;
}
}
视频"画中画"技术
"画中画"这个概念类似与彩色电视机"画中画",就是在一幅大的图像内显示另外一幅内容不同的小的图像,小图像的尺寸大小一般地说为大图像尺寸的1/4或1/9,显示位置在大图像的右上角。这种技术不仅在电视技术中,在可视电话系统也可以发现这种技术的身影,它们都是依靠硬件来实现的,但是如何在VC开发平台上用编程语言来将该功能添加到自己开发的视频监控软件,为使用者提供更大的信息量呢?也许读者最容易想到的是首先显示大图像,然后再在一个固定位置画第二幅小图像,这种技术技术如果对于静止图像当然没有问题,但是对于视频流,由于每一秒钟需要画25幀,即25幅图像,这样一来计算机需要不停的画不停的擦除,会给用户以闪烁的感觉,如何解决这个问题呢?有的参考书上将大小图像分快显示,这种方法要将待显示的图像数据与显示位置的关系对应起来,容易出错不说,而且麻烦,且速度慢,为此,我对该方法进行了改进,得到了满意的效果。实现的代码如下:
voidpictureinpicture()
{
………………………..
CBitmapbitmap,*oldmap;
pData1=(BYTE*)newchar[biWidth*biHeight*3];//biWidth和biHeight为视频采集卡获取//的图像尺寸。
Read(pData1,bih.biWidth*bih.biHeight*3);//该函数从采集卡中获取数据
CClientDCdc(this);
m_pBMI1=newBITMAPINFO;//自定义的BMP文件信息结构,用于后面的图像显示
m_pBMI1->bmiHeader.biBitCount=24;
m_pBMI1->bmiHeader.biClrImportant=0;
m_pBMI1->bmiHeader.biClrUsed=0;
m_pBMI1->bmiHeader.biCompression=0;
m_pBMI1->bmiHeader.biHeight=biHeight;
m_pBMI1->bmiHeader.biPlanes=1;
m_pBMI1->bmiHeader.biSize=40;
m_pBMI1->bmiHeader.biSizeImage=WIDTHBYTES(biWidth*8)*biHeight*3;
m_pBMI1->bmiHeader.biWidth=biWidth;
m_pBMI1->bmiHeader.biXPelsPerMeter=0;
m_pBMI1->bmiHeader.biYPelsPerMeter=0;
////////////////////////////////////////////////////////////////////////
pData2=(BYTE*)newchar[biWidth1*biHeight1*3];//申请存放小图像的缓冲区
Read(pData2,biWidth1*biHeight1*3);////向该缓冲区读数据
m_pBMI2=newBITMAPINFO;
m_pBMI2->bmiHeader.biBitCount=24;
m_pBMI2->bmiHeader.biClrImportant=0;
m_pBMI2->bmiHeader.biClrUsed=0;
m_pBMI2->bmiHeader.biCompression=0;
m_pBMI2->bmiHeader.biHeight=biHeight1;
m_pBMI2->bmiHeader.biPlanes=1;
m_pBMI2->bmiHeader.biSize=40;
m_pBMI2->bmiHeader.biSizeImage=WIDTHBYTES(biWidth1*8)*biHeight1*3;
m_pBMI2->bmiHeader.biWidth=biWidth1;
m_pBMI2->bmiHeader.biXPelsPerMeter=0;
m_pBMI2->bmiHeader.biYPelsPerMeter=0;
//下面实现画中画的显示
CDCMemDc;
MemDc.CreateCompatibleDC(&dc);
bitmap.CreateCompatibleBitmap(&dc,biWidth,biHeight);
oldmap=MemDc.SelectObject(&bitmap);
::StretchDIBits(MemDc.m_hDC,0,0,biWidth,biHeight,0,0,—biWidth,biHeight,pData1,m_pBMI1,DIB_RGB_COLORS,SRCCOPY);//首先将大图像画在内寸上下文中
::StretchDIBits(MemDc.m_hDC,20,20,biWidth1,biHeight1,_
0,0,biWidth1,biHeight1,pData2,m_pBMI2,DIB_RGB_COLORS,SRCCOPY);//再将小图像画在内寸上下文中
::StretchBlt(dc.m_hDC,0,0,bih.biWidth,bih.biHeight,_
MemDc.m_hDC,0,0,bih.biWidth,bih.biHeight,SRCCOPY);//将结果显示在屏幕上。
MemDc.SelectObject(oldmap);
deletepData1;
deletem_pBMI1;
随着社会发展,计算机图像处理技术的重要性逐渐被人们发现,将主要朝以下几个方面发展:(1)未来的计算机图像处理技术将会向自动化、智能化、高清晰度、高速传输、三维立体成像等方向发展。(2)计算机图像处理技术将会朝两个方面发展:一是注重实际操作,二是注重运用便捷。向图像处理功能的集中化发展。(3)注重研究先进的算法和理论作为指导。理论是实践的基础,先进的理论可以使未来计算机图像处理技术在实际运用中得到更广泛的发展,所以,必须注重及时对先进理论和方法的研究与开发,这样才能保证计算机图像处理技术的更好应用。先进理论和方法主要包括小波分析、遗传算法、分形几何等方面。
2计算机图像处理技术的组成
计算机图像处理技术是通过计算机对图像分析处理达到需要的结果的一项技术。一般被称作数字图像处理,通过扫描、摄像机等设备经过数字化之后得到二维数组,就是像素。计算机图像处理技术主要包括以下三个部分:(1)图像增强与复原:由于需要改进图片的质量,这就需要对图片进行图像增强,通过低通滤波可以将图片中的噪音去掉;通过高通滤波可以将边缘等高频信号进行增强,使图片清晰。复原则是在已知模型的特定模糊和噪音程度情况下估计出原来图像的技术。(2)图像压缩:由于图像的数据比较巨大,对图片储存和传输都比较困难,因此,需要对图像进行压缩,以节省存储空间和减少传输时间。图像压缩分为对静态图像的不失真压缩方法和用于动态图像的近似压缩方法。(3)图像匹配、描述与识别:这是图像处理的主要目的,得到不再是具有随机分布性质的文件,而是具有明确意义的符号、数值构成的图形。
3计算机图像处理技术的主要应用领域
3.1计算机辅助设计与制造技术
这项技术学科交叉、知识比较密集、应用范围比较广泛,是综合性应用技术,由计算机与制造工程两个技术相互渗透,相互结合。是先进技术的重要组成部分,计算机辅助设计与制造技术是一个国家工业现代化与科技水平的主要衡量标准之一。这项技术在工业领域中最主要的代表就是CAD与CAM这两项实用工具。同时,在建筑设计、装潢设计等领域也应用广泛,也可以用来进行对飞机、汽车等工具的外形设计。当然,在其他方面也应用广泛,而且得到的效果非常好,比如:电路板的印刷、网络分析等等方面。
3.2遥感图像处理系统
遥感技术的发展推动了高质量的不同波段遥感数字图像被广泛运用于农林牧副渔等行业的科技现代化之中。图像处理在遥感技术领域有着十分重要的地位,将来会形成快速成像与信息自动化提取系统,而这个系统也是以图像处理为主。遥感图像处理技术功能将会不断完善,得到更大的发展。
4计算机图像处理技术的发展前景
现代科技的进步使计算机技术得到快速的发展,也就使计算机技术运用在图像处理中有了可能,并且在图像处理中产生了很重要的影响。现在人们对图像的要求越来越高,想要满足人们越来越高的要求,就必须不断进步、不断创新。计算机技术将会越来越广泛的运用于社会中,图像处理技术也会越来越依赖计算机。随着大量的成熟软件的不断被研发,既有专业软件,也有普通软件,可以满足所有人的要求。技术人员应该开发新技术来满足更多、更复杂的图像处理要求,使图像更加的丰富多彩。
5结语