OpenCV帧混合仅导致蓝色

时间:2017-10-13 02:25:48

标签: opencv kotlin opencv3.3

我试图平均每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()
}

2 个答案:

答案 0 :(得分:2)

Martin Beckett带领我找到正确的答案(谢谢!)。我乘以标量(双倍),这应该是我的暗示,因为我没有乘以普通双倍。

它期望一个标量,每个频道的值,所以我很高兴将我的第一个频道乘以双倍,其余频道乘以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)

答案 1 :(得分:1)

我的猜测是在Imgproc.accumulate(image,blended)中使用不同的类型尝试将图片转换为匹配混合,然后再合并它们。

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