2017-10-13 78 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)