旧文-使用大恒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  

 

posted on 2017-06-28 19:57  fishhead  阅读(592)  评论(0编辑  收藏  举报

导航