通过libusb库和opencv获取usb摄像头图像

#include "libuvc/libuvc.h"
#include "opencv2/opencv.hpp"
#include "opencv2/highgui.hpp"
#include "opencv2/core.hpp"
#include <stdio.h>
#include <unistd.h>

using namespace cv;

/* This callback function runs once per frame. Use it to perform any
 * quick processing you need, or have it put the frame into your application's
 * input queue. If this function takes too long, you'll start losing frames. */
void cb(uvc_frame_t *frame, void *ptr)
{
    uvc_frame_t *bgr;
    uvc_error_t ret;
    enum uvc_frame_format *frame_format = (enum uvc_frame_format *)ptr;
    /* FILE *fp;
   * static int jpeg_count = 0;
   * static const char *H264_FILE = "iOSDevLog.h264";
   * static const char *MJPEG_FILE = ".jpeg";
   * char filename[16]; */

    /* We'll convert the image from YUV/JPEG to BGR, so allocate space */
    bgr = uvc_allocate_frame(frame->width * frame->height * 3);
    if (!bgr)
    {
        printf("unable to allocate bgr frame!\n");
        return;
    }

    switch (frame->frame_format)
    {
    case UVC_FRAME_FORMAT_H264:
        /* use `ffplay H264_FILE` to play */
        /* fp = fopen(H264_FILE, "a");
     * fwrite(frame->data, 1, frame->data_bytes, fp);
     * fclose(fp); */
        break;
    case UVC_COLOR_FORMAT_MJPEG:
        /* sprintf(filename, "%d%s", jpeg_count++, MJPEG_FILE);
     * fp = fopen(filename, "w");
     * fwrite(frame->data, 1, frame->data_bytes, fp);
     * fclose(fp); */
        break;
    case UVC_COLOR_FORMAT_YUYV:
        /* Do the BGR conversion */
        ret = uvc_any2bgr(frame, bgr);
        if (ret)
        {
            uvc_perror(ret, "uvc_any2bgr");
            uvc_free_frame(bgr);
            return;
        }
        break;
    default:
        break;
    }

    //   cvSetData(cvImg, bgr->data, bgr->width * 3);
    const std::vector<int> sz = {(int)bgr->height, (int)bgr->width};
    printf("Width: %d, Height: %d\n", bgr->width, bgr->height);
    cv::Mat img = cv::Mat(sz, CV_8UC3, bgr->data);

    if (!img.empty())
    {
        cv::namedWindow("Image", WINDOW_NORMAL);
        cv::imshow("Image", img);
        cv::waitKey(20);
    }

    uvc_free_frame(bgr);
}

int main(int argc, char **argv)
{
    uvc_context_t *ctx;
    uvc_device_t *dev;
    uvc_device_handle_t *devh;
    uvc_stream_ctrl_t ctrl;
    uvc_error_t res;

    /* Initialize a UVC service context. Libuvc will set up its own libusb
   * context. Replace NULL with a libusb_context pointer to run libuvc
   * from an existing libusb context. */
    res = uvc_init(&ctx, NULL);

    if (res < 0)
    {
        uvc_perror(res, "uvc_init");
        return res;
    }

    puts("UVC initialized");

    /* Locates the first attached UVC device, stores in dev */
    res = uvc_find_device(
        ctx, &dev,
        0, 0, NULL); /* filter devices: vendor_id, product_id, "serial_num" */

    if (res < 0)
    {
        uvc_perror(res, "uvc_find_device"); /* no devices found */
    }
    else
    {
        puts("Device found");

        /* Try to open the device: requires exclusive access */
        res = uvc_open(dev, &devh);

        if (res < 0)
        {
            uvc_perror(res, "uvc_open"); /* unable to open device */
        }
        else
        {
            puts("Device opened");

            /* Print out a message containing all the information that libuvc
       * knows about the device */
            uvc_print_diag(devh, stderr);

            const uvc_format_desc_t *format_desc = uvc_get_format_descs(devh);
            const uvc_frame_desc_t *frame_desc = format_desc->frame_descs;
            enum uvc_frame_format frame_format;
            int width = 640;
            int height = 481;
            int fps = 30;

            switch (format_desc->bDescriptorSubtype)
            {
            case UVC_VS_FORMAT_MJPEG:
                frame_format = UVC_COLOR_FORMAT_MJPEG;
                break;
            case UVC_VS_FORMAT_FRAME_BASED:
                frame_format = UVC_FRAME_FORMAT_H264;
                break;
            default:
                frame_format = UVC_FRAME_FORMAT_YUYV;
                break;
            }

            if (frame_desc)
            {
                width = frame_desc->wWidth;
                height = frame_desc->wHeight;
                fps = 10000000 / frame_desc->dwDefaultFrameInterval;
            }

            printf("\nFirst format: (%4s) %dx%d %dfps\n", format_desc->fourccFormat, width, height, fps);

            /* Try to negotiate first stream profile */
            res = uvc_get_stream_ctrl_format_size(
                devh, &ctrl, /* result stored in ctrl */
                frame_format,
                width, height, fps /* width, height, fps */
            );

            /* Print out the result */
            uvc_print_stream_ctrl(&ctrl, stderr);

            if (res < 0)
            {
                uvc_perror(res, "get_mode"); /* device doesn't provide a matching stream */
            }
            else
            {
                /* Start the video stream. The library will call user function cb:
         *   cb(frame, (void *) 12345)
         */
                res = uvc_start_streaming(devh, &ctrl, cb, (void *)12345, 0);

                if (res < 0)
                {
                    uvc_perror(res, "start_streaming"); /* unable to start stream */
                }
                else
                {
                    puts("Streaming...");

                    uvc_set_ae_mode(devh, 1); /* e.g., turn on auto exposure */

                    sleep(10); /* stream for 10 seconds */

                    /* End the stream. Blocks until last callback is serviced */
                    uvc_stop_streaming(devh);
                    puts("Done streaming.");
                }
            }

            /* Release our handle on the device */
            uvc_close(devh);
            puts("Device closed");
        }

        /* Release the device descriptor */
        uvc_unref_device(dev);
    }

    /* Close the UVC context. This closes and cleans up any existing device handles,
   * and it closes the libusb context if one was not provided. */
    uvc_exit(ctx);
    puts("UVC exited");

    return 0;
}

U2FsdGVkX18SWAtQNMMlQTotC7JkXa1FPem9MMtQmHpC6GU34Fr8wphWiqv60h9z
HQIQehvpkFxuD4yPXbtQ5Wi8uPNwH8k9iOMtY/ae2Bw=

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Windows系统上使用libusb获取USB摄像头视频需要进行以下步骤: 1. 安装libusb驱动:首先需要下载并安装libusb驱动程序,可以从libusb官方网站上找到适合自己Windows系统版本的驱动程序,并按照安装指南进行安装。 2. 连接USB摄像头:将USB摄像头连接到计算机的USB接口上,并等待系统自动安装摄像头驱动程序。确保摄像头能够正常运行。 3. 建立libusb连接:使用libusb中提供的函数,建立与USB摄像头连接。首先需要初始化libusb,并检测系统中的USB设备,找到对应的摄像头设备。 4. 打开摄像头设备:使用libusb提供的函数,打开USB摄像头设备。这将返回一个表示设备的句柄,用于后续操作。 5. 设置摄像头参数:使用libusb函数设置摄像头的工作参数,如分辨率、帧率等。 6. 开始视频流读取:通过调用libusb函数,开始从摄像头视频流中读取数据。可以使用循环不断读取视频帧数据,并进行处理或显示。 7. 结束视频流读取:当不再需要读取视频流数据时,调用相应的libusb函数结束视频流读取。 8. 关闭摄像头设备:通过调用libusb函数,关闭USB摄像头设备。 9. 断开libusb连接:使用libusb提供的函数,断开与USB摄像头连接。 10. 释放libusb资源:在程序结束之前,调用libusb函数释放初始化时分配的资源,确保内存的正确释放。 通过以上步骤,我们可以使用libusb在Windows系统上获取USB摄像头的视频数据,并进行处理、显示等操作。关于具体的函数调用和参数设置,可以参考libusb的官方文档或相关的示例代码。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值