📄 capimage.cpp
字号:
/****************************************************************************************/
// Compile: At the MATLAB prompt type: 'cc'
//
// fw-01-08
//
// capture an image in the requested format (RGB, YUV) and return data to MATLAB
// perform 'classification' (CMVision) and return data to MATLAB (as RGB)
//
// Display: 'image(capImage(0))'
//
/****************************************************************************************/
/* includes --------------------------------------------------------------------- */
#include <windows.h>
#include <string.h> // strcmpi
#include "1394camera.h"
#include "mex.h"
#include "matrix.h"
/* (static) global variables ---------------------------------------------------- */
C1394Camera theCamera;
C1394CameraControl *pControl;
/* camera display modes */
// mode table (supported by the CMU driver, format '0' only):
//
// 0: {160 ,120 ,COLOR_CODE_YUV444},
// 1: {320 ,240 ,COLOR_CODE_YUV422},
// 2: {640 ,480 ,COLOR_CODE_YUV411},
// 3: {640 ,480 ,COLOR_CODE_YUV422},
// 4: {640 ,480 ,COLOR_CODE_RGB8},
// 5: {640 ,480 ,COLOR_CODE_Y8},
// 6: {640 ,480 ,COLOR_CODE_Y16},
//
// NOTE: mode enumeration now in line with camera modes
// (formerly: 0 = RGB, 1 = YUV)
//
// fw-12-07
//
#define numMYCAMERAMODES 7
typedef enum {
CAMERA_STOP = -1,
CAMERA_YUV444_160x120,
CAMERA_YUV422_320x240,
CAMERA_YUV411_640x480,
CAMERA_YUV422_640x480,
CAMERA_RGB8_640x480,
CAMERA_Y8_640x480,
CAMERA_Y16_640x480
} myCameraModes;
/* camera features to be controlled manually */
#define numMYFEATURES 7
static const struct feature_description {
LPCSTR name;
LPCSTR unit;
} myFeatures[numMYFEATURES] =
{
{"Brightness","%"},
{"Auto Exposure","eV"},
{"Sharpness",""},
{"White Balance", "K"},
{"Saturation","%"},
{"Shutter","sec"},
{"Gain","dB"},
};
static unsigned char bufRGB[640*480*3]; // local image buffer (max required size)
#define NDIMS 3 // (maximum) dimension of the output data (RGB)
static unsigned int dims[NDIMS];
static unsigned long frameWidth, frameHeight;
static unsigned int origX, origY;
static unsigned long nElements;
/* this variable is set to one when the grabber object has been initialized */
static unsigned int initCamera = 0;
/* verbosity control variable */
static unsigned int verboseFlag = 0;
/* this variable is set according to the 'mode' call-up parameter */
static myCameraModes currentMode = CAMERA_STOP; // start with CAMERA_STOP mode (required for correct function)
/* allow maximum width and height to be reduced... */
static unsigned int requestedWidth;
static unsigned int currWidth = 0;
static unsigned int requestedHeight;
static unsigned int currHeight = 0;
static unsigned int requestedOrigX;
static unsigned int currOrigX = 0;
static unsigned int requestedOrigY;
static unsigned int currOrigY = 0;
/* local functions -------------------------------------------------------- */
/* mySetFeature =========================================================== */
/* helper function to set a named feature (e.g. 'Brightness') to a specific value */
static void mySetFeature(const char *feature, int vLo, int vHi = 0) {
int fID = dc1394GetFeatureId(feature);
int aa;
if((pControl = theCamera.GetCameraControl(CAMERA_FEATURE(fID))) != NULL) {
/* found the named feature -> check if manual setting has been requested */
if(vLo < 0 || vHi < 0) {
/* request for automatic mode (if available) */
if(pControl->HasAutoMode()) {
/* (re-)activate automatic mode */
pControl->SetAutoMode(TRUE);
}
} else {
/* manual mode -> set low and high value */
pControl->SetValue(vLo, vHi);
/* is this an automatically controlled feature */
aa = pControl->HasAutoMode();
if(aa) {
/* force automatic mode to off... */
pControl->SetAutoMode(FALSE);
}
}
} else {
/* feature name not registered */
mexPrintf("Unknown cameara feature '%s'\n", feature);
}
} /* mySetFeature ========================================================== */
/* dumpCameraStats ========================================================= */
/* dump some info about the selected camera to the workspace window */
static void dumpCameraStats(void) {
#define maxBufLen 100
char myBuf[maxBufLen];
int myBufLen = maxBufLen;
int myNode, numCameras;
#ifdef DEBUGONLY /* ============================================= */
/* display list of all features as registered by the driver... */
for(int i=0; i<FEATURE_NUM_FEATURES; i++) {
/* current feature */
CAMERA_FEATURE fID = (CAMERA_FEATURE)(i);
if((pControl = theCamera.GetCameraControl(fID)) != NULL) {
/* call 1394camapi function 'dc1394GetFeatureName' to determine feature name */
mexPrintf("Camera feature %d is registered as '%s'\n", fID, dc1394GetFeatureName(fID));
} else {
/* feature name not registered */
mexPrintf("Camera feature %d has no registered name\n", fID);
}
}
#endif /* DEBUGONLY ============================================ */
theCamera.RefreshCameraList();
numCameras = theCamera.GetNumberCameras();
mexPrintf("\n%-30s %d\n", "Number of cameras found:", numCameras);
myNode = theCamera.GetNode();
theCamera.GetNodeDescription(myNode, myBuf, myBufLen);
mexPrintf("Device description (node %d): %s\n", myNode, myBuf);
theCamera.GetCameraName(myBuf, myBufLen);
mexPrintf("%-30s %s\n", "Camera name:", myBuf);
theCamera.GetCameraVendor(myBuf, myBufLen);
mexPrintf("%-30s %s\n", "Vendor name:", myBuf);
mexPrintf("%-30s %ld\n", "Version number:", theCamera.GetVersion());
mexPrintf("%-30s %d\n", "Max speed:", theCamera.GetMaxSpeed());
mexPrintf("%-30s %d\n", "Link status", theCamera.CheckLink());
mexPrintf("%-30s %d\n", "Has power control:", theCamera.HasPowerControl());
mexPrintf("%-30s %d\n", "Status power control:", theCamera.StatusPowerControl());
//int SetPowerControl(BOOL on);
mexPrintf("%-30s %d\n", "Has 1394b:", theCamera.Has1394b());
mexPrintf("%-30s %d\n", "Status 1394b:", theCamera.Status1394b());
//int Set1394b(BOOL on);
// read out camera eeprom
mexPrintf("%-30s %d\n", "Number of channels (camera):", theCamera.MemGetNumChannels());
mexPrintf("%-30s %d\n", "Current channel (camera):", theCamera.MemGetCurrentChannel());
// read out registry
//mexPrintf("%-30s %d\n", "Default brightness (registry):", theCamera.RegLoadSettings("HKEY_LOCAL_MACHINE/SOFTWARE/CMU/1394Camera/6143140808066302/ControlPanes/DefaultView/Brightness"));
// check all video modes supported by the CMU driver for availability on the currently connected camera
//
// NOTE: 'format' always set to '0' (= max resolution: 640 x 480 .... unibrain fire-i)
//
// fw-01-08
//
for(int ii=0; ii<numMYCAMERAMODES; ii++) {
VIDEO_MODE_DESCRIPTOR myModeDesc;
/* get video mode description, format: 0L, */
dc1394GetModeDescriptor(0L, (ULONG)ii, &myModeDesc);
dc1394GetModeString(0L, (ULONG)ii, myBuf, myBufLen);
if(theCamera.HasVideoMode(0L, ii)) {
mexPrintf("%-30s %s [%d bits per pixel]\n", "Camera supports video mode:", myBuf, (int)dc1394GetBitsPerPixel(myModeDesc.colorcode));
} else {
mexPrintf("%-30s %s\n", "Unsupported video mode:", myBuf);
}
}
// display selected features
{
int fID;
unsigned short aa, bb;
/* display current settings of the above features... */
for(int i=0; i<numMYFEATURES; i++) {
fID = dc1394GetFeatureId(myFeatures[i].name);
mexPrintf("\nFeature '%s' (ID %d)\n", myFeatures[i].name, fID);
/* get chosen feature control object */
pControl = theCamera.GetCameraControl(CAMERA_FEATURE(fID));
pControl->GetRange(&aa, &bb);
mexPrintf("%-30s %d, %d\n", "Range (min, max):", aa, bb);
pControl->GetValue(&aa, &bb);
if(bb) {
/* feature with a range */
mexPrintf("%-30s %d, %d\n", "Current values (low, high):", aa, bb);
} else {
/* feature with a single value */
mexPrintf("%-30s %d\n", "Current value:", aa, bb);
}
/* selected attributes */
aa = pControl->HasManualMode();
if(aa == 0) {
mexPrintf("%-30s %d\n", "Attribute 'ManualMode' (!):", aa);
}
aa = pControl->HasAutoMode();
if(aa) {
mexPrintf("%-30s %d\n", "Attribute 'AutoMode':", pControl->StatusAutoMode());
}
aa = pControl->HasOnePush();
if(aa) {
mexPrintf("%-30s %d\n", "Attribute 'OnePush':", pControl->StatusOnePush());
}
aa = pControl->HasOnOff();
if(aa) {
mexPrintf("%-30s %d\n", "Attribute 'OnOff':", pControl->StatusOnOff());
}
// always '1'...
//
//aa = pControl->HasPresence();
//if(aa) {
// mexPrintf("%-30s %d\n", "Attribute 'Presence':", pControl->StatusPresence());
//}
/* absolute control... (scaled) */
if(pControl->HasAbsControl()) {
float faa, fbb;
pControl->GetRangeAbsolute(&faa, &fbb);
mexPrintf("%-30s %g, %g\n", "Scaled range (min, max):", faa, fbb);
pControl->GetValueAbsolute(&faa);
mexPrintf("%-30s %g\n", "Scaled value:", faa);
}
} /* for all features */
}
} /* dumpCameraStats ======================================================= */
/* myConfigCamera =========================================================== */
static void myConfigCamera(void) {
FILE *fp;
/* setup camera(s) */
mexPrintf("\nAdjusting camera settings...\n");
if((fp = fopen("cameraconfig.txt","r")) == NULL) {
mexPrintf("Couldn't find camera configuration file ('cameraconfig.txt') -> using default values, automatic wherever possible.\n");
/* use default camera settings - values found using the control dialog of '1394CameraDemo.exe' */
//mySetFeature("Shutter", 6, 0);
//mySetFeature("Saturation", 90, 0);
//mySetFeature("White Balance", 69, 96);
//mySetFeature("Gain", 87, 0);
//mySetFeature("Auto Exposure", 511, 0);
//mySetFeature("Brightness", 304, 0);
/* negative values -> automatic mode (if possible), otherwise: keep value as is */
mySetFeature("Shutter", -1, 0);
mySetFeature("Saturation", -1, 0);
mySetFeature("White Balance", -1, -1);
mySetFeature("Gain", -1, 0);
mySetFeature("Auto Exposure", -1, 0);
mySetFeature("Brightness", -1, 0);
} else {
/* cameraconfig.txt found -> analyse its contents */
while(!feof(fp)) {
char myStr[30];
int myPara[7];
fscanf(fp, "%s", myStr);
//mexPrintf("Read: >>%s<<\n", myStr);
/* filter out 'Camera_1 (only using 'camera_1' here...) */
if(strcmpi(myStr, "[Camera_1]") == 0) {
/* found definition for 'camera_1' -> read 7 values... */
mexPrintf("Programming camera '1' with: ");
for(int i=0; i<7; i++) {
fscanf(fp, "%d", &myPara[i]);
mexPrintf("%d ", myPara[i]);
}
mexPrintf("\n");
/* reset string */
myStr[0] = 0;
/* use user set of camera settings (file: cameraconfig.txt) */
mySetFeature("Shutter", myPara[0], 0);
mySetFeature("Saturation", myPara[1], 0);
mySetFeature("White Balance", myPara[2], myPara[3]);
mySetFeature("Gain", myPara[4], 0);
mySetFeature("Auto Exposure", myPara[5], 0);
mySetFeature("Brightness", myPara[6], 0);
} /* if(camera_1) */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -