forked from logzhan/UPBot-Pioneer
154 lines
4.2 KiB
C
154 lines
4.2 KiB
C
|
/*********************************************************************
|
||
|
* Software License Agreement (BSD License)
|
||
|
*
|
||
|
* Copyright (C) 2010-2012 Ken Tossell
|
||
|
* All rights reserved.
|
||
|
*
|
||
|
* Redistribution and use in source and binary forms, with or without
|
||
|
* modification, are permitted provided that the following conditions
|
||
|
* are met:
|
||
|
*
|
||
|
* * Redistributions of source code must retain the above copyright
|
||
|
* notice, this list of conditions and the following disclaimer.
|
||
|
* * Redistributions 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.
|
||
|
* * Neither the name of the author nor other contributors may 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
|
||
|
* COPYRIGHT OWNER 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.
|
||
|
*********************************************************************/
|
||
|
#include <stdio.h>
|
||
|
#include <opencv2/highgui/highgui_c.h>
|
||
|
|
||
|
#include "libuvc/libuvc.h"
|
||
|
|
||
|
void cb(uvc_frame_t *frame, void *ptr) {
|
||
|
uvc_frame_t *bgr;
|
||
|
uvc_error_t ret;
|
||
|
IplImage* cvImg;
|
||
|
|
||
|
printf("callback! length = %u, ptr = %d\n", frame->data_bytes, (int) ptr);
|
||
|
|
||
|
bgr = uvc_allocate_frame(frame->width * frame->height * 3);
|
||
|
if (!bgr) {
|
||
|
printf("unable to allocate bgr frame!");
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
ret = uvc_any2bgr(frame, bgr);
|
||
|
if (ret) {
|
||
|
uvc_perror(ret, "uvc_any2bgr");
|
||
|
uvc_free_frame(bgr);
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
cvImg = cvCreateImageHeader(
|
||
|
cvSize(bgr->width, bgr->height),
|
||
|
IPL_DEPTH_8U,
|
||
|
3);
|
||
|
|
||
|
cvSetData(cvImg, bgr->data, bgr->width * 3);
|
||
|
|
||
|
cvNamedWindow("Test", CV_WINDOW_AUTOSIZE);
|
||
|
cvShowImage("Test", cvImg);
|
||
|
cvWaitKey(10);
|
||
|
|
||
|
cvReleaseImageHeader(&cvImg);
|
||
|
|
||
|
uvc_free_frame(bgr);
|
||
|
}
|
||
|
|
||
|
int main(int argc, char **argv) {
|
||
|
uvc_context_t *ctx;
|
||
|
uvc_error_t res;
|
||
|
uvc_device_t *dev;
|
||
|
uvc_device_handle_t *devh;
|
||
|
uvc_stream_ctrl_t ctrl;
|
||
|
|
||
|
res = uvc_init(&ctx, NULL);
|
||
|
|
||
|
if (res < 0) {
|
||
|
uvc_perror(res, "uvc_init");
|
||
|
return res;
|
||
|
}
|
||
|
|
||
|
puts("UVC initialized");
|
||
|
|
||
|
res = uvc_find_device(
|
||
|
ctx, &dev,
|
||
|
0, 0, NULL);
|
||
|
|
||
|
if (res < 0) {
|
||
|
uvc_perror(res, "uvc_find_device");
|
||
|
} else {
|
||
|
puts("Device found");
|
||
|
|
||
|
res = uvc_open(dev, &devh);
|
||
|
|
||
|
if (res < 0) {
|
||
|
uvc_perror(res, "uvc_open");
|
||
|
} else {
|
||
|
puts("Device opened");
|
||
|
|
||
|
uvc_print_diag(devh, stderr);
|
||
|
|
||
|
res = uvc_get_stream_ctrl_format_size(
|
||
|
devh, &ctrl, UVC_FRAME_FORMAT_YUYV, 640, 480, 30
|
||
|
);
|
||
|
|
||
|
uvc_print_stream_ctrl(&ctrl, stderr);
|
||
|
|
||
|
if (res < 0) {
|
||
|
uvc_perror(res, "get_mode");
|
||
|
} else {
|
||
|
res = uvc_start_streaming(devh, &ctrl, cb, 12345, 0);
|
||
|
|
||
|
if (res < 0) {
|
||
|
uvc_perror(res, "start_streaming");
|
||
|
} else {
|
||
|
puts("Streaming for 10 seconds...");
|
||
|
uvc_error_t resAEMODE = uvc_set_ae_mode(devh, 1);
|
||
|
uvc_perror(resAEMODE, "set_ae_mode");
|
||
|
int i;
|
||
|
for (i = 1; i <= 10; i++) {
|
||
|
/* uvc_error_t resPT = uvc_set_pantilt_abs(devh, i * 20 * 3600, 0); */
|
||
|
/* uvc_perror(resPT, "set_pt_abs"); */
|
||
|
uvc_error_t resEXP = uvc_set_exposure_abs(devh, 20 + i * 5);
|
||
|
uvc_perror(resEXP, "set_exp_abs");
|
||
|
|
||
|
sleep(1);
|
||
|
}
|
||
|
sleep(10);
|
||
|
uvc_stop_streaming(devh);
|
||
|
puts("Done streaming.");
|
||
|
}
|
||
|
}
|
||
|
|
||
|
uvc_close(devh);
|
||
|
puts("Device closed");
|
||
|
}
|
||
|
|
||
|
uvc_unref_device(dev);
|
||
|
}
|
||
|
|
||
|
uvc_exit(ctx);
|
||
|
puts("UVC exited");
|
||
|
|
||
|
return 0;
|
||
|
}
|
||
|
|