- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
最近,我在尝试使用带有 imx6 处理器和 MIPI-CSI 摄像头的板来传输视频。
我们的目标是通过 RTP 协议(protocol)传输视频 (1920x1080@30fps),我们使用 gstreamer 管道实现了这一点。要传输的命令管道是:
gst-launch-1.0 imxv4l2videosrc device=/dev/video1 imx-capture-mode=2 ! imxvpuenc_h264 quant-param=29 ! rtph264pay mtu=60000 ! udpsink host=10.42.0.1 port=5000 sync=false
该命令传输分辨率为 1920x108 的视频(imx-capture-mode=2 参数)。
然后从 PC (10.42.0.1) 我们使用以下命令捕获视频(通过端口 5000):
gst-launch-1.0 -v udpsrc port=5000 ! application/x-rtp, media=video, clock-rate=90000, encoding-name=H264, payload=96 ! rtph264depay ! avdec_h264 ! fpsdisplaysink text-overlay=false sync=false &
而且视频的流畅度非常好。
但是现在,我们想在传输视频之前对其进行处理,因为摄像机在移动,我们需要添加一些算法来减少由于抖动引起的噪声。
换句话说,主要思想是:从相机中获取视频->处理视频->传输到RTP。所有这些都使用带有 imx6 的电路板。
该开发板基于 linux yocto 项目,它具有启用了 gstreamer 插件的 opencv 3.1。我们的想法是使用 opencv 和 gstreamer 管道获取视频,处理并传输它......但首先我们做了一些测试,获取视频并在不处理的情况下传输它,但是当我们从 PC 上捕获视频时,它非常慢和延迟...
我们想知道这是否是实现我们目标的正确方法。这是我们使用的源代码:
#include <QCoreApplication>
#include <QDebug>
#include <opencv2/opencv.hpp>
#include <opencv2/video.hpp>
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
cv::VideoCapture cap("imxv4l2videosrc device=/dev/video1 imx-capture-mode=2 ! videoconvert ! appsink");
Q_ASSERT(cap.isOpened());
if(!cap.isOpened())
{
qDebug() << "Error with the video capturer";
a.exit(-1);
}
cv::Mat frame;
cap >> frame; //Dummy read
double frame_width= cap.get(CV_CAP_PROP_FRAME_WIDTH);
double frame_height= cap.get(CV_CAP_PROP_FRAME_HEIGHT);
cv::VideoWriter writer;
writer.open("appsrc ! videoconvert ! imxvpuenc_h264 quant-param=29 ! rtph264pay mtu=60000 ! udpsink host=10.42.0.1 port=5000 sync=false",
0,30,cv::Size(frame_width,frame_height));
if(!writer.isOpened())
{
qDebug() << "Error video writer";
a.exit(-1);
}
while(true) {
cap.read(frame);
if(frame.empty())
break;
writer.write(frame);
cv::waitKey(33);
}
return a.exec();
}
最佳答案
我猜您的视频速度变慢的原因是视频格式转换。 OpenCv 从 gstreamer appsink
元素获取 BGR
格式的视频。如果您的 imxv4l2videosrc
输出不同的格式(例如 UYVY
或 I420
),videoconvert
元素将必须执行大量的计算。在某些情况下,这些计算使用了超过 100% 的 CPU,这会减慢您的输入流。
您可以通过在管道末尾添加 -v
来检查原始管道使用的格式。
gst-launch-1.0 imxv4l2videosrc device=/dev/video1 imx-capture-mode=2 ! imxvpuenc_h264 quant-param=29 ! rtph264pay mtu=60000 ! udpsink host=10.42.0.1 port=5000 sync=false -v
我们可以通过降低分辨率来测试视频转换是否正在减慢您的系统。您能否通过将分辨率降低到 1280x720
或 640x360
再试一次,并检查您的 CPU 使用率?
如果是这种情况,我们可以从 imxv4l2videosrc
请求不同格式的输出。我没有使用过那个元素,我不知道它的功能。但是您可以使用 gst-inspect-1.0
命令检查功能。
gst-inspect-1.0 imxv4l2videosrc
输出会有这样的部分
Pad Templates:
SRC template: 'src'
Availability: Always
Capabilities:
video/x-raw
format: { (string)RGB16, (string)BGR, (string)RGB, (string)GRAY8, (string)GRAY16_LE, (string)GRAY16_BE, (string)YVU9, (string)YV12, (string)YUY2, (string)YVYU, (string)UYVY, (string)Y42B, (string)Y41B, (string)YUV9, (string)NV12_64Z32, (string)NV24, (string)NV61, (string)NV16, (string)NV21, (string)NV12, (string)I420, (string)BGRA, (string)BGRx, (string)ARGB, (string)xRGB, (string)BGR15, (string)RGB15 }
width: [ 1, 32768 ]
height: [ 1, 32768 ]
framerate: [ 0/1, 2147483647/1 ]
BGRx
、“RGB”或“xRGB”等具有 B、G 和 R channel 的格式将对您有用且速度快。
关于opencv - 在 imx6 板上处理视频和传输的最佳方式是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53329509/
我们将 Azure Boards(与敏捷流程相关的项目)定义为“功能”>“史诗”>“任务”>“用户故事”。 在我们的Azure Boards(Boards >Board)中,它仅显示Epic和Feat
我正在编写一个 C++ 井字游戏,这是我目前拥有的: #include using namespace std; int main() { board *b; b->draw();
这是一个足够简单的问题。 看完documentation for ion-pane它指出: A simple container that fits content, with no side eff
关闭。这个问题是opinion-based .它目前不接受答案。 想改进这个问题?更新问题,以便 editing this post 可以用事实和引用来回答它. 4年前关闭。 Improve this
我正在用 javascript 对 arduino 开发板进行编程。我正在尝试使用 johnny-five 库连接多个 arduino 板。我关注了johnny-five documentation我
在我的 Java 类(class)中,我们正在学习《Java 基础知识》一书的第 4 章。我正在做项目 4-11,它是一个黑色和红色的棋盘格,但是我得到随机颜色,我试图按照本书教我们使用 ColorP
我正在制作一个数独板 GUI,它应该看起来像这样 http://www.sudoku.4thewww.com/Grids/grid.jpg 由于某种原因,它只显示最后一个 3*3 板。如果有人能告诉我
我正在开发一款带有二维阵列(游戏板)的新游戏。每个单元格/图 block 都有一定数量的点。 我想实现的是一个算法能找到核心最高的最短路径。 所以我首先实现了 Dijkstra 算法(下面的源代码)来
更新:(2015-10-16)[已解决!]-使用trigger()并通过slice()限制为50个引脚固定。 非常感谢Abhas Tandon通过提供使用 $(this).trigger('click
关闭。这个问题需要更多focused .它目前不接受答案。 想改善这个问题吗?更新问题,使其仅关注一个问题 editing this post . 7年前关闭。 Improve this questi
var size = 8; var board = ""; for (var y = 0; y x= (x+y) % 2 = 关于javasc
我正在制作一个简单的游戏,需要我创建一个由用户定义大小的棋盘。 我一直在编写一个函数,该函数应该返回我将在我的游戏中使用的棋盘(矩阵),但我似乎无法让它工作。 我尝试使用嵌套的 for 循环方法在 m
我正在尝试让板模板引擎与 express.js 一起工作。我最初的尝试是这样的: app.register('.html', { compile: function (str, options
我正在测试 Azure Boards Rest API。我目前可以成功创建、删除和获取项目,但我似乎无法在列之间移动它们。 这是我的要求https://{{AzureBoardsToken}}@{{A
我想用 trello api 归档一个板/列表,但我找不到解决方案。 与 https://trello.com/docs/api/list/#post-1-lists-idlist-archiveal
我上传了 sketch到一个 Arduino Uno,它的循环是这样的: void loop(){ Serial.println("Hello, World!"); } 所以,现在,我无法再上
我想要进行一个查询,显示结构 Epic -> 功能 -> 发布 -> 用户故事 -> 任务,以及特定迭代路径下的所有待处理任务 我尝试使用工作项树,但它只显示到 mu 用户故事 我的 Azure De
我在 python 中使用来自 Opencv 的 Charuco 标记。我之前使用的是 Aruco 开发板,我可以选择创建一个带有 id 偏移量(例如:偏移量为 40)的开发板。 from cv2 i
我不知道如何将另一个 View 中的辅助 Anchorpane 设置到主 View 的边界(在 fxml 代码中,它将是名为 holderPane 并且有灰色区域),这样当窗口展开时,它也会随之拉伸(
如何使用包含列、行和堆栈(包含 4、3、2、1)的 3D 通用数组制作一 block 板。 这是我声明的: private int row, col, stack; int[][][] array3D
我是一名优秀的程序员,十分优秀!