opencv获取外接摄像头_利用opencv从USB摄像头获取图片

由于opencv自带的VideoCapture函数直接从usb摄像头获取视频数据,所以用这个来作为实时的图像来源用于实体检测识别是很方便的。

1. 安装opencv

安装的步骤可以按照之前这个文章操作。如果在测试的时候:

cam = cv2.VideoCapture(0)

print cam.isOpend()

返回了False,很有可能是在安装的时候cmake的配置没有设置后,可以make uninstall之后重新cmake。

2. 安装usb摄像头驱动(这个一般都不需要)

如果系统没有预装usb摄像头的驱动,那么根据所用的摄像头安装相应的驱动即可。安装完之后可以用lsusb或者v4l2-ctl --list-device命令查看当前链接的usb设备来确认。这里我们使用的摄像头是罗技c930e。

3. 设置摄像头参数

设置可以在脚本中用opencv或者在命令行用v4l2-ctl命令设置:

1). opencv

"""

0. CV_CAP_PROP_POS_MSEC Current position of the video file in milliseconds.

1. CV_CAP_PROP_POS_FRAMES 0-based index of the frame to be decoded/captured next.

3. CV_CAP_PROP_POS_AVI_RATIO Relative position of the video file

4. CV_CAP_PROP_FRAME_WIDTH Width of the frames in the video stream.

5. CV_CAP_PROP_FRAME_HEIGHT Height of the frames in the

  • 1
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,可以参考以下代码: ```c #include <opencv2/opencv.hpp> #include <iostream> #include <linux/videodev2.h> #include <fcntl.h> #include <unistd.h> #include <sys/ioctl.h> #include <sys/mman.h> using namespace std; using namespace cv; int main(int argc, char* argv[]) { const char* dev_name = "/dev/video0"; int fd = open(dev_name, O_RDWR | O_NONBLOCK, 0); if (fd < 0) { perror("open"); exit(1); } struct v4l2_capability cap; if (ioctl(fd, VIDIOC_QUERYCAP, &cap) < 0) { perror("VIDIOC_QUERYCAP"); exit(1); } cout << "Driver Name: " << cap.driver << endl; cout << "Card Name: " << cap.card << endl; cout << "Bus info: " << cap.bus_info << endl; cout << "Version: " << (cap.version >> 16) << "." << ((cap.version >> 8) & 0xff) << "." << (cap.version & 0xff) << endl; struct v4l2_format fmt; memset(&fmt, 0, sizeof(fmt)); fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE; fmt.fmt.pix.width = 640; fmt.fmt.pix.height = 480; fmt.fmt.pix.pixelformat = V4L2_PIX_FMT_MJPEG; fmt.fmt.pix.field = V4L2_FIELD_INTERLACED; if (ioctl(fd, VIDIOC_S_FMT, &fmt) < 0) { perror("VIDIOC_S_FMT"); exit(1); } struct v4l2_requestbuffers req; memset(&req, 0, sizeof(req)); req.count = 1; req.type = V4L2_BUF_TYPE_VIDEO_CAPTURE; req.memory = V4L2_MEMORY_MMAP; if (ioctl(fd, VIDIOC_REQBUFS, &req) < 0) { perror("VIDIOC_REQBUFS"); exit(1); } struct v4l2_buffer buf; memset(&buf, 0, sizeof(buf)); buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE; buf.memory = V4L2_MEMORY_MMAP; buf.index = 0; if (ioctl(fd, VIDIOC_QUERYBUF, &buf) < 0) { perror("VIDIOC_QUERYBUF"); exit(1); } void* buffer = mmap(NULL, buf.length, PROT_READ | PROT_WRITE, MAP_SHARED, fd, buf.m.offset); if (buffer == MAP_FAILED) { perror("mmap"); exit(1); } memset(buffer, 0, buf.length); if (ioctl(fd, VIDIOC_QBUF, &buf) < 0) { perror("VIDIOC_QBUF"); exit(1); } if (ioctl(fd, VIDIOC_STREAMON, &buf.type) < 0) { perror("VIDIOC_STREAMON"); exit(1); } Mat frame; for (int i = 0; i < 100; i++) { fd_set fds; FD_ZERO(&fds); FD_SET(fd, &fds); struct timeval tv = {0}; tv.tv_sec = 2; tv.tv_usec = 0; int r = select(fd+1, &fds, NULL, NULL, &tv); if (r == -1) { perror("select"); exit(1); } if (r == 0) { fprintf(stderr, "select timeout\n"); exit(1); } if (ioctl(fd, VIDIOC_DQBUF, &buf) < 0) { perror("VIDIOC_DQBUF"); exit(1); } frame = Mat(Size(fmt.fmt.pix.width, fmt.fmt.pix.height), CV_8UC3, (char*)buffer); if (ioctl(fd, VIDIOC_QBUF, &buf) < 0) { perror("VIDIOC_QBUF"); exit(1); } imshow("Frame", frame); waitKey(1); } if (ioctl(fd, VIDIOC_STREAMOFF, &buf.type) < 0) { perror("VIDIOC_STREAMOFF"); exit(1); } close(fd); return 0; } ``` 这段代码是一个简单的基于v4l2的获取USB摄像头图像的C程序,其中使用了OpenCV库来显示图像。需要注意的是,这段代码只是一个基础示例,读者可以根据自己的需求进行修改和扩展。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值