อัลกอริทึมสำหรับการติดตามวัตถุง่ายๆ หลายอย่างแบบเรียลไทม์

ฉันกำลังพยายามเขียนโปรแกรมเพื่อติดตามตำแหน่งสัมพัทธ์ของวัตถุบางอย่างในขณะที่ฉันกำลังเล่นเกมยอดนิยมอย่าง League of Legends โดยเฉพาะ ฉันต้องการติดตามพิกัดหน้าจอ x,y ของ "มินเนี่ยน" ใดๆ ที่อยู่บนหน้าจอในปัจจุบัน ("มินเนี่ยน" คือกลุ่มเล็กๆ ที่อยู่ตรงกลางภาพ โดยมีแถบเล็กๆ สีแดงและเขียวอยู่เหนือหัว)

ขณะนี้ฉันกำลังใช้คลาส Java Robot เพื่อส่งภาพหน้าจอไปยังโปรแกรมของฉันในขณะที่ฉันกำลังเล่น และกำลังพยายามค้นหาอัลกอริธึมที่ดีที่สุดในการค้นหามินเนี่ยนและติดตามพวกมันตราบเท่าที่พวกมันยังคงอยู่บนหน้าจอ

ความคิดปัจจุบันของฉันคือการใช้โครงข่ายประสาทเทียมเพื่อระบุและค้นหามินเนี่ยนตามแถบสีที่อยู่ด้านบน อย่างไรก็ตาม ฉันจะต้องระบุตัวตนใหม่และค้นหามินเนี่ยนในทุกเฟรมใหม่ และดูเหมือนว่าจะมีราคาแพงในการคำนวณหากฉันต้องการทำสิ่งนี้แบบเรียลไทม์ (~10-60 fps)

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

ดังนั้นมีอัลกอริธึมที่นำไปใช้งานได้ง่ายเพื่อให้งานนี้สำเร็จหรือไม่?

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




คำตอบ (2)


เนื่องจากนี่คือเกมคอมพิวเตอร์ ฉันคิดว่าสีของแท่งควรจะคงที่ นั่นอาจไม่จริงก็ต่อเมื่อการส่องสว่างแบบไดนามิกส่งผลต่อแถบสุขภาพ ซึ่งไม่น่าเป็นไปได้อย่างยิ่ง

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

ฉันรู้ว่าคำตอบของฉันไม่เกี่ยวข้องกับวิดีโอ แต่การดำเนินการควรเรียบง่ายและควรจะรวดเร็วมาก

สำหรับการติดตาม เพียงหาแต่ละจุดที่ใกล้เคียงที่สุดในเฟรมถัดไป

เนื่องจากตำแหน่งของ HUD นั้นคงที่ จึงไม่น่าจะมีปัญหาในการลบออก รูปภาพที่ไม่มี HUD

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

  1. หน่วยจะต้องมีสุขภาพที่ดี (กว้างอย่างน้อย 40 พิกเซล)
  2. แถบไม่ทับซ้อนกัน

 function FindUnits()
    x = double(imread('c:\1.jpg'));
    green = cat(3,149,194,151); 

    diff = abs(x - repmat(green,[size(x,1) size(x,2)]));
    diff =  mean(diff,3);
    diff = logical(diff < 30);
    diff = imopen(diff,strel('square',1));

    rp = regionprops(diff,'Centroid','MajorAxisLength','MinorAxisLength','Orientation');
    long = [rp.MajorAxisLength]./[rp.MinorAxisLength];
    rp( long < 20) = [];

    xy = [rp.Centroid];
    x = xy(1:2:end);
    y = xy(2:2:end);
    figure;imshow('c:\1.jpg');hold on ;scatter(x,y,'g');
end

และผลลัพธ์:

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

person Andrey Rubshtein    schedule 02.03.2012
comment
เพิ่มตัวกรองคาลมานอย่างง่ายเพื่อช่วยติดตามหน่วยจากเฟรมหนึ่งไปอีกเฟรม และคุณก็พร้อมแล้ว - person jilles de wit; 02.03.2012

คุณควรใช้โมเดลที่มีโครงสร้างแบบไดนามิกอยู่ในนั้น เพื่อวัตถุประสงค์ในการติดตามวัตถุของคุณ โมเดล Markov ที่ซ่อนอยู่ (HMM) (หรือโดยทั่วไป Dynamic Bayesian Networks) มีความเหมาะสมเป็นอย่างยิ่ง คุณสามารถค้นหาแหล่งข้อมูลมากมายบน HMM ทางออนไลน์ อย่างไรก็ตามปัญหาที่คุณกำลังเผชิญนั้นขึ้นอยู่กับรุ่นระบบของคุณ หากไดนามิกของระบบของคุณสามารถแสดงเป็นแบบจำลองเกาส์-มาร์คอฟเชิงเส้นได้อย่างง่ายดาย ตัวกรองคาลมาน ธรรมดาจะ ทำได้ดี อย่างไรก็ตาม ในกรณีของไดนามิกที่ไม่ใช่แบบเกาส์เซียนแบบไม่เชิงเส้น คุณควรใช้ การกรองอนุภาค ซึ่งเป็นมอนเตแบบลำดับ วิธีการของคาร์โล ทั้งตัวกรองคาลมานและตัวกรองอนุภาคเป็นวิธีการตามลำดับ ดังนั้นคุณจะใช้ผลลัพธ์ที่คุณมีในขั้นตอนปัจจุบันเพื่อให้ได้ผลลัพธ์ในขั้นตอนถัดไป ฉันขอแนะนำให้คุณตรวจสอบบทช่วยสอนและเอกสารออนไลน์เกี่ยวกับการติดตามวัตถุหลายรายการผ่านตัวกรองอนุภาค เท่าที่ฉันกังวล ปัญหาหลักที่คุณจะต้องเจอคือ จำนวนวัตถุที่คุณอาจต้องการติดตาม เนื่องจากคุณจะไม่ทราบจำนวนวัตถุที่คุณต้องการติดตามและวัตถุที่คุณกำลังติดตามสามารถหายไปได้ เอ่อ (คุณอาจจะฆ่าเด็กพวกนั้นหรือพวกเขาอาจแค่ออกจากหน้าจอก็ได้) หรือคนอื่น ๆ ก็สามารถเข้าไปในหน้าจอได้ หวังว่านี่จะช่วยได้

person jkt    schedule 02.03.2012