OpenCV帧混合只会导致蓝色

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

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

马丁·贝克特(Martin Beckett)带领我去了正确的答案(谢谢!)。 我乘以一个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) 

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

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