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