我想在 OpenCV 中将图像编码为 H264 视频。
作为我的图像跟踪软件的一部分,我在 OpenCV 3.4(64 位)和 Visual Studio 2017 C++ 中使用 VideoWriter。我使用 ffmpeg 进行手动编码,因为它与 OpenCV 一起提供,所以我认为这是最佳选择。我的 OpenCV 版本表明它是用 ffmpeg 编译的,我可以验证它加载了 opencv_ffmpeg340_64.dll。
解码 H264 (AVC1) 绝对没问题,包括在专门使用 ffmpeg API 时。但是编码 MJPG 或原始图像以外的任何内容都不起作用: VideoWriter.Open() 主要返回 false,在某些情况下,它只写入一个空的或小的 header ,但不会写入帧。我不仅尝试了 ffmpeg API,还尝试了任何可用的 API。将控制台/调试输出重定向到 VC 中的中间窗口不会提供来自 OpenCV 或 ffmpeg 的任何消息。
有许多关于使用 FFmpeg 的 OpenCV 早期版本的帖子,包括 (Cisco) OpenH264 库和使用它的困难。我尝试了很多选项,安装编解码器包,包括 H264、ffmpeg 静态版本、Cisco openH264 库、设置路径等,甚至尝试了低级 ffmpeg 库函数,例如 OpenCV 中公开的 cvCreateVideoWriter,并使用不同的视频容器(AVI、MPG、 MP4) 以及 fourcc 字符串。
我不敢相信在 2018 年,支持 FFmpeg 的伟大 OpenCV 无法编码除了神秘的 MJPG 或原始图像之外的任何东西。如果它使用 FFmpeg,肯定应该有一组重要的功能可用?
虽然我认为这应该可行,但我的下一个最佳选择是使用单独的 ffmpeg 库,这会讽刺地在我想象的解决方案中添加另一个 ffmpeg.dll。任何建议表示赞赏!
代码片段(使用任何视频编码API):
VideoWriter writer;
int codec = VideoWriter::fourcc('X', '2', '6', '4');
writer.open("test.avi", codec, 30, colorImage.size(), true);
writer.write(colorImage);
writer.release();
最佳答案
回答我自己的问题 - 虽然感谢您之前的建议 - 我现在已经设法创建帧并将帧写入 H264 视频,无需任何重新编译。这是我用过的:
我格式化了我的机器(Windows 10 64 位),所以我不能排除任何潜在的编解码器冲突问题——我也没有对其他组合进行全面测试。由于这似乎是一个很常见的问题(有很多误解),我希望这对您有用。
关于c++ - OpenCV编码为H264,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48817441/
我正在使用的第三方API的文档状态:"[O]urAPIonlyacceptspaddedBase64encodedstrings."什么是“填充的Base64编码字符串”以及如何在Ruby中生成它们。下面的代码是我第一次尝试创建转换为Base64的JSON格式数据。xa=Base64.encode64(a.to_json) 最佳答案 他们说的padding其实就是Base64本身的一部分。它是末尾的“=”和“==”。Base64将3个字节的数据包编码为4个编码字符。所以如果你的输入数据有长度n和n%3=1=>"=="末尾用于填充n%
我正在使用ruby1.9解析以下带有MacRoman字符的csv文件#encoding:ISO-8859-1#csv_parse.csvName,main-dialogue"Marceu","Giveittohimóhe,hiswife."我做了以下解析。require'csv'input_string=File.read("../csv_parse.rb").force_encoding("ISO-8859-1").encode("UTF-8")#=>"Name,main-dialogue\r\n\"Marceu\",\"Giveittohim\x97he,hiswife.\"\
我的瘦服务器配置了nginx,我的ROR应用程序正在它们上运行。在我发布代码更新时运行thinrestart会给我的应用程序带来一些停机时间。我试图弄清楚如何优雅地重启正在运行的Thin实例,但找不到好的解决方案。有没有人能做到这一点? 最佳答案 #Restartjustthethinserverdescribedbythatconfigsudothin-C/etc/thin/mysite.ymlrestartNginx将继续运行并代理请求。如果您将Nginx设置为使用多个上游服务器,例如server{listen80;server
我正在尝试在Ruby中复制Convert.ToBase64String()行为。这是我的C#代码:varsha1=newSHA1CryptoServiceProvider();varpasswordBytes=Encoding.UTF8.GetBytes("password");varpasswordHash=sha1.ComputeHash(passwordBytes);returnConvert.ToBase64String(passwordHash);//returns"W6ph5Mm5Pz8GgiULbPgzG37mj9g="当我在Ruby中尝试同样的事情时,我得到了相同sha
如何将send与+=一起使用?a=20;a.send"+=",10undefinedmethod`+='for20:Fixnuma=20;a+=10=>30 最佳答案 恐怕你不能。+=不是方法,而是语法糖。参见http://www.ruby-doc.org/docs/ProgrammingRuby/html/tut_expressions.html它说Incommonwithmanyotherlanguages,Rubyhasasyntacticshortcut:a=a+2maybewrittenasa+=2.你能做的最好的事情是:
之前在培训新生的时候,windows环境下配置opencv环境一直教的都是网上主流的vsstudio配置属性表,但是这个似乎对新生来说难度略高(虽然个人觉得完全是他们自己的问题),加之暑假之后对cmake实在是爱不释手,且这样配置确实十分简单(其实都不需要配置),故斗胆妄言vscode下配置CV之法。其实极为简单,图比较多所以很长。如果你看此文还配不好,你应该思考一下是不是自己的问题。闲话少说,直接开始。0.CMkae简介有的人到大二了都不知道cmake是什么,我不说是谁。CMake是一个开源免费并且跨平台的构建工具,可以用简单的语句来描述所有平台的编译过程。它能够根据当前所在平台输出对应的m
我对如何计算通过{%assignvar=0%}赋值的变量加一完全感到困惑。这应该是最简单的任务。到目前为止,这是我尝试过的:{%assignamount=0%}{%forvariantinproduct.variants%}{%assignamount=amount+1%}{%endfor%}Amount:{{amount}}结果总是0。也许我忽略了一些明显的东西。也许有更好的方法。我想要存档的只是获取运行的迭代次数。 最佳答案 因为{{incrementamount}}将输出您的变量值并且不会影响{%assign%}定义的变量,我
我最喜欢的Google文档功能之一是它会在我工作时不断自动保存我的文档版本。这意味着即使我在进行关键更改之前忘记在某个点进行保存,也很有可能会自动创建一个保存点。至少,我可以将文档恢复到错误更改之前的状态,并从该点继续工作。对于在MacOS(或UNIX)上运行的Ruby编码器,是否有具有等效功能的工具?例如,一个工具会每隔几分钟自动将Gitcheckin我的本地存储库以获取我正在处理的文件。也许我有点偏执,但这点小保险可以让我在日常工作中安心。 最佳答案 虚拟机有些人可能讨厌我对此的回应,但我在编码时经常使用VIM,它具有自动保存功
查看Ruby代码,它具有以下proc_arity:staticVALUEproc_arity(VALUEself){intarity=rb_proc_arity(self);returnINT2FIX(arity);}更多的是C编码风格问题,但为什么staticVALUE在单独的一行而不是像这样的:staticVALUEproc_arity(VALUEself) 最佳答案 它来自UNIX世界,因为它有助于轻松grep函数的定义:$grep-n'^proc_arity'*.c或使用vim:/^proc_arity
我创建了一个由于“在运行时执行的单例元类定义”而无法编码的对象(这段代码的描述是否正确?)。这是通过以下代码执行的:#defineclassXthatmyusesingletonclassmetaprogrammingfeatures#throughcallofmethod:break_marshalling!classXdefbreak_marshalling!meta_class=class我该怎么做才能使对象编码正确?是否可以从对象instance_of_x的classX中“移除”单例组件?我真的需要一个建议,因为我们的一些对象需要通过Marshal.dump序列化机制进行缓存。