/********************************************************************* * 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 #include #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; }