使用大恒CG200图像卡采集图像用OpenCV显示存储的例子
来源:互联网 发布:智能物流软件 编辑:程序博客网 时间:2024/05/17 08:51
#include "cv.h"
#include "highgui.h"
#include "dll/cg200-32.h"
#include "dll/memalloc.h"
#include <time.h>
#include <stdio.h>
#include <memory.h>
// A Simple Camera Capture Framework 大恒CG200
//开始时必须使用大恒随带的例子程序设置预留静态内存大于两幅图像的大小
int main( int argc, char** argv )
{
DWORD oldTime, curTime;
IplImage* frame = 0;
CvSize n_size = cvSize(768,576);
HCG200 hcg200=0; //图像卡句柄
int CG200_status = 1;
int nStatus = 1;
int nFlag = 1;
hcg200 = BeginCG200(1); //初始化图像卡,获得句柄 图像卡序号为1
if(0 ==hcg200)
{
fprintf( stderr, "ERROR: can't open card! /n" );
getchar();
return -1;
}
CG200_status = CG200SetADParam(hcg200, AD_SOURCE, 0); //设置采集图像采集卡的第0路输入
if(0 == CG200_status)
{
fprintf( stderr, "ERROR: can't SET card! /n" );
EndCG200(hcg200);
getchar();
return -1;
}
CG200SetInpVideoWindow(hcg200, 0, 0, 768, 576); //视频输入窗口取最大,PAL制式
/*
* 视频输出窗口,即视频输出范围,输出窗口取值范围必须在输入窗口范围以内,
* 视频窗口左上角X坐标和窗口宽度应为4的倍数,左上角Y坐标和窗口高度应为2的倍数
* 在采集到屏幕时,输出窗口的起始位置为图像屏幕输出位置的屏幕坐标,
* 在采集到内存时,输出窗口的起始位置设置为(0, 0)即可。
*/
CG200SetDispWindow(hcg200, 0, 0, 768, 576);
CG200SetDispMode(hcg200, FRAME); //设置图像卡的采集显示模式为帧模式
CG200SetColorSpace(hcg200, RGB888); // 设置图像卡输出的彩色空间模式为24位色
//CG200Capture(hcg200, ENABLE); //使能采集
frame = cvCreateImageHeader(n_size, IPL_DEPTH_8U, 3); //创建图像头
// Create a window in which the captured images will be presented
cvNamedWindow( "mywindow", CV_WINDOW_AUTOSIZE );
CvVideoWriter* myVideoWriter = cvCreateVideoWriter("ll.avi", -1 , 5, n_size, 1);
char * lpvBits = (char *) malloc(768 * 576 * 83); //
IplImage* dispIMG = cvCreateImage( n_size, IPL_DEPTH_8U, 3 );
DWORD dwPage;
DWORD PhysMemAddr;
DWORD MemHandle;
DWORD LineAddr;
DWORD dwSize = 768 * 576 * 3L; //一幅图像的大小,24位
StaticMemAlloc(&dwPage, &PhysMemAddr, &MemHandle, &LineAddr);
printf("%ld /n",PhysMemAddr );
printf("%ld /n",LineAddr);
char *lpSourceBuf = (char *)LineAddr ;
CG200SnapOneToMem(hcg200, (DWORD)PhysMemAddr, dwPage*1024*4, FRAME);
fprintf( stderr, "OK! Let't begin!!/n" );
nStatus = 0;
oldTime = 0;
DWORD count1 = 0;
for(;;)
{
CG200GetSnappingStatus(hcg200, &nStatus);
if (nStatus == 0 )
{
if (nFlag == 1)
{
nFlag = 2;
CG200SnapOneToMem(hcg200, (DWORD)PhysMemAddr+dwSize, dwPage*1024*4, FRAME);
//CG200ReadFromMem(hcg200, lpSourceBuf, dwPage*1024*4, 0, lpvBits);
//memcpy(lpvBits,lpSourceBuf, dwSize );
frame ->imageData = lpSourceBuf;
}
else
{
nFlag = 1;
CG200SnapOneToMem(hcg200, (DWORD)PhysMemAddr, dwPage*1024*4, FRAME);
//CG200ReadFromMem(hcg200, lpSourceBuf+dwSize, dwPage*1024*4, 0, lpvBits);
//memcpy(lpvBits,lpSourceBuf+dwSize, dwSize );
frame ->imageData = lpSourceBuf+dwSize;
}
//处理图像
//frame ->imageData = lpvBits;
//cvConvertImage(frame, dispIMG, CV_CVTIMG_FLIP ); //垂直反转图像
cvShowImage( "mywindow", frame ); //显示图像
cvWriteFrame(myVideoWriter, frame);
count1++;
curTime = GetTickCount();
printf("%ld /n", curTime - oldTime);
oldTime = GetTickCount();
}
//If ESC key pressed, Key=0x10001B under OpenCV 0.9.7(linux version),
//remove higher bits using AND operator
if( (cvWaitKey(1) & 255) == 27 ) break;
if (count1 == 200) break;
}
CG200Capture(hcg200,FALSE); //停止捕捉图像
EndCG200(hcg200); //释放图像卡
cvReleaseVideoWriter( &myVideoWriter );
cvDestroyWindow( "mywindow" ); //释放窗口
free(lpvBits); //释放中间转换图像内存
cvReleaseImage(&dispIMG); //释放显示图像占用的内存
cvReleaseImageHeader(&frame); //释放中间转换图像头占用的内存
return 0;
}
- 使用大恒CG200图像卡采集图像用OpenCV显示存储的例子
- OpenCV创建图像并显示图像的例子
- opencv实现摄像头的实时图像采集与显示
- opencv定时采集图像并存储本地
- opencv:图像的显示
- OpenCV摄像头采集图像问题及DirectShow的使用
- 使用opencv显示openni获取的图像
- (转载)opencv 使用DirectShow采集图像
- 四.使用OpenCv采集图像及图像边缘检测
- opencv 图像显示函数使用
- OpenCV入门例子 反色显示图像
- 关于用opencv显示图像的问题
- OpenCV图像的内存存储
- OpenCV图像的内存存储
- 关于图像采集卡采集到图像到内存后怎样用Opencv进行图像处理
- 使用VS+OpenCV的图像处理简单例子
- opencv实现图像的灰度转换,均值滤波,实现图像的显示和存储
- 嵌入式Linux的图像采集与显示
- MySQL数据库与ASP.NET如何强强联手
- 张开收缩 Script
- xlib入门
- FNPLicensingService.exe : What is it and can I delete it?
- LINQ to SQL(LINQ2SQL) vs. ADO.NET Entity Framework(ADOEF)-ccBoy版
- 使用大恒CG200图像卡采集图像用OpenCV显示存储的例子
- gdb使用
- 2007_09_01炸弹人开发日志
- 系统提示某些DLL为“无效的windows映象”问题详解
- C#中串口通信编程
- XML-IXMLHTTPRequest 使用
- 常用正则表达式
- “四拍”式项目管理
- 2007_2008第一学年度 总体规划