使用大恒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;
}