3.采集卡的操作
图像处理所涉及的应用领域有军事应用、医学诊断、工业监控、物体的自动分检识别等等,这些应用系统无不需要计算机提供实时动态,效果逼真的图像。目前获取实时图像一般都需要在计算机内部安装一个图像采集卡,用来实现CCD端获取的模拟图像的数字化转换。笔者结合自己在项目开发中积累的一些经验,谈一下如何操作图像采集卡、然后再此基础基础上再实现一些特殊处理。
笔者的摄像机采用台湾BENTECH INDUSTRIAL 有限公司生产的CV-155L黑白摄像机。该摄像机分辨率为752x582。图象采集卡采用的是北京中科院科技嘉公司开发的基于PCI 总线的CA-MPE 1000 黑白图象采集卡。一般情况下,使用图像采集卡分三步,首先安装采集卡的驱动程序,并将虚拟驱动文件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_Set_PAL_Range(1250, 1024);//设置水平采集范围 W32_Set_VGA_Mode ( 1 ); 采用PAL制式; wGrabWinX1 = 0; // 采集窗口的左上角的坐标 wGrabWinY1 = 0; firstTime=TRUE; //第一次采集; bGrabMode = FRAME; //抓图模式为 格式; bZipMode = ZIPPLE; //压缩模式为ZIPPLE; lpDib=NULL;//存放获取的图像数据缓冲区为空; } //////////////////////////////////////// CTestView::~CTestView() { W32_Close_MPE1000();//关闭采集卡 } //////////////////////////////////////////// void CTestView::OnGraboneframe()//显示采集的图象,双击鼠标采集停止 { // TODO: Add your command handler code here 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()函数中,就可以对系统的调色板进行设置。 void WINAPI InitLogicPal( HDC hdc , short width, short height, WORD bitCount ) { int j, i; short cxDib, 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;i pLogPal->palPalEntry[i].peRed = i ; { pLogPal->palPalEntry[i].peGreen = i ; pLogPal->palPalEntry[i].peBlue = i ; pLogPal->palPalEntry[i].peFlags = 0; } hPal = ::CreatePalette(pLogPal); //创建调色板; delete pLogPal; ::SelectPalette(hdc,hPal,0);//系统实现调色板; ::RealizePalette(hdc); cxDib = width; cyDib = height; if ( (bmi = (BITMAPINFO *)malloc(sizeof(BITMAPINFOHEADER) + j*sizeof(RGBQUAD))) == NULL ) return ; //定义图 |
|