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