【发布时间】:2018-03-08 07:26:10
【问题描述】:
我正在使用 go-opencv 从我的内置网络摄像头获取帧。从相机获取图像所需的时间约为 50 毫秒。对 PNG 进行编码的时间约为 300 毫秒。 JPEG 编码速度快了 3 倍,但速度仍然非常慢。
为什么运行这么慢?
注意: 我已经针对 NodeJS 编写了类似的代码,在同一台机器上执行,并且通过额外的图像处理达到 30fps 绝对没有问题。对我来说,这消除了等式中的硬件问题。
我的代码如下所示:
import (
"fmt"
"image/png"
"github.com/lazywei/go-opencv/opencv"
)
camera := opencv.NewCameraCapture(0)
if camera == nil {
panic("Unable to open camera.")
}
defer camera.Release()
for {
if camera.GrabFrame() {
img := camera.RetrieveFrame(1)
if img != nil {
frame := img.ToImage()
buffer := new(bytes.Buffer)
png.Encode(buffer, frame)
} else {
fmt.Println("Unable to capture frame")
}
}
}
【问题讨论】:
-
考虑使用
imwrite保存垫子。任何性能差异都可能是由于复制或 PNG 编码器上不同的默认质量设置造成的。 -
image/png究竟是如何实现的? |我会接受@Mitch 的建议,因为 OpenCV 在后台使用了 LibPNG。当您能够获得 30fps 时,每张图像 300 毫秒似乎有点过分。 -
看看如果你在
for循环中声明缓冲区(使用var buffer bytes.Buffernotnew(bytes.Buffer))会发生什么。 -
@DanMašek,Mitch -- 感谢您的建议。 image/png 是一个 go 库,我还没有深入研究它的实现。我可能最终会这样做。我现在正在研究直接使用 Mat。仅采集就需要 50 毫秒(最多约 20 fps)这一事实引起了我的担忧。
-
@dlowe 我试了一下,但结果可以忽略不计。感谢您的建议!