opencv เป็นไลบรารีสำหรับจัดการเกี่ยวกับรูปภาพ สามารถเรียกใช้ได้จากหลายภาษา รวมถึงไพธอนด้วย
ความสามารถของ opencv มีหลากหลายอย่าง แต่ในที่นี้จะแนะนำการใช้ opencv เพื่อค้นหาภาพใบหน้าตัวละครอนิเมะจากภายในรูปภาพ
สำหรับไพธอนสามารถติดตั้งได้โดย
pip install opencv-python
แต่เวลาเรียกใช้ จะต้อง import ชื่อ cv2
import cv2
cv2.CascadeClassifier เป็นคำสั่งที่ใช้ในการค้นสิ่งที่ต้องการจากรูปภาพ โดยเริ่มแรกต้องโหลดไฟล์ที่เรียกว่าไฟล์ cascade ซึ่งเป็นไฟล์ที่กำหนดลักษณะของสิ่งที่ต้องการตรวจจับ
ไฟล์ cascade สำหรับตรวจจับสิ่งต่างๆจะมีเตรียมไว้อยู่ในโฟลเดอร์ของ opencv อยู่แล้ว
แต่ว่าไม่มีไฟล์สำหรับใช้ตรวจจับใบหน้าของตัวละครในอนิเมะโดยเฉพาะ ซึ่งมันต่างจากใบหน้าคนธรรมดาอยู่พอสมควร แต่ก็ได้มีคนญี่ปุ่นทำเอาไว้ สามารถโหลดได้ที่
https://github.com/nagadomi/lbpcascade_animeface ให้โหลดไฟล์ lbpcascade_animeface.xml มาแล้วใส่ไว้ในโฟลเดอร์เดียวกับไฟล์โปรแกรมที่จะรัน
ในที่นี้จะขอแสดงตัวอย่างโดยเขียนโค้ดให้ทดสอบภาพทั้งหมดที่อยู่ในโฟลเดอร์นึง แล้วทำการวาดกรอบส่วนที่ตรวจจับได้แล้วบันทึกภาพใหม่ ได้ดังนี้
import cv2,os
from glob import glob
cascade = cv2.CascadeClassifier('lbpcascade_animeface.xml') # เตรียมไฟล์ cascade ไว้
folder_rup = 'rupprakopwalidet' # โฟลเดอร์รูปต้นฉบับ
folder_mai = 'khonhana' # โฟลเดอร์ที่จะใส่ผลลัพธ์
if not os.path.exists(folder_mai): # ถ้ายังไม่มีก็สร้างก่อน
os.makedirs(folder_mai)
for chue_rup in sorted(glob(os.path.join(folder_rup,'*.jpg'))):
rup = cv2.imread(chue_rup)
raisi = cv2.cvtColor(rup,cv2.COLOR_BGR2GRAY)
raisi = cv2.equalizeHist(raisi)
hachoe = cascade.detectMultiScale(raisi,1.1,5) # เริ่มค้นหา
for x,y,w,h in hachoe:
cv2.rectangle(rup,(x,y),(x+w,y+h),(100,0,200),2) # ใส่กรอบส่วนที่หาเจอ
cv2.imwrite(os.path.join(folder_mai,os.path.split(chue_rup)[-1]),rup) # บันทึกภาพ
cv2.imread จะทำการอ่านรูปภาพขึ้นมา
cv2.cvtColor คือคำสั่งเปลี่ยนรูปแบบสี ในที่นี้เลือกโหมด cv2.COLOR_BGR2GRAY คือเปลี่ยนเป็นแบบขาวเทาดำ
cv2.equalizeHist เป็นตัวทำให้ความเข้มภายในภาพมีความเปรียบต่างชัดเจนยิ่งขึ้น ทำให้ตรวจจับภาพได้ง่ายขึ้น
ภาพเปรียบเทียบระหว่างภาพเดิม กับหลังเปลี่ยนเป็นไร้สี แล้วก็หลังจากใช้ cv2.equalizeHist
แล้วก็ใช้เมธอด .detectMultiScale ที่ตัว cascade โดยป้อนภาพไร้สีลงไป จะได้ค่าคืนกลับมาเป็นพิกัดของภาพทั้งหมดที่ค้นเจอ
x ตำแหน่งในแกน x
y ตำแหน่งในแกน y
w ขนาดในแกน x
h ขนาดในแกน y
ตรงนี้หากต้องการกำหนดขอบเขตขนาดภาพไม่ให้เล็กหรือใหญ่ไปก็อาจใส่คีย์เวิร์ด minSize=(x,y) หรือ maxSize=(x,y) เสริมเข้าไป แต่ในที่นี่ไม่ใส่เพราะจะลองหาภาพทุกขนาด ไม่ว่าใบหน้านั้นจะเล็กหรือใหญ่แค่ไหน
พอได้พิกัดมาแล้วก็ทำการใส่กรอบลงในภาพด้วยคำสั่ง cv2.rectangle
สุดท้ายก็บันทึกภาพด้วยคำสั่ง cv2.imwrite
ในที่นี้ได้ลองทดสอบกับภาพประกอบวลีเด็ดที่ลงในเว็บ
https://hinaboshi.com จะขอแสดงผลที่ได้จำนวนนึง (หากอยากรู้ว่าภาพนี้ประกอบวลีเด็ดอะไรให้คลิกที่ภาพเพื่อเข้าดูหน้าวลีเด็ดนั้นได้)
เริ่มจากภาพที่ยกมาเมื่อครู่ จากเรื่อง photo kano ดูแล้วมี ๕ คนแต่เจอแค่ ๓ คนเอง
ภาพนี้จาก code geass แย่กว่า เจอแค่ ๒ คน
ส่วนภาพนี้จาก shingeki no kyojin ฌ็อง อยู่ด้านหน้าหาไม่เจอ แต่หาคนข้างหลังเจอ
อันนี้จาก oremonogatari!! ทาเกโอะโดนมองข้ามไป หน้าอาจจะประหลาดไปหน่อยหรือเปล่า
ภาพนี้จาก flip flappers หาไม่เจอหลายคน แต่ด้านหลังที่มืดๆกับด้านหน้าที่ใส่แว่นอยู่กลับหาเจอได้
อันนี้ amanchu! เจอแต่ฮิการิ แต่ฟุตาบะโดนมองข้าม
จาก Re: zero อันนี้แฟริสโดนมองข้าม
จาก oregairu ฮาจิมังโดนมองข้าม
ส่วนอันนี้แปลกๆ ภาพทางซ้ายเหมือนๆกันแต่ค้นเจอแค่อันบน
แล้วอันนี้ จาก zetsuen no tempest มันไปเจอหน้าอะไรตรงเหนือคิ้วนั่น
ดูที่ค่อนข้างสำเร็จบ้างดีกว่า อย่างอันนี้ มีเท่าไหร่ก็เจอหมดเลย
จาก totori no atelier
เกม angel beats
gakkou gurashi
aoi umi no tristia
อันนี้จาก absolute duo หน้าที่ซ่อนอยู่ข้างหลังก็ยังเจอ
โดยสรุปแล้วก็ใช้งานได้ดีในระดับนึง แม้ว่าจะยังไม่สมบูรณ์ มีใบหน้ามากมายที่ตรวจจับได้ไม่สำเร็จ และมีตรวจโดนสิ่งที่ไม่ใช่ใบหน้ามาด้วยโดยมาแปลกๆไม่ทราบสาเหตุ
อ้างอิง