รับภาพขนาดย่อที่คมชัดและชัดเจนจาก MP4 ด้วย FFmpeg / ImageMagick


7

เป้าหมายสูงสุดของฉันคือรับสแนปชอตที่มีความหมายจากวิดีโอที่มีความยาว 30 นาทีหรือ 1 ชั่วโมง "มีความหมาย" ค่อนข้างทะเยอทะยานดังนั้นฉันจึงทำให้ความต้องการของฉันง่ายขึ้น

ภาพควรมีความคมชัด - ไม่เบลอ

ตอนแรกฉันคิดว่านี่หมายถึงการได้รับ "คีย์เฟรม" เนื่องจากมีคีย์เฟรมจำนวนมากฉันจึงตัดสินใจเลือกคีย์เฟรมใกล้กับนาทีที่สามของวิดีโอซึ่งโดยทั่วไปแล้ว "มีความหมาย" เพียงพอสำหรับฉัน ฉันทำตามคำแนะนำที่: คำสั่ง FFmpeg เพื่อค้นหาเฟรมหลักที่ใกล้เคียงกับนาทีที่ 3

แต่ปัญหาคือคีย์เฟรมเหล่านี้มักจะพร่ามัว (ไม่เสมอไป) ตัวอย่างคือ:

ป้อนคำอธิบายรูปภาพที่นี่

จากนั้นฉันลองใช้ภาพขนาดย่อที่มีความหมายสำหรับวิดีโอโดยใช้ FFmpegซึ่งช่วยให้ได้ภาพสแนปชอตที่มีความหมายมากขึ้น แต่ฉันก็ยังมักจะมีเฟรมพร่ามัวเหมือนที่กล่าวมาข้างต้น

คุณจะสังเกตเห็นว่าภาพประเภทนี้เป็นฉากซ้อนทับกัน 2 ฉาก อย่างไรก็ตามบางครั้งฉันได้ภาพที่เหมาะกับฉัน - เช่นนี้:

ป้อนคำอธิบายรูปภาพที่นี่

ภาพด้านบนไม่ได้มีความหมายมาก แต่มีความคมชัด

เป็นการดีที่ฉันต้องการ FFmpeg ไม่คืนเฟรมพร่ามัว อีกทางหนึ่งฉันต้องการใช้สคริปต์เพื่อตรวจสอบเฟรมพร่ามัวและเลือกความพร่ามัวอย่างน้อยที่สุดจาก 5 เฟรม ไม่มีใครรู้วิธีการทำเช่นนี้?


ฉันลองใช้ Face Detection เช่นกัน ฉันคิดว่าถ้าพื้นที่ใบหน้าที่ระบุทับซ้อนกันภาพก็จะเบลอ ฉันไม่ค่อยประสบความสำเร็จเพราะดูเหมือนว่าใบหน้าไม่สามารถตรวจจับได้ง่ายในเฟรมวิดีโอ ซอฟต์แวร์ต้องการภาพถ่ายแนวตั้งเกือบสมบูรณ์แบบ
cnfcnf

ฉันพบบทความนี้ที่อาจเกี่ยวข้อง: research.microsoft.com/pubs/68802/..แต่ดูเหมือนจะค่อนข้างซับซ้อน
cnfcnf

"เบลอ" สำหรับคุณหมายความว่ามีภาพซ้อนกันสองภาพหรือไม่ หรือคุณมีตัวอย่างของภาพย่อ "เบลอ" ที่ไม่มีภาพซ้อนทับกันบ้าง โปรดทราบว่าอาจมีการเคลื่อนไหวเบลอในวิดีโอจริง - คุณไม่สามารถกำจัดได้ หากบุคคลในภาพแรกเคลื่อนไหวได้จริงทุกเฟรมจะแสดงภาพเบลอเล็กน้อย
slhck

กระดาษที่คุณพบไม่ได้เกี่ยวข้องกับปัญหาของคุณมากนัก มันอธิบายการวัดการเบลอของภาพนั่นคือการวัดเพื่อกำหนดว่าภาพนั้นพร่ามัวอย่างไร (ที่เลเยอร์การเข้ารหัส) แต่นั่นจะไม่ช่วยคุณได้มากนักเนื่องจากคุณต้องใช้มันด้วยตัวเอง กระดาษดูเหมือนว่าค่อนข้างเก่าและวิธีการที่ผู้เขียนพิสูจน์ความถูกต้องของตัวชี้วัดไม่ได้ดูน่าเชื่อถือเกินไปสำหรับฉัน
slhck

ด้วย "เบลอ" ลำดับความสำคัญสูงสุดของฉันคือการซ้อนทับภาพ นั่นเป็นปัญหาที่ใหญ่ที่สุด คุณตั้งคำถามที่น่าสนใจว่ามีภาพพร่ามัวที่ไม่ทับซ้อนกันหรือไม่ แต่ฉันยังไม่สังเกตเห็น ฉันได้พบ 2 ลิงค์อื่น ๆ : 1) stackoverflow.com/questions/5180327/ …และ 2) stackoverflow.com/questions/4470107/…ลิงค์ที่สองอาจไม่ถูกต้องเนื่องจากคีย์เฟรมของฉันมาจากวิดีโอ H.264
cnfcnf

คำตอบ:


7

"ความหมาย" ค่อนข้างเป็นอัตนัย แต่ "พร่ามัว" ค่อนข้างมีวัตถุประสงค์และตรวจจับได้ง่าย

ฉันมีปัญหาที่คล้ายกันและหลังจากการค้นคว้าเล็กน้อยจบลงด้วยอัลกอริทึมต่อไปนี้:

  • กำหนดความยาวไฟล์วิดีโอในไม่กี่วินาที
  • สร้างรูปย่อขนาด 10 png โดยใช้ ffmpeg และ detecion เปลี่ยนฉากด้วย:

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

ในแต่ละการทำซ้ำ$skipจะเพิ่มขึ้น 10% กับความยาววิดีโอในไม่กี่วินาที พารามิเตอร์ 0.3 อาจไม่เหมาะสมที่สุดสำหรับคุณ แต่คุณสามารถเล่นกับมันได้ วิธีนี้ช่วยแก้ไขปัญหาด้วยฉากซ้อนทับและ / หรือภาพเบลออย่างสมบูรณ์

  • ตรวจจับขอบของภาพขนาดย่อ 10 ภาพเหล่านั้นและลดขนาดลงเพื่อประสิทธิภาพที่ดีขึ้นด้วย ImageMagick:

    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] +% [ค่าเบี่ยงเบนมาตรฐาน]" ค้นหาภาพเดียวกันก่อนที่เราจะเริ่มปรับขนาดและกรอง

  • ในที่สุดเลือกหนึ่ง "หงุดหงิด" ที่สุดหาต้นฉบับและเลือกแปลงอีกครั้ง:

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

ฉันพบว่ามัน-adaptive-sharpenช่วยได้จริงกับผลลัพธ์ที่ได้เพราะมันทำให้รูปภาพคมชัดขึ้นรอบ ๆ ขอบเดียวกันนั้นเท่านั้น ฉันลองรูปทรงเรขาคณิตที่แตกต่างกันและพบว่า 1.25x0.75 เหมาะที่สุดสำหรับฉันเมื่อฉันลดขนาดลงเหลือหนึ่งในสี่ของความละเอียดดั้งเดิม

ฉันทำสิ่งนี้ใน PHP และใช้เวลาประมาณ 25 วินาทีสำหรับภาพยนตร์ 12 นาทีในการดำเนินการซึ่งเป็นเรื่องปกติสำหรับฉัน

ฉันหวังว่านี่จะเป็นประโยชน์


ฉันยังไม่ได้ลองสิ่งนี้ แต่ตรรกะดูเหมือนว่าจะฟังดูดีและฉันก็ค่อนข้างประทับใจกับมันมาก ขอขอบคุณ!
cnfcnf

ให้มันลอง. ฉันยินดีเป็นอย่างยิ่งที่ได้เห็นผลลัพธ์ของคุณ
matthewd
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.