由于镜头校正滤镜,使用ffmpeg可以补偿鱼眼失真:
ffmpeg -i in.mp4 -vf "lenscorrection=cx=0.5:cy=0.5:k1=-.25:k2=-.25" out.mp4
Run Code Online (Sandbox Code Playgroud)
什么值k1
及k2
,尤其是对于一个GOPRO?有没有办法计算它们?
我试图使用以下代码在python中使用cv2从GoPro捕获实时流:
VIDEO_URL = "http://10.5.5.9:8080/live/amba.m3u8"
cam = cv2.VideoCapture(VIDEO_URL)
cv2.namedWindow("GoPro",cv2.CV_WINDOW_AUTOSIZE)
while True:
f, im = cam.read()
cv2.imshow("GoPro",im)
if cv2.waitKey(5) == 27:
break
cam.release()
cv2.destroyAllWindows()
Run Code Online (Sandbox Code Playgroud)
但收到以下错误:
WARNING: Couldn't read movie file http://10.5.5.9:8080/live/amba.m3u8
OpenCV Error: Assertion failed (size.width>0 && size.height>0) in imshow, file /tmp/opencv-MRl1/opencv-2.4.7.1/modules/highgui/src/window.cpp, line 261
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "gopro_simple.py", line 167, in live_stream
cv2.imshow("GoPro",im)
cv2.error: /tmp/opencv-MRl1/opencv-2.4.7.1/modules/highgui/src/window.cpp:261: error: (-215) size.width>0 && size.height>0 in function imshow
Run Code Online (Sandbox Code Playgroud)
流在vlc中工作,代码与网络摄像头一起工作,所以看起来问题是opencv不喜欢.m3u8格式.如何解决这个问题的任何想法/建议将不胜感激.谢谢.
我目前正在尝试从使用GoPro录制的MPEG-4文件中提取每个帧时间戳.
我想要相机捕获帧的确切时间,以便稍后将其与计算机视觉算法结合起来.
我知道输出帧速率是25 fps.我使用ffmpeg和ffprobe以不同的方式提取了pts,但它们都显示出太完美的结果让我相信它们.
每个帧/包具有精确的0.04秒内部(或3600英寸单位),足够方便地匹配完美的25 fps.
我到目前为止使用的命令是:
ffmpeg -i 3_96025.MP4 -an -vf showinfo %10d.png 2> res.txt
Run Code Online (Sandbox Code Playgroud)
我也试过用
ffmpeg -i 3_96025.MP4 **-copyts** -an -vf showinfo %10d.png 2> res.txt
Run Code Online (Sandbox Code Playgroud)
但结果完全一样.
我也试过ffprobe:
ffprobe -i 396025.MP4 -show_packets -select_streams v
Run Code Online (Sandbox Code Playgroud)
我得到的间隔也很完美.
我很确定gopro无法以如此完美的方式维持25 fps.另外,我记录了一个计时器,我可以看到每个帧不完全匹配0.04秒的间隔. 那么我有没有办法真正看到每帧被捕获的时间?
这是我用ffmpeg获得的输出的一部分供参考:
frame= 42 fps= 26 q=0.0 size=N/A time=00:00:01.36 bitrate=N/A
n:42 pts:151200 pts_time:1.68 pos:3232584 fmt:yuv420p sar:1/1 s:1280x960 i:P iskey:0 type:B checksum:6A83E942 plane_checksum:[1C859E55 79A4ED3E 28E25DA0]
[Parsed_showinfo_0 @ 0037dea0] n:43 pts:154800 pts_time:1.72 pos:3255334 fmt:yuv420p sar:1/1 s:1280x960 i:P iskey:0 type:B checksum:5736F4C1 plane_checksum:[ACAD00D0 06FFDE34 …
Run Code Online (Sandbox Code Playgroud) 我为你们提出了一个有趣的问题.我想建立一个网络应用程序,最好是在python/django中,从gopro相机拍摄实时流媒体素材并将其发布到我的网站.
您对ffmpeg,nginx或使用Livestream/Ustream api有什么看法?10-20秒的延迟仍然符合我的需求.
我使用Matlab的相机校准工具箱校准了我的GoPro Hero 4 Black ,并使用OpenCV的calibrationMatrixValues()计算了它的视野和焦距.但是,这些与GoPro的规格不同.相当于118.2/69.5 FOV,我得到95.4/63.4,焦距2.8mm而不是17.2mm.显然有些不对劲.
我认为校准本身是正确的,因为图像失真似乎运作良好.
任何人都可以给我一个暗示我犯了错误的提示吗?我在下面发布我的代码.
谢谢.
cameraMatrix = new Mat(3, 3, 6);
for (int i = 0; i < cameraMatrix.height(); i ++)
for (int j = 0; j < cameraMatrix.width(); j ++) {
cameraMatrix.put(i, j, 0);
}
cameraMatrix.put(0, 0, 582.18394);
cameraMatrix.put(0, 2, 663.50655);
cameraMatrix.put(1, 1, 582.52915);
cameraMatrix.put(1, 2, 378.74541);
cameraMatrix.put(2, 2, 1.);
org.opencv.core.Size size = new org.opencv.core.Size(1280, 720);
//output parameters
double [] fovx = new double[1];
double [] fovy = …
Run Code Online (Sandbox Code Playgroud) 我想知道一种使用简单的批处理和ffmpeg在Windows上稳定goPro视频的简便方法。
我从GoPro元数据文件(github库)中提取了带有加速度计数据(m/s 2)的CSV文件.
一秒钟的加速度计在3轴上包含约200个数据样本.此文件的示例如下所示:
在PHP中,对于X轴上的每个瞬时值,我将m/s 2转换为:
function convert_meters_per_second_squared_to_g($ms2) {
// 1g = 9.80665 m/s2
return $ms2 * 0.101971621297793; // 1 / 9.80665 == 0.101971621297793
}
Run Code Online (Sandbox Code Playgroud)
CSV文件的200行(1秒)示例代码:
$acc_x_summed_up = 0;
if (($handle = fopen($filepath, "r")) !== FALSE) {
while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) {
list ($millis, $acc_x, $acc_y, $acc_z) = $data;
$acc_x_summed_up += $acc_x;
}
}
$g_force = convert_meters_per_second_squared_to_g($acc_x_summed_up);
Run Code Online (Sandbox Code Playgroud)
但是如何在X轴上显示每秒的g力值?我试图总结这些值并转换它们,但结果显然是错误的,因为我得到的值高达63 G.
[更新:]
我有一个连接到视频采集卡 (AverMedia Game Broadcaster HD) 的 GoPro Hero 3+(黑色)。我只是想在 OpenCV 中获取视频流。使用罗技网络摄像头没有任何问题。使用的代码如下。
VideoCapture cap;
cap.open(0);
waitKey(300);
//cap.set(CV_CAP_PROP_FRAME_WIDTH, 1280);
//cap.set(CV_CAP_PROP_FRAME_HEIGHT, 720);
if (cap.isOpened()){
cout << "Cam identified" << endl;
}
namedWindow("dst", 1);
while (1){
Mat frame;
if (!cap.read(frame)) {
std::cout << "Unable to read frame from video stream" << std::endl;
continue;
}
imshow("dst", frame);
[...]
}
Run Code Online (Sandbox Code Playgroud)
使用 GoPro 会发生以下情况:OpenCV 能够打开 VideoCapture(“已识别摄像头”)但无法读取任何帧(只有灰色屏幕和输出:“无法从视频流中读取帧”)。我还用 frame.empty(); 检查了这一点。
我知道视频采集卡工作正常,因为 Unity 使用 GoPro 流打开了一个 WebCamTexture,没有任何问题。我阅读了 OpenCv 中的编解码器问题,因此我已经尝试使用 FFMPEG 支持编译 OpenCV。现在可以显示 GoPro 录制的 MP4 视频,但流仍然不起作用。
我使用 OpenCV 2.48、Windows 7 …
我在尝试从新的GoPro Hero 4摄像机捕获实时流并使用openCV对其进行一些图像处理时遇到了麻烦。
这是我的试用版(创建的窗口中未显示任何内容
import cv2
import argparse
import time
import datetime
from goprohero import GoProHero
ap = argparse.ArgumentParser()
ap.add_argument("-a", "--min-area", type=int, default=500, help="minimum area size")
args = vars(ap.parse_args())
camera = cv2.VideoCapture("http://10.5.5.9:8080/gp/gpControl/executep1=gpStream&c1=restart")
time.sleep(5)
cv2.namedWindow("", cv2.CV_WINDOW_AUTOSIZE)
firstFrame = None
noOfCars = 0
speed = 80
while True:
(grabbed, frame) = camera.read()
text = "Smooth"
print("Capturing ...")
if not grabbed:
print("nothing grabbed")
break
Run Code Online (Sandbox Code Playgroud)
循环中断,因为抓取总是等于false,这意味着openCV一无所获。
我需要您帮助解决数据同步问题...我目前正在尝试将我的 GoPro 视频与现实世界时间(也就是我的笔记本)同步。我设法完美地同步了我的笔记本电脑和 GoPro 3+ black 的日期和时间。问题是,当 GoPro 将文件保存在磁盘中时,它会将创建时间的毫秒数向上舍入(毫秒始终为 000000)。因此,不可能实现完美同步。附件是MP4视频的元信息图片(由ffprobe提取)。
我的问题是:我必须做什么,所以 GoPro 实际上以毫秒的精度保存了 creation_time?
另一个小问题:看附件图,我们看到“timecode”是一个时间同步数据,格式为小时:分钟:秒:帧。我在想我可以使用“帧”值来计算丢失的毫秒值。如果我们以这个附件为例,我们可以看到帧值为“36”。这意味着它开始记录的毫秒是与 FPS 的第 36 帧相关的毫秒(在这个视频中:60fps)值:像 1000/60 * 36 这样的 600 毫秒,因此这个视频的实际创建时间将是 : 2017-07-19T18:10:34.600
这个逻辑对吗?它没有用!我不知道还能做什么。
PS:我需要这种时间精度,因为我会将视频帧与以 11hz 记录的外部传感器数据同步。
请帮忙
我忘了说,即使你查看 GoPro SSD 卡内部的原始原始文件信息,使用“stats”读取创建时间(见附件)它仍然具有相同的时间戳,没有毫秒。