1

我正在尝试平均每 30 帧视频以创建模糊的延时摄影。我的视频阅读和视频写作工作正常,但出了点问题,因为我只看到蓝色通道!(或正在写入蓝色的一个通道)。

有任何想法吗?或者更好的方法来做到这一点?我是 OpenCV 的新手。代码在 Kotlin 中,但我认为如果这是 Java 或 python 之类的,它应该是同一个问题。

val videoCapture = VideoCapture(parsedArgs.inputFile)
val frameSize = Size(
        videoCapture.get(Videoio.CV_CAP_PROP_FRAME_WIDTH),
        videoCapture.get(Videoio.CV_CAP_PROP_FRAME_HEIGHT))
val fps = videoCapture.get(Videoio.CAP_PROP_FPS)
val videoWriter = VideoWriter( parsedArgs.outputFile,  VideoWriter.fourcc('M', 'J', 'P', 'G'), fps, frameSize)
val image = Mat(frameSize,CV_8UC3)
val blended = Mat(frameSize,CV_64FC3)
println("Size: $frameSize fps:$fps over $frameCount frames")

try {
    while (videoCapture.read(image)) {
        val frameNumber = videoCapture.get(Videoio.CAP_PROP_POS_FRAMES).toInt()
        Core.flip(image, image, -1) // I shot the video upside down
        Imgproc.accumulate(image,blended)
        if(frameNumber>0 && frameNumber%parsedArgs.windowSize==0) {
            Core.multiply(blended, Scalar(1.0/parsedArgs.windowSize), blended)
            blended.convertTo(image, CV_8UC3);
            videoWriter.write(image)
            blended.setTo(Scalar(0.0,0.0,0.0))
            println(frameNumber.toDouble()/frameCount)
        }
    }
} finally {
    videoCapture.release()
    videoWriter.release()
}
4

2 回答 2

2

Martin Beckett 引导我找到了正确的答案(谢谢!)。我乘以 Scalar(double),这应该是我的提示,因为我没有乘以普通双精度数。

它需要一个标量,每个通道都有一个值,所以它很高兴将我的第一个通道乘以两倍,其余的乘以 0。

Imgproc.accumulate(image, blended64)
    if (frameNumber > 0 && frameNumber % parsedArgs.windowSize == 0) {
    val blendDivisor = 1.0 / parsedArgs.windowSize
    Core.multiply(blended64, Scalar(blendDivisor, blendDivisor, blendDivisor), blended64)
于 2017-10-13T17:12:29.803 回答
1

Imgproc.accumulate(image,blended) 我的猜测是在组合它们之前尝试将图像转换为匹配混合时使用不同的类型。

如果将整个 8 位 * 3 像素数据写入一个浮点数,则 openCV 图像中的第一个字段为蓝色(它使用 BGR 顺序)

于 2017-10-13T02:44:24.907 回答