La combinación de cuadros de OpenCV solo da como resultado azul

Estoy tratando de promediar cada 30 fotogtwigs de un video para crear un timelapse borroso. Obtuve la lectura del video y la grabación de video funcionando, pero algo está mal, ¡porque solo estoy viendo el canal azul! (o un canal que se escribe en azul).

¿Algunas ideas? O mejores forms de hacer esto? Soy nuevo en OpenCV. El código está en Kotlin, pero creo que debería ser el mismo problema si se tratara de Java o Python o lo que sea.

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() } 

Martin Beckett me condujo a la respuesta correcta (¡gracias!). Estaba multiplicando por un Scalar (doble), lo que debería haber sido mi pista porque no estaba multiplicando por simple-doble.

Esperaba un Scalar, con un valor para cada canal, así que estaba felizmente multiplicando mi primer canal por el doble y el rest por 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) 

Imgproc.accumulate(image,blended) diferentes types en Imgproc.accumulate(image,blended) intente convertir la image para que coincida con blended antes de combinarlos.

Si estaba escribiendo los datos completos de 8 bits * 3 píxeles en un flotante, el primer campo en una image openCV es azul (utiliza el order BGR)