2017-10-13 10 views
1

흐린 시간 경과를 만들기 위해 비디오의 30 프레임마다 평균을 잡으려고합니다. 비디오 읽기 및 비디오 쓰기 작업을 할 수 있지만 뭔가 잘못되었습니다. 파란색 채널 만보고 있기 때문입니다! (또는 파란색으로 쓰여지는 하나의 채널).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 픽셀 데이터를 쓰는 경우가 파란색

+0

에 의해 처음으로 두 배에 의하여 채널, 나머지를 곱했다 지금 당장 대답을 해줘야한다. 그렇지 않다면 나는 돌아올 것이다. :) 고맙습니다! –

+0

당신은 나를 올바른 길로 가게합니다. 아래를보십시오. –

2

마틴 베켓이 정답를 알려준 (가 BGR 순서 사용) (감사합니다!) . 나는 스칼라 (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)