2017-10-13 46 views
1

我想平均每30帧的视频创建一个模糊的timelapse。我有视频阅读和视频编写工作,但有些不对,因为我只看到蓝色通道! (或正在写入蓝色的一个通道)。OpenCV帧混合只导致蓝色

任何想法?或者更好的方法来做到这一点?我是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() 
} 

回答

1

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

如果它被写在OpenCV的图像,整个8位* 3的像素数据到一个浮动的第一场是蓝色的(它使用BGR顺序)

+0

这使得这么多的意义上,我接受我的乘用双第一通道,其余现在的答案,如果不是这样,我只会回来。 :) 谢谢! –

+0

你把我放在正确的道路上,见下文。 –

2

马丁·贝克特使我正确的答案(谢谢!) 。我乘以一个Scalar(double),这应该是我的暗示,因为我没有乘以普通的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)