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.