首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >通过C/C++设置/获取jpeg像素格式的v4l2格式的相机JPEG压缩质量

通过C/C++设置/获取jpeg像素格式的v4l2格式的相机JPEG压缩质量
EN

Stack Overflow用户
提问于 2016-03-11 21:06:52
回答 3查看 3.2K关注 0票数 3

您能展示一下如何通过C++在V4L2中获取和设置JPEG压缩质量(具有JPEG像素格式)吗?

我可以检测到摄像头支持的各种像素格式以及相应的分辨率和帧率。我也可以选择它们并相应地捕获JPEG图像。然而,我在设置和获取jpeg质量时失败。

我使用的是Linux Mint和罗技c910相机。

相机似乎暴露了这个参数,因为

代码语言:javascript
运行
复制
v4l2-ctl --all

产生

代码语言:javascript
运行
复制
JPEG Compression Controls

        compression_quality (int)    : min=50 max=87 step=1 default=75 value=75
 [...]

但是,代码

代码语言:javascript
运行
复制
#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/ioctl.h>
#include <linux/videodev2.h>
#include <iostream>
using namespace std;

int main()
{
    int fd = open("/dev/video0", O_RDWR);
    if (fd == -1) 
    {   
        perror("open: "); return 1; 
    }

    {   
        // first option
        v4l2_jpegcompression ctrl={0};
        if(ioctl(fd, VIDIOC_G_JPEGCOMP, &ctrl)<0)
        {
            perror("VIDIOC_G_JPEGCOMP:");
        }
        else
        {
            cout<<"QUALITY:"<<ctrl.quality<<endl; 
        }
    }

    {   
        // second option
        v4l2_ext_control extCtrl={0};
        extCtrl.id = V4L2_CID_JPEG_COMPRESSION_QUALITY;
        extCtrl.size = 0;
        extCtrl.value = 100;

        v4l2_ext_controls extCtrls={0};
        extCtrls.controls = &extCtrl;
        extCtrls.count = 1;
        extCtrls.ctrl_class = V4L2_CTRL_CLASS_JPEG;

        if(ioctl(fd, VIDIOC_G_EXT_CTRLS, &extCtrls)<0)
        { 
             perror("VIDIOC_G_EXT_CTRLS:");
        }
    }

    {   
        // third option
        v4l2_ext_control extCtrl={0};
        extCtrl.id = V4L2_CID_JPEG_COMPRESSION_QUALITY;
        extCtrl.size = 0;
        extCtrl.value = 100;

        v4l2_ext_controls extCtrls={0};
        extCtrls.controls = &extCtrl;
        extCtrls.count = 1;
        extCtrls.ctrl_class = V4L2_CID_JPEG_CLASS;

        if(ioctl(fd, VIDIOC_G_EXT_CTRLS, &extCtrls)<0)
        { 
            perror("VIDIOC_G_EXT_CTRLS V4L2_CID_JPEG_CLASS:");
        }
    }

    close(fd);
    return 0;
}

可以通过以下方式编译

代码语言:javascript
运行
复制
g++ query.cpp -o query.out

产生:

代码语言:javascript
运行
复制
VIDIOC_G_JPEGCOMP:: Inappropriate ioctl for device
VIDIOC_G_EXT_CTRLS:: Invalid argument
VIDIOC_G_EXT_CTRLS V4L2_CID_JPEG_CLASS:: Invalid argument
EN

回答 3

Stack Overflow用户

发布于 2017-01-25 19:40:34

代码语言:javascript
运行
复制
void check_controls(int fd) {

    struct v4l2_queryctrl qctrl;

    memset(&qctrl, 0, sizeof(qctrl));

    qctrl.id = V4L2_CTRL_FLAG_NEXT_CTRL;
    while (0 == ioctl (fd, VIDIOC_QUERYCTRL, &qctrl)) {

        printf("ID = %08x\n", qctrl.id);
        /* ... */
        qctrl.id |= V4L2_CTRL_FLAG_NEXT_CTRL;
    }
}
票数 0
EN

Stack Overflow用户

发布于 2017-01-26 01:56:40

这将以十六进制打印映射控件的列表,如v4l2-controls.h所示

未映射V4L2_CID_JPEG_COMPRESSION_QUALITY

您可以将其映射到

https://www.kernel.org/doc/html/latest/media/v4l-drivers/uvcvideo.html

29.1.5。IOCTL参考29.1.5.1。UVC -将UVCIOC_CTRL_MAP控件映射到V4L2控件

票数 0
EN

Stack Overflow用户

发布于 2017-01-27 04:05:08

您可以使用lsusb -v查看摄像头支持哪些参数。ioctl VIDIOC_G_JPEGCOMP或VIDIOC_G_JPEGCOMP未出现在v4l2驱动程序中。我认为它们没有被使用,因为摄像头不支持它们。大多数摄像机自动控制质量以提供目标比特率的MJPEG流。它们似乎不支持在MJPEG中更改QP或比特率。例如,我认为这个想法是摄像机提供高比特率,然后使用FMPEG二次编码为H264。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35941053

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档