Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/134.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何使用v4l2loopback将图像渲染到/dev/video0?_C++_Linux_V4l2_V4l2loopback - Fatal编程技术网

C++ 如何使用v4l2loopback将图像渲染到/dev/video0?

C++ 如何使用v4l2loopback将图像渲染到/dev/video0?,c++,linux,v4l2,v4l2loopback,C++,Linux,V4l2,V4l2loopback,我一直在尝试将图像渲染到/dev/video。我可以得到一些东西来显示,但有些混乱 我首先尝试渲染一个普通的RGB24图像(基于本例),但结果(如下)是一个置乱图像 #包括 #包括 #包括 #包括 #包括 #包括 #包括 #包括 #定义视频输出“/dev/video0”//V4L2环回 #定义宽度1280 #定义高度720 int main(){ 使用名称空间cimg_库; CImg帆布(宽度、高度、1、3); 常数8_t red[]={255,0,0}; 常数8_t purple[]={255

我一直在尝试将图像渲染到/dev/video。我可以得到一些东西来显示,但有些混乱

我首先尝试渲染一个普通的RGB24图像(基于本例),但结果(如下)是一个置乱图像

#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#定义视频输出“/dev/video0”//V4L2环回
#定义宽度1280
#定义高度720
int main(){
使用名称空间cimg_库;
CImg帆布(宽度、高度、1、3);
常数8_t red[]={255,0,0};
常数8_t purple[]={255,0255};
int-fd;
如果((fd=打开(视频输出,O_RDWR))=-1){

经过多次黑客攻击,我成功地生成了一个有效的YUYV视频/图像发送到/dev/video0

首先,我制作一个缓冲区来保存帧:

//为YUUV帧分配缓冲区
向量缓冲区;
调整缓冲区大小(vid_format.fmt.pix.sizeimage);
然后我以YUYV格式将当前画布写入缓冲区

bool skip=true;
cimg_forXY(帆布、cx、cy){
行大小=cy*宽度*2;
uint8_t r,g,b,y;
r=画布(cx,cy,0);
g=画布(cx,cy,1);
b=画布(cx,cy,2);
y=std::夹具(r*.299000+g*.587000+b*.114000,0255);
缓冲区[row+cx*2]=y;
如果(!跳过){
uint8_t u,v;
u=标准:夹具(r*-.168736+g*-.331264+b*.500000+128,0255);
v=标准:夹具(r*.500000+g*-.418688+b*-.081312+128,0255);
缓冲区[行+(cx-1)*2+1]=u;
缓冲区[行+(cx-1)*2+3]=v;
}
跳过=!跳过;
}
注: CImg的
RGBtoYUV
有一个就地RGB到YUV的转换,但出于某种原因,在uint8_t画布上调用它只会将其置零

它还有一个
get_YUVtoRGB
,它(分配并)返回一个
CImg
画布,我想你可以将每个值乘以255以缩放到一个字节,但是,无论我尝试了什么,都没有给出正确的颜色。编辑:我可能忘记了+128偏差(尽管我仍然不喜欢为每个帧重新分配)


我的完整代码在这里(如果有人想做类似的事情)

我认为/dev/vieo0只是Linux中的一个虚拟设备节点。您附加了什么?我不太清楚这意味着什么,但我正在尝试生成一个虚拟网络摄像头,skype之类的应用程序可以接收。我没有看过您的代码,但有一个示例应用程序可以将图像写入v4l2loopback设备。(图像在UYVY颜色空间中为640x480像素)它并没有真正显示如何写入rgb图像示例(test.c)只是写入零(对于空白绿色图像)。是否有更高级别的库为我处理所有转换?允许我将其视为正常rgb图像?如果这解决了您(自己的)的问题问题,请接受答案,这样问题就不再显示为“需要注意”。对不起,stackoverflow一开始没有让我这么做,然后我就忘了,
v4l2-ctl --list-formats-ext                                                                                                                                                                              130 ↵

ioctl: VIDIOC_ENUM_FMT
    Type: Video Capture

    [0]: 'YU12' (Planar YUV 4:2:0)
        Size: Discrete 1280x720
            Interval: Discrete 0.033s (30.000 fps)
    vid_format.fmt.pix.width       = width;
    vid_format.fmt.pix.height      = height;
    vid_format.fmt.pix.pixelformat = V4L2_PIX_FMT_YUV420;
    vid_format.fmt.pix.sizeimage   = width*height*3/2; // size of yuv buffer
    vid_format.fmt.pix.field       = V4L2_FIELD_NONE;