MIL转为openCV图像格式

有同时使用MATROX_MC图像采集卡和openCV的同志们注意了:下面的这个例子能将MIL采集的图像格式转化为IplImage格式,方便使用openCV。

  1/* written  by cutepig. hjs00@126.com*/
  2#include <cv.h>
  3#include <highgui.h>
  4#include <math.h>
  5#include <stdio.h>
  6#include <mil.h> 
  7
  8//lib
  9// cxcore.lib cv.lib highgui.lib  mil.lib milcor.lib milgen.lib milmet2.lib milcor2.lib milmet2d.lib milmet2cl.lib milpul.lib milorion.lib mil1394.lib milvga.lib 
 10#define CHECK_EXIT(x) {if(!(x)){printf("Error %s\n",#x);exit(0);}}
 11
 12class CMIL_CV
 13{
 14    MIL_ID MilApplication,                           /* Application identifier.   */
 15          MilSystem,                                /* System identifier.        */
 16          //MilDisplay,                               /* Display identifier.       */ 
 17          MilDigitizer,                             /* Digitizer identifier.     */ 
 18          MilImageDisp;                             /* Image buffer identifier.  */
 19           
 20public:
 21    enum {
 22        Mil_CH0=M_CH0,
 23        Mil_CH1=M_CH1,
 24    }
;
 25    BOOL MilGetImage(int Channel,IplImage * &dst)
 26    {
 27        try
 28        {
 29            MbufClear(MilImageDisp, 0);
 30            MdigChannel(MilDigitizer, Channel);
 31            MdigGrab(MilDigitizer, MilImageDisp);
 32            
 33            int w=MbufInquire(MilImageDisp,M_SIZE_X,M_NULL);;
 34            int h=MbufInquire(MilImageDisp,M_SIZE_Y,M_NULL);;
 35            int band=MbufInquire(MilImageDisp,M_SIZE_BAND,M_NULL);;
 36            int pitch=MbufInquire(MilImageDisp,M_PITCH_BYTE,M_NULL);;
 37            //IplImage *dst=cvCreateImage(cvSize(w,h),8,band);
 38            if(!dst)
 39                dst=cvCreateImage(cvSize(w,h),8,band);
 40            
 41            //CHECK_EXIT(dst->width==w && dst->height==h && dst->nChannels=band);
 42            char* p=dst->imageData;
 43            MbufGet(MilImageDisp,p);
 44        }

 45        catch()
 46        {
 47            return FALSE; 
 48        }

 49
 50        return TRUE;
 51    }
;
 52    
 53    BOOL MilOpen(char *DCF_NAME)
 54    {
 55        try
 56        {
 57            MappAlloc(M_DEFAULT, &MilApplication);
 58            MsysAlloc(M_SYSTEM_METEOR_II, M_DEF_SYSTEM_NUM, M_SETUP, &MilSystem);
 59            //MdispAlloc(MilSystem, M_DEFAULT, M_DEF_DISPLAY_FORMAT, M_DEFAULT, &MilDisplay);
 60            MdigAlloc(MilSystem, M_DEFAULT, DCF_NAME, M_DEFAULT, &MilDigitizer);
 61            
 62            printf(" Allocate a display buffer, clear it and display it. \n");
 63            MbufAllocColor(MilSystem,
 64                MdigInquire(MilDigitizer, M_SIZE_BAND, M_NULL),
 65                (long) (MdigInquire(MilDigitizer, M_SIZE_X, M_NULL)),
 66                (long) (MdigInquire(MilDigitizer, M_SIZE_Y, M_NULL)),
 67                8L+M_UNSIGNED, 
 68                M_IMAGE+M_GRAB+M_DISP,
 69                &MilImageDisp);
 70            MdigControl(MilDigitizer, M_GRAB_MODE, M_SYNCHRONOUS);   //must!!
 71            MdigControl(MilDigitizer, M_CAMERA_LOCK, M_ENABLE);//
 72            MbufClear(MilImageDisp, 0);
 73        }

 74        catch()
 75        {
 76            return FALSE;
 77        }

 78
 79        return TRUE;
 80    }

 81
 82    BOOL MilClose()
 83    {
 84        try{
 85            MbufFree(MilImageDisp);
 86            MdigFree(MilDigitizer);
 87            MsysFree(MilSystem);
 88            MappFree(MilApplication);  
 89        }
catch ({
 90            return FALSE;
 91        }

 92        return TRUE;
 93    }

 94
 95    void Test()
 96    {
 97        CHECK_EXIT(MilOpen("e:/DCF6.dcf"));
 98        IplImage *img0=0;    //必须初始化为0
 99        IplImage *img1=0;
100        
101        cvNamedWindow( "CH0"1 );
102        cvNamedWindow( "CH1"1 );
103        printf("\n");
104        do
105        {
106            //奇怪,抓到的图都是CH0的//--要设置同步
107            MilGetImage(M_CH0,img0);
108            CHECK_EXIT(img0);
109            printf("\rImageSize %d*%d*%d",img0->width,img0->height,img0->nChannels);
110            cvShowImage( "CH0", img0 );
111            
112            
113            MilGetImage(M_CH1,img1);
114            CHECK_EXIT(img1);
115            cvShowImage( "CH1", img1 );
116        }

117        while(cvWaitKey(100)==-1);
118        
119        CHECK_EXIT(MilClose());
120
121        cvReleaseImage(&img0);
122        cvReleaseImage(&img1);
123    }

124}
;
125int main(int argc, char** argv)
126{
127    CMIL_CV milcv;
128    milcv.Test();
129    return 0;
130}

131
132

posted on 2007-12-10 00:20  cutepig  阅读(3149)  评论(0编辑  收藏  举报

导航