mirror of https://github.com/opencv/opencv.git
Open Source Computer Vision Library
https://opencv.org/
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
219 lines
6.3 KiB
219 lines
6.3 KiB
/*M/////////////////////////////////////////////////////////////////////////////////////// |
|
// |
|
// IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING. |
|
// |
|
// By downloading, copying, installing or using the software you agree to this license. |
|
// If you do not agree to this license, do not download, install, |
|
// copy or use the software. |
|
// |
|
// |
|
// Intel License Agreement |
|
// For Open Source Computer Vision Library |
|
// |
|
// Copyright (C) 2000, Intel Corporation, all rights reserved. |
|
// Third party copyrights are property of their respective owners. |
|
// |
|
// Redistribution and use in source and binary forms, with or without modification, |
|
// are permitted provided that the following conditions are met: |
|
// |
|
// * Redistribution's of source code must retain the above copyright notice, |
|
// this list of conditions and the following disclaimer. |
|
// |
|
// * Redistribution's in binary form must reproduce the above copyright notice, |
|
// this list of conditions and the following disclaimer in the documentation |
|
// and/or other materials provided with the distribution. |
|
// |
|
// * The name of Intel Corporation may not be used to endorse or promote products |
|
// derived from this software without specific prior written permission. |
|
// |
|
// This software is provided by the copyright holders and contributors "as is" and |
|
// any express or implied warranties, including, but not limited to, the implied |
|
// warranties of merchantability and fitness for a particular purpose are disclaimed. |
|
// In no event shall the Intel Corporation or contributors be liable for any direct, |
|
// indirect, incidental, special, exemplary, or consequential damages |
|
// (including, but not limited to, procurement of substitute goods or services; |
|
// loss of use, data, or profits; or business interruption) however caused |
|
// and on any theory of liability, whether in contract, strict liability, |
|
// or tort (including negligence or otherwise) arising in any way out of |
|
// the use of this software, even if advised of the possibility of such damage. |
|
// |
|
//M*/ |
|
|
|
#include "precomp.hpp" |
|
#include "mil.h" |
|
|
|
#if _MSC_VER >= 1200 |
|
#pragma warning( disable: 4711 ) |
|
#pragma comment(lib,"mil.lib") |
|
#pragma comment(lib,"milmet2.lib") |
|
#endif |
|
|
|
#if defined _M_X64 |
|
#pragma optimize("",off) |
|
#endif |
|
|
|
/********************* Capturing video from camera via MIL *********************/ |
|
|
|
struct |
|
{ |
|
MIL_ID MilApplication; |
|
int MilUser; |
|
} g_Mil = {0,0}; //global structure for handling MIL application |
|
|
|
class CvCaptureCAM_MIL : public CvCapture |
|
{ |
|
public: |
|
CvCaptureCAM_MIL() { init(); } |
|
virtual ~CvCaptureCAM_MIL() { close(); } |
|
|
|
virtual bool open( int index ); |
|
virtual void close(); |
|
|
|
virtual double getProperty(int); |
|
virtual bool setProperty(int, double) { return false; } |
|
virtual bool grabFrame(); |
|
virtual IplImage* retrieveFrame(int); |
|
virtual int getCaptureDomain() { return CV_CAP_MIL; } // Return the type of the capture object: CV_CAP_VFW, etc... |
|
|
|
protected: |
|
void init(); |
|
|
|
MIL_ID |
|
MilSystem, /* System identifier. */ |
|
MilDisplay, /* Display identifier. */ |
|
MilDigitizer, /* Digitizer identifier. */ |
|
MilImage; /* Image buffer identifier. */ |
|
IplImage* rgb_frame; |
|
}; |
|
|
|
|
|
void CvCaptureCAM_MIL::init() |
|
{ |
|
MilSystem = MilDisplay = MilDigitizer = MilImage = M_NULL; |
|
rgb_frame = 0; |
|
} |
|
|
|
// Initialize camera input |
|
bool CvCaptureCAM_MIL::open( int wIndex ) |
|
{ |
|
close(); |
|
|
|
if( g_Mil.MilApplication == M_NULL ) |
|
{ |
|
assert(g_Mil.MilUser == 0); |
|
MappAlloc(M_DEFAULT, &(g_Mil.MilApplication) ); |
|
g_Mil.MilUser = 1; |
|
} |
|
else |
|
{ |
|
assert(g_Mil.MilUser>0); |
|
g_Mil.MilUser++; |
|
} |
|
|
|
int dev_table[16] = { M_DEV0, M_DEV1, M_DEV2, M_DEV3, |
|
M_DEV4, M_DEV5, M_DEV6, M_DEV7, |
|
M_DEV8, M_DEV9, M_DEV10, M_DEV11, |
|
M_DEV12, M_DEV13, M_DEV14, M_DEV15 }; |
|
|
|
//set default window size |
|
int w = 320; |
|
int h = 240; |
|
|
|
for( ; wIndex < 16; wIndex++ ) |
|
{ |
|
MsysAlloc( M_SYSTEM_SETUP, //we use default system, |
|
//if this does not work |
|
//try to define exact board |
|
//e.g.M_SYSTEM_METEOR,M_SYSTEM_METEOR_II... |
|
dev_table[wIndex], |
|
M_DEFAULT, |
|
&MilSystem ); |
|
|
|
if( MilSystem != M_NULL ) |
|
break; |
|
} |
|
if( MilSystem != M_NULL ) |
|
{ |
|
MdigAlloc(MilSystem,M_DEFAULT, |
|
M_CAMERA_SETUP, //default. May be M_NTSC or other |
|
M_DEFAULT,&MilDigitizer); |
|
|
|
rgb_frame = cvCreateImage(cvSize(w,h), IPL_DEPTH_8U, 3 ); |
|
MdigControl(MilDigitizer, M_GRAB_SCALE, 1.0 / 2); |
|
|
|
/*below line enables getting image vertical orientation |
|
consistent with VFW but it introduces some image corruption |
|
on MeteorII, so we left the image as is*/ |
|
//MdigControl(MilDigitizer, M_GRAB_DIRECTION_Y, M_REVERSE ); |
|
|
|
MilImage = MbufAllocColor(MilSystem, 3, w, h, |
|
8+M_UNSIGNED, M_IMAGE + M_GRAB, M_NULL); |
|
} |
|
|
|
return MilSystem != M_NULL; |
|
} |
|
|
|
void CvCaptureCAM_MIL::close( CvCaptureCAM_MIL* capture ) |
|
{ |
|
if( MilSystem != M_NULL ) |
|
{ |
|
MdigFree( MilDigitizer ); |
|
MbufFree( MilImage ); |
|
MsysFree( MilSystem ); |
|
cvReleaseImage(&rgb_frame ); |
|
|
|
g_Mil.MilUser--; |
|
if(!g_Mil.MilUser) |
|
MappFree(g_Mil.MilApplication); |
|
|
|
MilSystem = M_NULL; |
|
MilDigitizer = M_NULL; |
|
} |
|
} |
|
|
|
|
|
bool CvCaptureCAM_MIL::grabFrame() |
|
{ |
|
if( MilSystem ) |
|
{ |
|
MdigGrab(MilDigitizer, MilImage); |
|
return true; |
|
} |
|
return false; |
|
} |
|
|
|
|
|
IplImage* CvCaptureCAM_MIL::retrieveFrame(int) |
|
{ |
|
MbufGetColor(MilImage, M_BGR24+M_PACKED, M_ALL_BAND, (void*)(rgb_frame->imageData)); |
|
return rgb_frame; |
|
} |
|
|
|
double CvCaptureCAM_MIL::getProperty( int property_id ) |
|
{ |
|
switch( property_id ) |
|
{ |
|
case CV_CAP_PROP_FRAME_WIDTH: |
|
return rgb_frame ? rgb_frame->width : 0; |
|
case CV_CAP_PROP_FRAME_HEIGHT: |
|
return rgb_frame ? rgb_frame->height : 0; |
|
} |
|
return 0; |
|
} |
|
|
|
bool CvCaptureCAM_MIL::setProperty( int, double ) |
|
{ |
|
return false; |
|
} |
|
|
|
|
|
CvCapture* cvCreateCameraCapture_MIL( int index ) |
|
{ |
|
CvCaptureCAM_MIL* capture = new CvCaptureCAM_MIL; |
|
|
|
if( capture->open( index )) |
|
return capture; |
|
|
|
delete capture; |
|
return 0; |
|
}
|
|
|