旧文-使用大恒CG200图像卡采集图像用OpenCV显示存储的例子-2007-09-01 10:41
1 #include "cv.h" 2 #include "highgui.h" 3 #include "dll/cg200-32.h" 4 #include "dll/memalloc.h" 5 #include <time.h> 6 #include <stdio.h> 7 #include <memory.h> 8 9 // A Simple Camera Capture Framework 大恒CG200 10 //开始时必须使用大恒随带的例子程序设置预留静态内存大于两幅图像的大小 11 int main( int argc, char** argv ) 12 { 13 14 DWORD oldTime, curTime; 15 16 17 IplImage* frame = 0; 18 CvSize n_size = cvSize(768,576); 19 20 HCG200 hcg200=0; //图像卡句柄 21 int CG200_status = 1; 22 23 int nStatus = 1; 24 int nFlag = 1; 25 26 hcg200 = BeginCG200(1); //初始化图像卡,获得句柄 图像卡序号为1 27 28 if(0 ==hcg200) 29 { 30 fprintf( stderr, "ERROR: can't open card! /n" ); 31 getchar(); 32 return -1; 33 } 34 35 CG200_status = CG200SetADParam(hcg200, AD_SOURCE, 0); //设置采集图像采集卡的第0路输入 36 37 if(0 == CG200_status) 38 { 39 fprintf( stderr, "ERROR: can't SET card! /n" ); 40 EndCG200(hcg200); 41 getchar(); 42 return -1; 43 } 44 45 CG200SetInpVideoWindow(hcg200, 0, 0, 768, 576); //视频输入窗口取最大,PAL制式 46 /* 47 * 视频输出窗口,即视频输出范围,输出窗口取值范围必须在输入窗口范围以内, 48 * 视频窗口左上角X坐标和窗口宽度应为4的倍数,左上角Y坐标和窗口高度应为2的倍数 49 * 在采集到屏幕时,输出窗口的起始位置为图像屏幕输出位置的屏幕坐标, 50 * 在采集到内存时,输出窗口的起始位置设置为(0, 0)即可。 51 */ 52 CG200SetDispWindow(hcg200, 0, 0, 768, 576); 53 54 CG200SetDispMode(hcg200, FRAME); //设置图像卡的采集显示模式为帧模式 55 CG200SetColorSpace(hcg200, RGB888); // 设置图像卡输出的彩色空间模式为24位色 56 57 //CG200Capture(hcg200, ENABLE); //使能采集 58 59 frame = cvCreateImageHeader(n_size, IPL_DEPTH_8U, 3); //创建图像头 60 // Create a window in which the captured images will be presented 61 cvNamedWindow( "mywindow", CV_WINDOW_AUTOSIZE ); 62 CvVideoWriter* myVideoWriter = cvCreateVideoWriter("ll.avi", -1 , 5, n_size, 1); 63 64 char * lpvBits = (char *) malloc(768 * 576 * 83); // 65 IplImage* dispIMG = cvCreateImage( n_size, IPL_DEPTH_8U, 3 ); 66 67 DWORD dwPage; 68 DWORD PhysMemAddr; 69 DWORD MemHandle; 70 DWORD LineAddr; 71 DWORD dwSize = 768 * 576 * 3L; //一幅图像的大小,24位 72 73 StaticMemAlloc(&dwPage, &PhysMemAddr, &MemHandle, &LineAddr); 74 printf("%ld /n",PhysMemAddr ); 75 printf("%ld /n",LineAddr); 76 77 char *lpSourceBuf = (char *)LineAddr ; 78 CG200SnapOneToMem(hcg200, (DWORD)PhysMemAddr, dwPage*1024*4, FRAME); 79 80 fprintf( stderr, "OK! Let't begin!!/n" ); 81 82 83 nStatus = 0; 84 oldTime = 0; 85 DWORD count1 = 0; 86 for(;;) 87 { 88 CG200GetSnappingStatus(hcg200, &nStatus); 89 90 if (nStatus == 0 ) 91 { 92 if (nFlag == 1) 93 { 94 nFlag = 2; 95 96 CG200SnapOneToMem(hcg200, (DWORD)PhysMemAddr+dwSize, dwPage*1024*4, FRAME); 97 98 //CG200ReadFromMem(hcg200, lpSourceBuf, dwPage*1024*4, 0, lpvBits); 99 //memcpy(lpvBits,lpSourceBuf, dwSize ); 100 frame ->imageData = lpSourceBuf; 101 102 103 104 } 105 else 106 { 107 nFlag = 1; 108 CG200SnapOneToMem(hcg200, (DWORD)PhysMemAddr, dwPage*1024*4, FRAME); 109 //CG200ReadFromMem(hcg200, lpSourceBuf+dwSize, dwPage*1024*4, 0, lpvBits); 110 //memcpy(lpvBits,lpSourceBuf+dwSize, dwSize ); 111 frame ->imageData = lpSourceBuf+dwSize; 112 } 113 114 //处理图像 115 //frame ->imageData = lpvBits; 116 //cvConvertImage(frame, dispIMG, CV_CVTIMG_FLIP ); //垂直反转图像 117 cvShowImage( "mywindow", frame ); //显示图像 118 cvWriteFrame(myVideoWriter, frame); 119 count1++; 120 curTime = GetTickCount(); 121 printf("%ld /n", curTime - oldTime); 122 oldTime = GetTickCount(); 123 } 124 125 126 127 //If ESC key pressed, Key=0x10001B under OpenCV 0.9.7(Linux version), 128 //remove higher bits using AND operator 129 if( (cvWaitKey(1) & 255) == 27 ) break; 130 if (count1 == 200) break; 131 132 } 133 134 135 CG200Capture(hcg200,FALSE); //停止捕捉图像 136 EndCG200(hcg200); //释放图像卡 137 138 cvReleaseVideoWriter( &myVideoWriter ); 139 cvDestroyWindow( "mywindow" ); //释放窗口 140 free(lpvBits); //释放中间转换图像内存 141 cvReleaseImage(&dispIMG); //释放显示图像占用的内存 142 cvReleaseImageHeader(&frame); //释放中间转换图像头占用的内存 143 144 145 return 0; 146 } 147