FFmpeg / ImageMagick으로 MP4에서 선명하고 깨끗한 썸네일 가져 오기


7

나의 궁극적 인 목표는 30 분 또는 1 시간 길이의 비디오에서 의미있는 스냅 샷을 얻는 것입니다. "의미"는 다소 야심적이므로 요구 사항을 단순화했습니다.

이미지가 선명하지 않아야합니다.

처음에는 이것이 "키 프레임"을 얻는 것을 의미한다고 생각했습니다. 많은 키 프레임이 있기 때문에 비디오의 3 분에 가장 가까운 키 프레임을 선택하기로 결정했습니다. 나는 3 분에 가장 가까운 키 프레임을 찾는 FFmpeg 명령 에서 조언을 따랐다.

그러나 문제는 이러한 키 프레임이 종종 (항상 그런 것은 아님) 흐릿하다는 것입니다. 예를 들면 다음과 같습니다.

여기에 이미지 설명을 입력하십시오

그런 다음 FFmpeg사용하는 비디오의 의미있는 축소판을 사용하여 보다 의미있는 스냅 샷을 얻는 데 도움이되었지만 여전히 위와 같은 프레임이 흐려졌습니다.

이러한 종류의 이미지는 본질적으로 2 개의 서로 다른 장면이 겹치는 것을 알 수 있습니다. 그러나 때로는 다음과 같은 이미지가 나에게 적합합니다.

여기에 이미지 설명을 입력하십시오

위의 이미지는 그다지 의미가 없지만 선명합니다.

이상적으로는 흐린 프레임을 반환하지 않도록 FFmpeg하고 싶습니다. 또는 스크립트를 사용하여 모호한 프레임을 감지하고 5 프레임 중 가장 모호한 것을 선택하고 싶습니다. 누구든지 이것을하는 방법을 알고 있습니까?


나는 얼굴 인식을 사용해 보았습니다. 식별 된 얼굴 영역이 겹치면 이미지가 흐릿하다는 이론을 세웠습니다. 비디오 프레임에서 얼굴을 인식하기 쉽지 않은 것 같아서 성공하지 못했습니다. 이 소프트웨어에는 거의 "완벽한"인물 사진이 필요합니다.
cnfcnf

이 문서가 research.microsoft.com/pubs/68802/… 와 관련이 있다는 것을 알았지 만 다소 복잡해 보입니다.
cnfcnf

"흐리게"는 두 개의 겹치는 이미지가 있음을 의미합니까? 또는 겹치는 이미지가없는 "흐릿한"썸네일의 예가 있습니까? 실제 비디오 자체에는 모션 블러가있을 수 있습니다.이를 제거 할 수는 없습니다. 첫 번째 이미지의 인물이 실제로 움직이면 모든 스틸 프레임에 약간의 모션 블러가 나타납니다.
slhck

찾은 종이는 실제로 문제와 관련이 없습니다. 그것은 흐릿한 메트릭, 즉 (코딩 레이어에서) 이미지가 얼마나 흐릿한지를 결정하는 메트릭을 설명한다. 그러나 직접 구현해야하기 때문에 많은 도움이되지 않습니다. 또한 논문은 꽤 오래된 것처럼 보이며 저자가 지표의 유효성이 나에게 설득력이 없어 보이는 것으로 입증하는 방식.
slhck

"흐리게"함으로써, 나의 최우선 과제는 이미지가 겹치는 것입니다. 가장 큰 문제입니다. 겹치지 않는 흐릿한 이미지가 있는지에 대해 흥미로운 질문을하지만 아직 눈치 채지 못했습니다. 2) 다른 링크를 찾았습니다 : 1) stackoverflow.com/questions/5180327/… 및 2) stackoverflow.com/questions/4470107/… 내 키 프레임이 H.264 비디오에서 가져 오기 때문에 두 번째 링크가 잘못되었을 수 있습니다.
cnfcnf

답변:


7

"의미"는 매우 주관적이지만 "흐리게"는 상당히 객관적이고 감지하기 쉽습니다.

나는 비슷한 문제가 있었고 약간의 연구 끝에 다음 알고리즘으로 끝났습니다.

  • 비디오 파일 길이를 초 단위로 결정하십시오.
  • ffmpeg 및 장면 변경 감지를 사용하여 다음과 같은 10 가지 PNG 축소판을 생성하십시오.

    ffmpeg -ss {$skip} -i {$input} -vf "select=gt(scene\,0.3)" -r 1 -frames:v 1 {$output}
    

각 반복 $skip에서 비디오 길이 (초)가 10 % 증가합니다. 0.3 파라미터는 가장 적합하지는 않지만, arround로 재생할 수 있습니다. 이로 인해 겹치는 장면 및 / 또는 완전히 흐린 이미지의 문제가 해결되었습니다.

  • ImageMagick으로 더 나은 성능을 위해 10 개의 썸네일 가장자리를 감지하고 축소하십시오.

    convert {$input} -thumbnail {$w}x{$h} -colorspace Gray -edge 1 {$path_to_downscaled_image}
    

-thumbnail이미지 크기를 조정하는 데 사용 하고 있습니다. 그런 다음 흑백 필터를 추가합니다. 마지막으로 반지름이 1 인 가장자리 감지를 수행합니다. 이렇게하면 가장자리가 흰색으로 표시된 흑백 이미지 만 생성됩니다. 즉, 이미지의 흰색이 많을수록 가장자리가 더 커집니다. 다음과 같은 것을 얻을 것입니다 :

여기에 이미지 설명을 입력하십시오

  • ImageMagick으로 흑백 이미지를 식별하십시오.

    identify -format '{$format}' {$path_to_downscaled_image}
    

관심을 가져야 할 것은 % [mean] 및 % [standard-deviation]입니다. 그와 함께 arround를하고 가장 적합한 것을 참조하십시오. 예를 들어 "% [mean] + % [standard-deviation]"을 기준으로 결과 이미지를 모두 정렬하십시오. 크기 조정 및 필터링을 시작하기 전에 동일한 이미지를 찾으십시오.

  • 마지막으로 가장 "엣지있는"것을 고르고 원본을 찾아 다시 선택적으로 변환하십시오.

    convert {$input} -thumbnail {$w}x{$h} -adaptive-sharpen 1.25x0.75 {$final_output}
    

나는 -adaptive-sharpen그것이 동일한 가장자리 주위에서만 이미지를 선명하게하기 때문에 최종 결과에 실제로 도움이 된다는 것을 알았습니다 . 다른 기하학을 시험 해보고 원래 해상도의 1/4로 축소 할 때 1.25x0.75가 가장 효과적이라는 것을 알았습니다.

PHP 에서이 작업을 수행했으며 12 분 영화를 실행하는 데 약 25 초가 걸립니다.

도움이 되었기를 바랍니다.


나는 이것을 아직 시도하지 않았지만 논리는 건전 해 보이며 이것이 얼마나 철저한 지에 대해 전반적으로 깊은 인상을 받았습니다. 고맙습니다!
cnfcnf

시도 해봐. 나는 당신의 결과가 무엇인지 기뻐할 것입니다.
matthewd
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.