กำหนดเป้าหมายอยู่ในเป้าหมายอื่น

ฉันใช้ Vuforia เพื่อจดจำเป้าหมายผ่านกล้อง

ฉันต้องไปถึงจุดหมาย: เป้าหมายเล็กและเป้าหมายที่ใหญ่กว่ามาก ฉันต้องกำหนดว่าเป้าหมายที่เล็กกว่านั้นอยู่ภายในเป้าหมายที่ใหญ่กว่า

ฉันมองเห็นเครื่องหมายสองอันได้ทันเวลาแล้ว ฉันสามารถรับเมทริกซ์ 4x4 ของเป้าหมายได้ แนวคิดประการหนึ่งคือการฉายภาพ 4x4 ไปยังระนาบ z0x ไปยังทั้งสองเป้าหมาย และมากกว่าที่จะกำหนดว่าเมทริกซ์การฉายภาพหนึ่งมีอันที่สองหรือไม่ (แต่ฉันไม่รู้ว่าต้องทำอย่างไร)

รหัสบางอย่างที่ฉันได้รับเมทริกซ์

- (void) renderFrameWithState:(const Vuforia::State&)state projectMatrix:(Vuforia::Matrix44F&)projectionMatrix {
//some opengl initializations
 for (int i = 0; i < state.getNumTrackableResults(); ++i) {
        // Get the trackable
        const Vuforia::TrackableResult* result = state.getTrackableResult(i);
        const Vuforia::Trackable& trackable = result->getTrackable();

        Vuforia::Matrix44F modelViewMatrix = Vuforia::Tool::convertPose2GLMatrix(result->getPose()); //getPose() returns 3x4 matrix
}
}

person DenFav    schedule 05.04.2017    source แหล่งที่มา


คำตอบ (1)


การฉายเมทริกซ์ไปยังระนาบเดียวกันนั้นเป็นเรื่องง่าย - คุณมีโค้ดนี้อยู่แล้วหากคุณมีตัวอย่าง Vuforia ที่ใช้งานได้ มันเป็นสิ่งนี้:

SampleUtils::multiplyMatrix(&projectionMatrix.data[0],
                            &modelViewMatrix.data[0] ,
                            &modelViewProjection.data[0]);

อย่างไรก็ตาม ฉันไม่คิดว่าคุณจำเป็นต้องฉายภาพมันจริงๆ คุณสามารถเปรียบเทียบเมทริกซ์สองตัวที่คุณได้รับจาก Vuforia ได้

วิธีหนึ่งในการตรวจสอบว่าเมทริกซ์ตัวหนึ่งอยู่ภายในอีกเมทริกซ์หนึ่งหรือไม่ (ไม่ถูกต้อง 100% แต่ค่อนข้างง่าย) คือการวัดจากจุดกึ่งกลางและขนาด ความหมาย - ใช้จุดศูนย์กลางของจุดหนึ่ง (ค่าตำแหน่ง x และ y ในเมทริกซ์คือ modelViewMatrix.data[12] และ modelViewMatrix.data[13] ตามลำดับ) และดูว่าจุดนั้นหลังจากเพิ่มความกว้างและความสูงอยู่ภายในหรือไม่ เส้นขอบของเมทริกซ์ตัวที่สอง (อีกครั้งโดยจุดศูนย์กลางเมทริกซ์ตัวที่สอง ความกว้าง และความสูง)

person yakobom    schedule 06.04.2017
comment
ดังนั้นฉันควร state.getTrackableResult(i) สำหรับแต่ละเป้าหมาย แปลง Pose2GLMatrix(result->getPose()) เพื่อรับเมทริกซ์ 4x4 และทำการคำนวณทั้งหมดที่คุณอธิบายไว้ข้างต้นด้วยเมทริกซ์ 4x4 หรือไม่ ตามที่ฉันเข้าใจ มันไม่คำนึงถึงเครื่องบิน และหากเป้าหมายที่เล็กกว่าอยู่เหนือเป้าหมายที่สองเป็นระยะทาง 10 ซม. ก็อาจบอกฉันว่าเป้าหมายที่เล็กกว่าอยู่ในเป้าหมายที่สอง ถูกต้องหรือไม่ - person DenFav; 06.04.2017
comment
ฉันไม่คิดว่าสิ่งนี้ถูกต้อง แต่คุณสามารถใช้วิธีที่ฉันเสนอให้กับเมทริกซ์ที่ฉายไว้ได้เช่นกัน อย่างไรก็ตาม ฉันคิดว่าคุณควรลองวิธีใดวิธีหนึ่งหรือทั้งสองวิธี มันควรจะค่อนข้างง่าย หากช่วยได้ ดูคำอธิบายบางอย่างเกี่ยวกับเมทริกซ์ได้ที่นี่: stackoverflow.com/questions/29061257/ - person yakobom; 06.04.2017
comment
คุณช่วยกรุณาให้ลิงค์ไปยังคำอธิบายเมทริกซ์ 4x4 ได้ไหม ฉันหาไม่เจอ ฉันต้องการให้แน่ใจว่า 12 และ 13 เป็นศูนย์กลางและต้องการทราบค่าอื่น ๆ เพื่อใช้อย่างใดอย่างหนึ่ง (อาจมีประโยชน์) - person DenFav; 06.04.2017
comment
แน่นอน แต่ใช่ 12, 13 และ 14 คือ x, y และ z ของจุดศูนย์กลาง นี่เป็นคำอธิบายทั่วไป: opengl-tutorial.org/beginners-tutorials /tutorial-3-เมทริกซ์. วิธีสร้างเมทริกซ์นั้นขึ้นอยู่กับการใช้งาน และคุณกำลังใช้ Vuforia's แต่ฉันขอแนะนำให้ลองสัมผัสประสบการณ์ด้วยตัวคุณเอง หากคุณไม่แน่ใจ ให้เพิ่มตัวเลข (200?) matrix.data[12] ของคุณแล้วดูผลลัพธ์... วิธีการลงมือปฏิบัติจริงนี้จะทำให้คุณได้ผลลัพธ์ที่คุณต้องการเร็วขึ้น - person yakobom; 06.04.2017
comment
ขอบคุณ ฉันตรวจสอบลิงก์แล้ว แต่ยังมีคำถามอีกข้อหนึ่ง - จะทำให้ความกว้างและความสูงใน Vuforia ได้อย่างไร ฉันควรใช้คณิตศาสตร์เมทริกซ์ด้วยหรือไม่ - person DenFav; 06.04.2017
comment
อย่างที่ฉันบอกว่าลิงก์เป็นเรื่องทั่วไป หากคุณดูที่ส่วนเมทริกซ์การแปล คุณจะเห็นว่าคอลัมน์สุดท้าย (ซึ่งจริงๆ แล้วคือเซลล์ 12, 13, 14, 15) มี x, y และ z อยู่ที่เซลล์ 12, 13, 14 คุณสามารถทราบความกว้างและ ความสูงจาก Vuforia 'getSize' api บน imageTarget ตอนนี้คุณควรมีสิ่งที่คุณต้องการเพื่อลองวิธีแก้ปัญหาเพื่อนของฉัน - person yakobom; 06.04.2017
comment
ให้เราสนทนาต่อในการแชท - person DenFav; 06.04.2017