nvidia tx2平台 Allied vision Alvium相机调试2

free-jdx 2021-08-04 11:20:41 4650

1.前言
2.修改代码
3.尝试使用gstreamer后端
4.灰度采集问题
5.分析格式设置问题
6.解决问题
1. 前言

承接上篇
https://www.ebaina.com/articles/140000012925

2. 修改代码

也许是capture没能打开
试一试:

cv::VideoCapture cap(0, cv2.CAP_V4L);
if (!cap.isOpened()) {
     std::cout << "Failed to open camera\n";
     exit(-1);
}

unsigned int width = (unsigned int) cap.get (cv::CAP_PROP_FRAME_WIDTH);
unsigned int height = (unsigned int) cap.get (cv::CAP_PROP_FRAME_HEIGHT);
double fps = cap.get (cv::CAP_PROP_FPS);
std::cout << "Framing: " << width << " x " << height << " @" << fps << " FPS (" << width*height*fps/1000000.f << " MPixels/s)" <<std::endl;

cv::Mat frame_in;
if (!cap.read (frame_in)) {
   std::cout << "Failed to read frame from capture" << std::endl;
   cap.release();
   exit(-3);
}

std::cout << "Got frame with width=" << frame_in.cols << " and height=" << frame_in.rows << std::endl;

/* You can access V4L API for reading/setting controls that are not available from videocapture */
FILE* fp = popen("/usr/bin/v4l2-ctl -d0 --get-ctrl=gain", "r");
if (fp == NULL) {
  std::cout << "Failed to run v4l2-ctl command\n";
  exit(-2);
}
char buf[128];
if (fgets(buf, sizeof(buf), fp))
    printf("%s", buf);
pclose(fp);

...
cap.release();

当运行此代码,得到的输出

Framing: 700 x 544 @30 FPS (11.424 MPixels/s)
Failed to read frame from capture

由于某些原因,不能复制帧从视频捕捉到Mat。
当运行Gstreamer时,这是有效的,不是V4L2

当运行

gst-launch-1.0 v4l2src ! video/x-raw,format=xRGB ! videoconvert ! xvimagesink sync=false

在终端中,能够看到帧

3 .尝试使用gstreamer后端
cv::VideoCapture cap("v4l2src device=/dev/video0 
! video/x-raw,format=BGRx ! videoconvert ! video/x-raw,format=BGR 
! appsink drop=1", cv::CAP_GSTREAMER);

可以正常工作

为了改变相机设置,还需要使用这个吗?
可以访问V4L API来读取/设置视频捕获中不可用的控件

FILE fp = popen("/usr/bin/v4l2-ctl -d0 --get-ctrl=gain", “r”);*
if (fp == NULL) {
std::cout << “Failed to run v4l2-ctl command\n”;
exit(-2);
}
char buf[128];
if (fgets(buf, sizeof(buf), fp))
printf("%s", buf);
pclose(fp);

现在不能使用cap.get()或cap.set()
得到一个GSTREAMER错误
GStreamer warning: GStreamer: unhandled property

如果需要设置曝光时间,使用FILE *fp的语法会是什么样子?
另外,在流水线中,可以在灰度捕获帧吗?
这台相机可以用灰度来捕捉
所以不转换到RBG,我可以只在灰度传输数据吗?

4. 灰度采集问题

如果gstreamer管道正在使用摄像头
那么尝试从V4L API更改它将是一个糟糕的主意

可以运行给定数量的帧,从中计算新的曝光或增益,
从V4L API应用并重新运行gstreamer管道
这可能会给一些延迟之间的试验,因为管道设置
也可以像以前一样尝试使用V4L API。

可以在打开相机前尝试设置格式BGRx (V4L中的XR24)

v4l2-ctl -d /dev/video0 
--set-fmt-video=width=720,height=544,pixelformat=XR24

重新运行opencv应用程序打开摄像头:

cv:VideoCapture cap(0, cv::CAP_V4L);

当尝试运行v4l2-ctl命令时,得到了这个错误

VIDIOC_S_FMT: failed: Invalid argument

有没有办法在IDE中设置这些?

5. 分析格式设置问题
v4l2src device=/dev/video0 ! video/x-raw,format=BGRx 
! videoconvert ! video/x-raw,format=BGR ! appsink drop=1

设法通过将pixelformat更改为相应的数值来绕过VIDIOC_S_FMT问题
但是使用cv::CAP_V4L再次导致无法将视频捕获传输到Mat的问题

在使用Gstreamer时,有没有办法改变相机设置?
有没有一种方法可以在不使用视频捕捉的情况下访问相机框架?
有没有一种方法可以Mat.read(相机,IMREAD_GRAYSCALE)?
这将是最理想的

对于gstreamer管道到gray8类似于:

cv::VideoCapture cap("v4l2src device=/dev/video0 
! video/x-raw,format=GRAY8 
! appsink drop=1", cv::CAP_GSTREAMER);

运行此命令后,可以尝试从v4l2-ctl获取V4L格式,
并将其设置为从opencv进一步使用V4L后端

这是我用的代码

FILE* fp = popen("/usr/bin/v4l2-ctl -d /dev/video0 --set-fmt-video=width=500,height=544,pixelformat=1", “r”);
if (fp == NULL) {
std::cout << “Failed to run v4l2-ctl command\n”;
exit(-2);
}
char buf[128];
if (fgets(buf, sizeof(buf), fp))
printf("%s", buf);
pclose(fp);

 std::string pipeline = "v4l2src device=/dev/video0 ! video/x-raw,format=BGRx ! videoconvert ! video/x-raw,format=GRAY8 ! appsink drop=1";
cv::VideoCapture cap(pipeline,cv::CAP_GSTREAMER);

if (!cap.isOpened()) {
     std::cout << "Failed to open camera\n";
     exit(-1);
}

cv::Mat frame_in;

    if (!cap.read(frame_in)) {
       std::cout << "Failed to read frame from capture" << std::endl;
       cap.release();
       exit(-3);
}

    cv::imshow("frame",frame_in);
    cv::waitKey();

std::cout << "Got frame with width=" << frame_in.cols << " and height=" << frame_i

输出总是得到帧的宽度=704和高度=544。
不反映宽度和高度我设置在v2l2-ctl

6. 解决问题

从V4L API中设置v42-ctl——list-format -ext所提供的模式来进行捕获。
只有一些驱动可能支持缩放
在大多数情况下一个传感器模式支持帧长宽比

可以使用opencv或gstreamer缩放或裁剪到500x544分辨率

运行正常

声明:本文内容由易百纳平台入驻作者撰写,文章观点仅代表作者本人,不代表易百纳立场。如有内容侵权或者其他问题,请联系本站进行删除。
free-jdx
红包 94 收藏 评论 打赏
评论
0个
内容存在敏感词
手气红包
    易百纳技术社区暂无数据
相关专栏
置顶时间设置
结束时间
删除原因
  • 广告/SPAM
  • 恶意灌水
  • 违规内容
  • 文不对题
  • 重复发帖
打赏作者
易百纳技术社区
free-jdx
您的支持将鼓励我继续创作!
打赏金额:
¥1易百纳技术社区
¥5易百纳技术社区
¥10易百纳技术社区
¥50易百纳技术社区
¥100易百纳技术社区
支付方式:
微信支付
支付宝支付
易百纳技术社区微信支付
易百纳技术社区
打赏成功!

感谢您的打赏,如若您也想被打赏,可前往 发表专栏 哦~

举报反馈

举报类型

  • 内容涉黄/赌/毒
  • 内容侵权/抄袭
  • 政治相关
  • 涉嫌广告
  • 侮辱谩骂
  • 其他

详细说明

审核成功

发布时间设置
发布时间:
是否关联周任务-专栏模块

审核失败

失败原因
备注
拼手气红包 红包规则
祝福语
恭喜发财,大吉大利!
红包金额
红包最小金额不能低于5元
红包数量
红包数量范围10~50个
余额支付
当前余额:
可前往问答、专栏板块获取收益 去获取
取 消 确 定

小包子的红包

恭喜发财,大吉大利

已领取20/40,共1.6元 红包规则

    易百纳技术社区