00001
00002
00003
00004
00005
00006
00007
00008 #include <opencv2/highgui/highgui.hpp>
00009 #include <opencv2/imgproc/imgproc.hpp>
00010
00011 #include "Camera.h"
00012 #include "CameraException.h"
00013
00014 namespace nifti {
00015 namespace dc1394 {
00016
00017 Camera::Camera() :
00018 camera(NULL), bayerMethod(DC1394_BAYER_METHOD_HQLINEAR) {
00019 pthread_mutex_init(&captureMutex, NULL);
00020 }
00021
00022 Camera::Camera(dc1394camera_t* camera) :
00023 camera(camera), bayerMethod(DC1394_BAYER_METHOD_HQLINEAR) {
00024 pthread_mutex_init(&captureMutex, NULL);
00025 }
00026
00027 Camera::~Camera() {
00028
00029 unlockCapture();
00030 }
00031
00032 void Camera::setup() {
00033 printf("Camera::setup()\n");
00034
00035 setOperationMode(DC1394_OPERATION_MODE_1394B);
00036 setIsoSpeed(DC1394_ISO_SPEED_800);
00037 setVideoMode(DC1394_VIDEO_MODE_FORMAT7_0);
00038 setFormat7Roi(DC1394_VIDEO_MODE_FORMAT7_0, DC1394_COLOR_CODING_RAW8, 9792, 0, 0, 1616, 7392);
00039 }
00040
00041 dc1394color_coding_t Camera::getFormat7ColorCoding() {
00042 dc1394color_coding_t colorCoding;
00043 dc1394error_t error;
00044 error = dc1394_format7_get_color_coding(camera, DC1394_VIDEO_MODE_FORMAT7_0, &colorCoding);
00045 CAMERA_EXCEPTION(error, "Could not get Format 7 color coding.");
00046 return colorCoding;
00047 }
00048
00049 dc1394color_filter_t Camera::getFormat7ColorFilter() {
00050 dc1394color_filter_t colorFilter;
00051 dc1394error_t error;
00052 error = dc1394_format7_get_color_filter(camera, DC1394_VIDEO_MODE_FORMAT7_0, &colorFilter);
00053 CAMERA_EXCEPTION(error, "Could not get Format 7 color filter.");
00054 return colorFilter;
00055 }
00056
00057 float Camera::getFormat7FrameInterval() {
00058 float frameInterval;
00059 dc1394error_t error;
00060 error = dc1394_format7_get_frame_interval(camera, DC1394_VIDEO_MODE_FORMAT7_0, &frameInterval);
00061 CAMERA_EXCEPTION(error, "Could not get Format 7 frame interval.");
00062 return frameInterval;
00063 }
00064
00065 uint32_t Camera::getFormat7PacketsPerFrame() {
00066 uint32_t packetsPerFrame;
00067 dc1394error_t error;
00068 error = dc1394_format7_get_packets_per_frame(camera, DC1394_VIDEO_MODE_FORMAT7_0, &packetsPerFrame);
00069 CAMERA_EXCEPTION(error, "Could not get Format 7 packets per frame.");
00070 return packetsPerFrame;
00071 }
00072
00073 uint32_t Camera::getFormat7PacketSize() {
00074 uint32_t packetSize;
00075 dc1394error_t error;
00076 error = dc1394_format7_get_packet_size(camera, DC1394_VIDEO_MODE_FORMAT7_0, &packetSize);
00077 CAMERA_EXCEPTION(error, "Could not get Format 7 packet size.");
00078 return packetSize;
00079 }
00080
00081 uint32_t Camera::getFormat7RecommendedPacketSize() {
00082 uint32_t packetSize;
00083 dc1394error_t error;
00084 error = dc1394_format7_get_recommended_packet_size(camera, DC1394_VIDEO_MODE_FORMAT7_0, &packetSize);
00085 CAMERA_EXCEPTION(error, "Could not get Format 7 recommended packet size.");
00086 return packetSize;
00087 }
00088
00089 dc1394operation_mode_t Camera::getOperationMode() {
00090 printf("Camera::getOperationMode()\n");
00091 dc1394operation_mode_t operationMode;
00092 dc1394error_t error;
00093 error = dc1394_video_get_operation_mode(camera, &operationMode);
00094 CAMERA_EXCEPTION(error, "Could not get operation mode.");
00095 printf("Camera::getOperationMode(): %i\n", operationMode);
00096 return operationMode;
00097 }
00098
00099 void Camera::setOperationMode(dc1394operation_mode_t operationMode) {
00100 printf("Camera::setOperationMode(): %i\n", operationMode);
00101 dc1394error_t error;
00102 error = dc1394_video_set_operation_mode(camera, operationMode);
00103 CAMERA_EXCEPTION(error, "Could not set operation mode.");
00104 }
00105
00106 dc1394speed_t Camera::getIsoSpeed() {
00107 printf("Camera::getIsoSpeed()\n");
00108 dc1394speed_t isoSpeed;
00109 dc1394error_t error;
00110 error = dc1394_video_get_iso_speed(camera, &isoSpeed);
00111 CAMERA_EXCEPTION(error, "Could not get ISO speed.");
00112 printf("Camera::getIsoSpeed(): %i\n", isoSpeed);
00113 return isoSpeed;
00114 }
00115
00116 void Camera::setIsoSpeed(dc1394speed_t isoSpeed) {
00117 printf("Camera::setIsoSpeed(): %i\n", isoSpeed);
00118 dc1394error_t error;
00119 error = dc1394_video_set_iso_speed(camera, isoSpeed);
00120 CAMERA_EXCEPTION(error, "Could not set ISO speed.");
00121 }
00122
00123 dc1394video_mode_t Camera::getVideoMode() {
00124 printf("Camera::getVideoMode()\n");
00125 dc1394video_mode_t videoMode;
00126 dc1394error_t error;
00127 error = dc1394_video_get_mode(camera, &videoMode);
00128 CAMERA_EXCEPTION(error, "Could not get video mode.");
00129 printf("Camera::getVideoMode(): %i\n", videoMode);
00130 return videoMode;
00131 }
00132
00133 void Camera::setVideoMode(dc1394video_mode_t videoMode) {
00134 printf("Camera::setVideoMode(): %i\n", videoMode);
00135 dc1394error_t error;
00136 error = dc1394_video_set_mode(camera, videoMode);
00137 CAMERA_EXCEPTION(error, "Could not set video mode.");
00138 }
00139
00140 void Camera::getFormat7Roi(dc1394video_mode_t videoMode, dc1394color_coding_t* colorCoding, uint32_t* packetSize,
00141 uint32_t* left, uint32_t* top, uint32_t* width, uint32_t* height) {
00142 printf("Camera::getFormat7Roi()\n");
00143 dc1394error_t error;
00144 error = dc1394_format7_get_roi(camera, videoMode, colorCoding, packetSize, left, top, width, height);
00145 CAMERA_EXCEPTION(error, "Could not get Format 7 ROI.");
00146 printf(
00147 "Camera::getFormat7Roi(): video mode: %i, color coding: %i, packet size: %i, left: %i, top: %i, width: %i, height: %i\n",
00148 videoMode, *colorCoding, *packetSize, *left, *top, *width, *height);
00149 }
00150
00151 void Camera::setFormat7Roi(dc1394video_mode_t videoMode, dc1394color_coding_t colorCoding, int32_t packetSize,
00152 int32_t left, int32_t top, int32_t width, int32_t height) {
00153 printf(
00154 "Camera::setFormat7Roi(): video mode: %i, color coding: %i, packet size: %i, left: %i, top: %i, width: %i, height: %i\n",
00155 videoMode, colorCoding, packetSize, left, top, width, height);
00156 dc1394error_t error;
00157 error = dc1394_format7_set_roi(camera, videoMode, colorCoding, packetSize, left, top, width, height);
00158 CAMERA_EXCEPTION(error, "Could not set Format 7 ROI.");
00159 }
00160
00161 void Camera::setupCapture() {
00162
00163 printf("Camera::setupCapture()\n");
00164 dc1394error_t error;
00165
00166
00167 error = dc1394_capture_setup(camera, 2, DC1394_CAPTURE_FLAGS_DEFAULT);
00168 CAMERA_EXCEPTION(error, "Could not setup capture.");
00169 }
00170
00171 void Camera::stopCapture() {
00172
00173 dc1394error_t error;
00174 error = dc1394_capture_stop(camera);
00175 CAMERA_EXCEPTION(error, "Could not stop capture.");
00176 }
00177
00178 void Camera::startVideoTransmission() {
00179 printf("Camera::startVideoTransmission()\n");
00180 dc1394error_t error;
00181 error = dc1394_video_set_transmission(camera, DC1394_ON);
00182 CAMERA_EXCEPTION(error, "Could not start video transmission.");
00183 }
00184
00185 void Camera::stopVideoTransmission() {
00186
00187 dc1394error_t error;
00188 error = dc1394_video_set_transmission(camera, DC1394_OFF);
00189 CAMERA_EXCEPTION(error, "Could not stop video transmission");
00190 }
00191
00192 void Camera::flushFrames() {
00193
00194 lockCapture();
00195
00196 dc1394video_frame_t* frame;
00197 dc1394error_t error;
00198
00199 error = dc1394_capture_dequeue(camera, DC1394_CAPTURE_POLICY_POLL, &frame);
00200 CAMERA_EXCEPTION(error, "Capture dequeue failed while flushing frames.");
00201
00202 while (frame) {
00203 error = dc1394_capture_enqueue(camera, frame);
00204 CAMERA_EXCEPTION(error, "Capture enqueue failed while flushing frames.");
00205 error = dc1394_capture_dequeue(camera, DC1394_CAPTURE_POLICY_POLL, &frame);
00206 CAMERA_EXCEPTION(error, "Capture dequeue failed while flushing frames.");
00207 }
00208
00209 unlockCapture();
00210 }
00211
00212 void Camera::dropFrames(int n) {
00213
00214 lockCapture();
00215
00216 dc1394video_frame_t* frame;
00217 dc1394error_t error;
00218
00219 for (int i = 0; i < n; i++) {
00220 error = dc1394_capture_dequeue(camera, DC1394_CAPTURE_POLICY_WAIT, &frame);
00221 CAMERA_EXCEPTION(error, "Capture dequeue failed while dropping frames.");
00222 error = dc1394_capture_enqueue(camera, frame);
00223 CAMERA_EXCEPTION(error, "Capture enqueue failed while dropping frames.");
00224 }
00225
00226 unlockCapture();
00227 }
00228
00229 void Camera::startOneShot() {
00230
00231 dc1394error_t error;
00232 error = dc1394_video_set_one_shot(camera, DC1394_ON);
00233 CAMERA_EXCEPTION(error, "Failed to start one shot video.");
00234 }
00235
00236 void Camera::stopOneShot() {
00237
00238 dc1394error_t error;
00239 error = dc1394_video_set_one_shot(camera, DC1394_OFF);
00240 CAMERA_EXCEPTION(error, "Failed to stop one shot video.");
00241 }
00242
00243 void Camera::lockCapture() {
00244 pthread_mutex_lock(&captureMutex);
00245 }
00246
00247 void Camera::unlockCapture() {
00248 pthread_mutex_unlock(&captureMutex);
00249 }
00250
00251 dc1394video_frame_t* Camera::dequeueFrame(const dc1394capture_policy_t capturePolicy) {
00252
00253 lockCapture();
00254 dc1394error_t error;
00255 dc1394video_frame_t* frame;
00256 error = dc1394_capture_dequeue(camera, capturePolicy, &frame);
00257 CAMERA_EXCEPTION(error, "Failed to dequeue frame.");
00258
00259 dequeuedFrames.push(frame);
00260 unlockCapture();
00261
00262 return frame;
00263 }
00264
00265 bool Camera::isFrameCorrupt(dc1394video_frame_t* frame) {
00266 return dc1394_capture_is_frame_corrupt(camera, frame) == DC1394_TRUE;
00267 }
00268
00269 void Camera::enqueueFrameLater(const dc1394video_frame_t* frame) {
00270
00271 lockCapture();
00272 framesToEnqueue.insert(const_cast<dc1394video_frame_t*> (frame));
00273 unlockCapture();
00274 }
00275
00276 void Camera::enqueueFrames() {
00277
00278 lockCapture();
00279
00280
00281 while (framesToEnqueue.find(dequeuedFrames.front()) != framesToEnqueue.end()) {
00282
00283 dc1394error_t error;
00284 error = dc1394_capture_enqueue(camera, dequeuedFrames.front());
00285 CAMERA_EXCEPTION(error, "Failed to enqueue frame.");
00286
00287 framesToEnqueue.erase(dequeuedFrames.front());
00288 dequeuedFrames.pop();
00289 }
00290
00291 unlockCapture();
00292 }
00293
00294 void Camera::debayerFrame(dc1394video_frame_t* in, dc1394video_frame_t* out) {
00295
00296 out->color_coding = DC1394_COLOR_CODING_RGB8;
00297 out->image = NULL;
00298 out->allocated_image_bytes = 0;
00299
00300 dc1394error_t error;
00301 error = dc1394_debayer_frames(in, out, bayerMethod);
00302 if (error != DC1394_SUCCESS) {
00303 free(out->image);
00304 }
00305 CAMERA_EXCEPTION(error, "Could not debayer frames.");
00306 }
00307
00308 void Camera::captureColorMat(cv::Mat& bgrMat, uint64_t& timestamp, bool wait) {
00309
00310
00311 bgrMat.create(0, 0, CV_8UC3);
00312
00313 dc1394capture_policy_t capturePolicy = wait ? DC1394_CAPTURE_POLICY_WAIT : DC1394_CAPTURE_POLICY_POLL;
00314 dc1394video_frame_t* capturedFrame = dequeueFrame(capturePolicy);
00315
00316
00317
00318 if (!capturedFrame) {
00319 return;
00320 }
00321
00322
00323
00324
00325
00326
00327
00328
00329
00330
00331
00332
00333
00334
00335
00336
00337
00338
00339 if (capturedFrame->video_mode == DC1394_VIDEO_MODE_FORMAT7_6) {
00340 cv::Mat decodedFrame(capturedFrame->size[1], capturedFrame->size[0], CV_8UC1);
00341
00342 unsigned int jpgadr, jpgsize, adr;
00343 for (int cam = 0; cam < 6; cam++) {
00344 adr = 0x340 + (5 - cam) * 32;
00345 jpgadr = (((unsigned int)*(capturedFrame->image + adr)) << 24)+
00346 (((unsigned int)*(capturedFrame->image + adr + 1)) << 16)+
00347 (((unsigned int)*(capturedFrame->image + adr + 2)) << 8)+
00348 (((unsigned int)*(capturedFrame->image + adr + 3)));
00349 adr += 4;
00350 jpgsize = (((unsigned int)*(capturedFrame->image + adr)) << 24)+
00351 (((unsigned int)*(capturedFrame->image+adr + 1)) << 16)+
00352 (((unsigned int)*(capturedFrame->image+adr + 2)) << 8)+
00353 (((unsigned int)*(capturedFrame->image+adr + 3)));
00354
00355 if (jpgsize != 0) {
00356
00357
00358 cv::Mat decodedImage = cv::imdecode(cv::Mat(std::vector<uchar>(capturedFrame->image + jpgadr, capturedFrame->image + jpgadr + jpgsize)), -1);
00359 if (decodedImage.empty()) {
00360 printf("Decoding failed.\n");
00361 enqueueFrameLater(capturedFrame);
00362 enqueueFrames();
00363 return;
00364 }
00365 cv::Mat targetRowRange = decodedFrame.rowRange(cam * 1232, (cam + 1) * 1232);
00366 decodedImage.copyTo(targetRowRange);
00367 }
00368 }
00369 memcpy(capturedFrame->image, decodedFrame.data, capturedFrame->size[1] * capturedFrame->size[0]);
00370
00371
00372
00373
00374
00375
00376
00377
00378
00379
00380
00381
00382
00383 }
00384
00385
00386 if (isFrameCorrupt(capturedFrame)) {
00387 dc1394_log_warning("Frame corrupted.");
00388 enqueueFrameLater(capturedFrame);
00389 enqueueFrames();
00390 return;
00391 }
00392
00393 timestamp = capturedFrame->timestamp;
00394
00395 printf("Frame captured: frames behind: %u, id: %u, timestamp: %lu\n", capturedFrame->frames_behind, capturedFrame->id,
00396 static_cast<unsigned long>(capturedFrame->timestamp));
00397
00398
00399 dc1394video_frame_t rgbFrame;
00400 debayerFrame(capturedFrame, &rgbFrame);
00401
00402 enqueueFrameLater(capturedFrame);
00403 enqueueFrames();
00404
00405 cv::Mat rgbMat(rgbFrame.size[1], rgbFrame.size[0], CV_8UC3, rgbFrame.image);
00406 cv::cvtColor(rgbMat, bgrMat, CV_RGB2BGR);
00407
00408 free(rgbFrame.image);
00409 }
00410
00411 void Camera::powerOn() {
00412
00413 dc1394error_t error;
00414 error = dc1394_camera_set_power(camera, DC1394_ON);
00415 CAMERA_EXCEPTION(error, "Could not power on the camera.");
00416 }
00417
00418 void Camera::powerOff() {
00419
00420 dc1394error_t error;
00421 error = dc1394_camera_set_power(camera, DC1394_OFF);
00422 CAMERA_EXCEPTION(error, "Could not power off the camera.");
00423 }
00424
00425 void Camera::reset() {
00426
00427 dc1394error_t error;
00428 error = dc1394_camera_reset(camera);
00429 CAMERA_EXCEPTION(error, "Camera reset failed.");
00430 }
00431
00432 void Camera::resetBus() {
00433
00434 dc1394error_t error;
00435 error = dc1394_reset_bus(camera);
00436 CAMERA_EXCEPTION(error, "Reseting bus failed.");
00437 }
00438
00439 void Camera::releaseAll() {
00440
00441 dc1394error_t error;
00442 error = dc1394_iso_release_all(camera);
00443 CAMERA_EXCEPTION(error, "Releasing ISO channels and bandwidth failed.");
00444 }
00445
00446 dc1394bayer_method_t Camera::getBayerMethod() {
00447 return bayerMethod;
00448 }
00449
00450 void Camera::setBayerMethod(dc1394bayer_method_t method) {
00451 bayerMethod = method;
00452 }
00453
00454 uint32_t Camera::getRegister(uint64_t offset) {
00455 uint32_t value;
00456 dc1394error_t err;
00457 err = dc1394_get_register(camera, offset, &value);
00458 CAMERA_EXCEPTION(err, "Getting camera register failed.");
00459 return value;
00460 }
00461
00462 void Camera::setRegister(uint64_t offset, uint32_t value) {
00463 dc1394error_t err;
00464 err = dc1394_set_register(camera, offset, value);
00465 CAMERA_EXCEPTION(err, "Setting camera register failed.");
00466 }
00467
00468 uint32_t Camera::getControlRegister(uint64_t offset) {
00469 uint32_t value;
00470 dc1394error_t err;
00471 err = dc1394_get_control_register(camera, offset, &value);
00472 CAMERA_EXCEPTION(err, "Getting camera control register failed.");
00473 return value;
00474 }
00475
00476 void Camera::setControlRegister(uint64_t offset, uint32_t value) {
00477 dc1394error_t err;
00478 err = dc1394_set_control_register(camera, offset, value);
00479 CAMERA_EXCEPTION(err, "Setting camera control register failed.");
00480 }
00481
00482 bool Camera::isFeaturePresent(dc1394feature_t feat) {
00483 dc1394error_t err;
00484 dc1394bool_t f_pres;
00485 err = dc1394_feature_is_present(camera, feat, &f_pres);
00486 CAMERA_EXCEPTION(err, "Getting feature present failed.");
00487 return f_pres == DC1394_TRUE;
00488 }
00489
00490 bool Camera::isFeatureReadable(dc1394feature_t feat) {
00491 dc1394error_t err;
00492 dc1394bool_t f_read;
00493 err = dc1394_feature_is_readable(camera, feat, &f_read);
00494 CAMERA_EXCEPTION(err, "Getting feature readable failed.");
00495 return f_read == DC1394_TRUE;
00496 }
00497
00498 bool Camera::isFeatureSwitchable(dc1394feature_t feat) {
00499 dc1394error_t err;
00500 dc1394bool_t f_sw;
00501 err = dc1394_feature_is_switchable(camera, feat, &f_sw);
00502 CAMERA_EXCEPTION(err, "Getting feature switchable failed.");
00503 return f_sw == DC1394_TRUE;
00504 }
00505
00506 bool Camera::isFeaturePowerOn(dc1394feature_t feat) {
00507 dc1394error_t err;
00508 dc1394switch_t f_pwr;
00509 err = dc1394_feature_get_power(camera, feat, &f_pwr);
00510 CAMERA_EXCEPTION(err, "Getting feature power failed.");
00511 return f_pwr == DC1394_ON;
00512 }
00513
00514 dc1394feature_mode_t Camera::getFeatureMode(dc1394feature_t feat) {
00515 dc1394error_t err;
00516 dc1394feature_mode_t f_mode;
00517 err = dc1394_feature_get_mode(camera, feat, &f_mode);
00518 CAMERA_EXCEPTION(err, "Getting feature mode failed.");
00519 return f_mode;
00520 }
00521
00522 bool Camera::isFeatureAbsoluteControlAvailable(dc1394feature_t feat) {
00523 dc1394error_t err;
00524 dc1394bool_t f_avail;
00525 err = dc1394_feature_has_absolute_control(camera, feat, &f_avail);
00526 CAMERA_EXCEPTION(err, "Getting feature absolute control available failed.");
00527 return f_avail == DC1394_TRUE;
00528 }
00529
00530 bool Camera::isFeatureAbsoluteControlOn(dc1394feature_t feat) {
00531 dc1394error_t err;
00532 dc1394switch_t f_sw;
00533 err = dc1394_feature_get_absolute_control(camera, feat, &f_sw);
00534 CAMERA_EXCEPTION(err, "Getting feature absolute control failed.");
00535 return f_sw == DC1394_ON;
00536 }
00537
00538 uint32_t Camera::getFeatureMinBoundary(dc1394feature_t feat) {
00539 dc1394error_t err;
00540 uint32_t bound_min;
00541 uint32_t bound_max;
00542 err = dc1394_feature_get_boundaries(camera, feat, &bound_min, &bound_max);
00543 CAMERA_EXCEPTION(err, "Getting feature boundaries failed.");
00544 return bound_min;
00545 }
00546
00547 uint32_t Camera::getFeatureMaxBoundary(dc1394feature_t feat) {
00548 dc1394error_t err;
00549 uint32_t bound_min;
00550 uint32_t bound_max;
00551 err = dc1394_feature_get_boundaries(camera, feat, &bound_min, &bound_max);
00552 CAMERA_EXCEPTION(err, "Getting feature boundaries failed.");
00553 return bound_max;
00554 }
00555
00556 uint32_t Camera::getFeatureValue(dc1394feature_t feat) {
00557 dc1394error_t err;
00558 uint32_t val;
00559 err = dc1394_feature_get_value(camera, feat, &val);
00560 CAMERA_EXCEPTION(err, "Getting feature value failed.");
00561 return val;
00562 }
00563
00564 float Camera::getFeatureMinAbsoluteBoundary(dc1394feature_t feat) {
00565 dc1394error_t err;
00566 float bound_min;
00567 float bound_max;
00568 err = dc1394_feature_get_absolute_boundaries(camera, feat, &bound_min, &bound_max);
00569 CAMERA_EXCEPTION(err, "Getting feature absolute boundaries failed.");
00570 return bound_min;
00571 }
00572
00573 float Camera::getFeatureMaxAbsoluteBoundary(dc1394feature_t feat) {
00574 dc1394error_t err;
00575 float bound_min;
00576 float bound_max;
00577 err = dc1394_feature_get_absolute_boundaries(camera, feat, &bound_min, &bound_max);
00578 CAMERA_EXCEPTION(err, "Getting feature absolute boundaries failed.");
00579 return bound_max;
00580 }
00581
00582 float Camera::getFeatureAbsoluteValue(dc1394feature_t feat) {
00583 dc1394error_t err;
00584 float abs_val;
00585 err = dc1394_feature_get_absolute_value(camera, feat, &abs_val);
00586 CAMERA_EXCEPTION(err, "Getting feature absolute value failed.");
00587 return abs_val;
00588 }
00589
00590 void Camera::setFeaturePowerOn(dc1394feature_t feat) {
00591 dc1394error_t err;
00592 err = dc1394_feature_set_power(camera, feat, DC1394_ON);
00593 CAMERA_EXCEPTION(err, "Setting feature power on failed.");
00594 }
00595
00596 void Camera::setFeaturePowerOff(dc1394feature_t feat) {
00597 dc1394error_t err;
00598 err = dc1394_feature_set_power(camera, feat, DC1394_OFF);
00599 CAMERA_EXCEPTION(err, "Setting feature power failed.");
00600 }
00601
00602 void Camera::setFeaturetMode(dc1394feature_t feat, dc1394feature_mode_t mode) {
00603 dc1394error_t err;
00604 err = dc1394_feature_set_mode(camera, feat, mode);
00605 CAMERA_EXCEPTION(err, "Setting feature mode failed.");
00606 }
00607
00608 void Camera::setFeatureAbsoluteControlOn(dc1394feature_t feat) {
00609 dc1394error_t err;
00610 err = dc1394_feature_set_absolute_control(camera, feat, DC1394_ON);
00611 CAMERA_EXCEPTION(err, "Setting feature absolute control on failed.");
00612 }
00613
00614 void Camera::setFeatureAbsoluteControlOff(dc1394feature_t feat) {
00615 dc1394error_t err;
00616 err = dc1394_feature_set_absolute_control(camera, feat, DC1394_OFF);
00617 CAMERA_EXCEPTION(err, "Setting feature absolute control off failed.");
00618 }
00619
00620 void Camera::setFeatureValue(dc1394feature_t feat, uint32_t value) {
00621 dc1394error_t err;
00622 err = dc1394_feature_set_value(camera, feat, value);
00623 CAMERA_EXCEPTION(err, "Setting feature value failed.");
00624 }
00625
00626 void Camera::setFeatureAbsoluteValue(dc1394feature_t feat, float value) {
00627 dc1394error_t err;
00628 err = dc1394_feature_set_absolute_value(camera, feat, value);
00629 CAMERA_EXCEPTION(err, "Setting feature absolute value failed.");
00630 }
00631
00632 uint32_t Camera::getWhiteBalanceBlue() {
00633 uint32_t u_b_value;
00634 uint32_t v_r_value;
00635 dc1394error_t err;
00636 err = dc1394_feature_whitebalance_get_value(camera, &u_b_value, &v_r_value);
00637 CAMERA_EXCEPTION(err, "Getting camera whitebalance feature failed.");
00638 return u_b_value;
00639 }
00640
00641 uint32_t Camera::getWhiteBalanceRed() {
00642 uint32_t u_b_value;
00643 uint32_t v_r_value;
00644 dc1394error_t err;
00645 err = dc1394_feature_whitebalance_get_value(camera, &u_b_value, &v_r_value);
00646 CAMERA_EXCEPTION(err, "Getting camera whitebalance feature failed.");
00647 return v_r_value;
00648 }
00649
00650 void Camera::setWhiteBalance(uint32_t u_b_value, uint32_t v_r_value) {
00651 dc1394error_t err;
00652 err = dc1394_feature_whitebalance_set_value(camera, u_b_value, v_r_value);
00653 CAMERA_EXCEPTION(err, "Setting camera whitebalance feature failed.");
00654 }
00655
00656 void Camera::setWhiteBalanceBlue(uint32_t u_b_value) {
00657 dc1394error_t err;
00658 err = dc1394_feature_whitebalance_set_value(camera, u_b_value, getWhiteBalanceRed());
00659 CAMERA_EXCEPTION(err, "Setting camera whitebalance feature failed.");
00660 }
00661
00662 void Camera::setWhiteBalanceRed(uint32_t v_r_value) {
00663 dc1394error_t err;
00664 err = dc1394_feature_whitebalance_set_value(camera, getWhiteBalanceBlue(), v_r_value);
00665 CAMERA_EXCEPTION(err, "Setting camera whitebalance feature failed.");
00666 }
00667
00668 }
00669 }