Huayingyewu 2024-04-26 01:33 采纳率: 0%
浏览 4

粤嵌实训,不能二次进入摄像头

为什么我第一次能进入摄像头,退出到界面后,不能第二次进入摄像头,错误显示如下面所示。

img

img

img

  • 写回答

6条回答 默认 最新

  • 专家-赤兔[在线] 全栈领域优质创作者 2024-04-26 01:33
    关注

    引自免费微信小程序:皆我百晓生

    从提供的信息来看,你在使用Linux V4L2 API(Video for Linux version 2)操作摄像头时遇到了问题。错误提示表明在设置视频格式、请求缓冲区、查询缓冲区以及映射内存时出现了失败。这些错误通常意味着在尝试与硬件交互时存在问题。

    首先,让我们逐个检查可能的问题点:

    1. 初始化摄像头失败:确保设备路径正确,即"/dev/video7"确实是摄像头的正确设备节点。可以使用ls /dev/video*命令查看所有可用的摄像头设备。

    2. 分配缓冲区失败:这可能是由于内存不足或分配缓冲区的方法不正确导致的。检查系统的内存状况,并确认代码中用于申请和管理缓冲区的部分是否正确执行了必要的步骤。

    3. 映射内存失败:这可能是因为内核没有足够的权限去映射物理内存到用户空间。确保程序有适当的权限运行,并且使用的映射函数正确无误。

    为了修复这些问题,你需要检查并优化以下几个部分:

    1. 初始化摄像头时,添加错误处理,确保初始化成功。
    2. 在请求缓冲区和查询缓冲区时,同样添加错误处理,确保正确的执行流程。
    3. 使用正确的映射函数,并处理可能出现的异常情况。

    这里是一个简化版的修改后的代码示例,主要针对错误处理进行改进:

    #include <stdio.h>
    #include <stdlib.h>
    #include <fcntl.h>
    #include <sys/mman.h>
    #include <unistd.h>
    #include <linux/videodev2.h>
    
    #define MAX_BUF 2
    #define BUF_SIZE (1920 * 1080 * 2) // YUYV格式,每像素两个字节
    
    void init_camera(int fd) {
        struct v4l2_format fmt;
        fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
        fmt.fmt.pix.width = 1920;
        fmt.fmt.pix.height = 1080;
        fmt.fmt.pix.pixelformat = V4L2_PIX_FMT_YUYV;
        fmt.fmt.pix.field = V4L2_FIELD_NONE;
    
        if ( ioctl(fd, VIDIOC_S_FMT, &fmt) == -1 ) {
            perror("VIDIOC_S_FMT");
            exit(EXIT_FAILURE);
        }
    }
    
    void request_buffers(int fd) {
        struct v4l2_requestbuffers req;
        req.count = MAX_BUF;
        req.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
        req.memory = V4L2_MEMORY_MMAP;
    
        if ( ioctl(fd, VIDIOC_REQBUFS, &req) == -1 ) {
            perror("VIDIOC_REQBUFS");
            exit(EXIT_FAILURE);
        }
    
        int i;
        for (i = 0; i < req.count; ++i) {
            struct v4l2_buffer buf;
            buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
            buf.memory = V4L2_MEMORY_MMAP;
            buf.index = i;
    
            if ( ioctl(fd, VIDIOC_QUERYBUF, &buf) == -1 ) {
                perror("VIDIOC_QUERYBUF");
                exit(EXIT_FAILURE);
            }
    
            void *data = mmap(NULL, buf.length, PROT_READ | PROT_WRITE, MAP_SHARED, fd, buf.m.offset);
    
            if ( data == MAP_FAILED ) {
                perror("mmap");
                exit(EXIT_FAILURE);
            }
    
            if ( ioctl(fd, VIDIOC_QBUF, &buf) == -1 ) {
                perror("VIDIOC_QBUF");
                munmap(data, buf.length);
                exit(EXIT_FAILURE);
            }
        }
    }
    
    int main() {
        int camera_fd = open("/dev/video7", O_RDWR | O_NONBLOCK);
        if (camera_fd == -1) {
            perror("open");
            return EXIT_FAILURE;
        }
    
        init_camera(camera_fd);
        request_buffers(camera_fd);
    
        // ...其他摄像头相关操作...
    
        close(camera_fd);
        return 0;
    }
    

    这个简化版本仅包含了基本的错误处理和初始化过程。请确保你的项目中包含相应的头文件,并根据实际情况调整分辨率和其他参数。同时,记得在实际应用中处理多线程同步问题,因为你的原始代码中涉及到多线程。

    如果你仍然遇到问题,请提供更详细的调试信息,包括错误消息和完整的程序代码,以便我能进一步分析和提出解决方案。

    评论 编辑记录

报告相同问题?

问题事件

  • 创建了问题 4月26日

悬赏问题

  • ¥15 matlab 用yalmip搭建模型,cplex求解,线性化处理的方法
  • ¥15 qt6.6.3 基于百度云的语音识别 不会改
  • ¥15 关于#目标检测#的问题:大概就是类似后台自动检测某下架商品的库存,在他监测到该商品上架并且可以购买的瞬间点击立即购买下单
  • ¥15 神经网络怎么把隐含层变量融合到损失函数中?
  • ¥15 lingo18勾选global solver求解使用的算法
  • ¥15 全部备份安卓app数据包括密码,可以复制到另一手机上运行
  • ¥20 测距传感器数据手册i2c
  • ¥15 RPA正常跑,cmd输入cookies跑不出来
  • ¥15 求帮我调试一下freefem代码
  • ¥15 matlab代码解决,怎么运行