ดูเหมือนว่าเนื้องานที่ทำในโมเดล "Simulink" นี้จริง ๆ แล้วถูกดำเนินการโดยฟังก์ชัน MATLAB ของคุณ คำตอบของคำถามนี้จะขึ้นอยู่กับว่าฟังก์ชันนั้นกำลังทำอะไรอยู่เป็นส่วนใหญ่ โดยเฉพาะอย่างยิ่งอินพุตที่คาดหวังของ vidfunc
คืออะไร และเอาต์พุตของฟังก์ชันนี้คืออะไร ฉันสงสัยว่าอาจจำเป็นต้องแก้ไขฟังก์ชันนี้เพื่อให้พอดีกับโมเดลของคุณ
ในการแก้ไขข้อบกพร่องโมเดลของคุณ คุณควรพิจารณาว่าสัญญาณเอาท์พุตจากแต่ละบล็อกคืออะไร ในแต่ละขั้นตอน บล็อก From Multimedia File
ของคุณจะแสดงเฟรมภาพเดียว ซึ่งเป็นไปตาม doc ดูเหมือนว่าจะมีโครงสร้างเป็น
สัญญาณวิดีโอสี M-by-N-by-P โดยที่ P คือจำนวนระนาบสี
เมื่อเคลื่อนไปทางท้ายน้ำ ต่อไปเราจะไปที่บล็อก Color Space Conversion
ซึ่งในกรณีนี้ดูเหมือนว่ามีแนวโน้มว่าจะส่งออกกรอบภาพในรูปแบบของเมทริกซ์ M-by-N (โดยที่แต่ละองค์ประกอบของเมทริกซ์สอดคล้องกับความเข้มของภาพในขณะนั้น) พิกเซล)
ตอนนี้เรามาถึงส่วนที่น่าสนใจ -- บล็อก MATLAB Fcn
ดังที่เราเพิ่งเห็น อินพุตของบล็อกนี้จะเป็นเมทริกซ์ M-by-N แทนเฟรมรูปภาพเดียว เมื่อคุณดูในกล่องโต้ตอบพารามิเตอร์สำหรับบล็อก MATLAB Fcn
ข้อมูลเข้าของบล็อกนี้จะแสดงด้วยตัวแปร u
ดังนั้น หากต้องการดำเนินการฟังก์ชัน vidfunc
บนกรอบรูปภาพที่ป้อนเข้าบล็อกนี้ คุณเพียงแค่ป้อน vidfunc(u)
สำหรับ ฟังก์ชัน MATLAB ของคุณ
ตอนนี้ จากอินพุตที่ไปที่บล็อก MATLAB Fcn
และความจริงที่ว่าคุณมีบล็อก Video Viewer ที่เชื่อมต่อกับเอาต์พุต vidfunc
ควรได้รับการจัดโครงสร้างให้ทำงานบนเฟรมรูปภาพเดียวเป็นอินพุตและเอาต์พุตเฟรมรูปภาพเดียวอีกเฟรมหนึ่ง หาก vidfunc
ไม่ได้มีโครงสร้างในลักษณะนี้ คุณจะต้องแก้ไข (หรือเพียงนำฟังก์ชันเดิมไปใช้ใหม่โดยใช้บล็อก Simulink)
ดังที่กล่าวไว้ สมมติว่า vidfunc
กำลังส่งคืนเมทริกซ์ M-by-N ซึ่งเป็นตัวแทนของเฟรมภาพที่ประมวลผล คุณจะต้องตั้งค่าพารามิเตอร์ ขนาดเอาต์พุต สำหรับบล็อก MATLAB Fcn
ของคุณเป็น -1
เพื่อระบุว่าเอาต์พุตจะมีขนาดเดียวกันกับอินพุต นอกจากนี้ (ตามที่ระบุไว้ใน เอกสาร) คุณจะต้องแน่ใจว่า ยุบผลลัพธ์ 2 มิติเป็น 1 มิติ ไม่เลือก ไม่เช่นนั้นเอาต์พุตรูปภาพของคุณจะอยู่ในรูปแบบของเวกเตอร์ยาวหนึ่งตัว แทนที่จะเป็นเมทริกซ์ M-by-N
โดยมีเงื่อนไขว่า vidfunc
มีโครงสร้างที่ถูกต้อง สิ่งนี้น่าจะแก้ปัญหาของคุณได้
หมายเหตุ: เพื่อให้ชีวิตของคุณง่ายขึ้นมาก ฉันขอแนะนำอย่างยิ่งให้แสดงประเภทข้อมูลสัญญาณและขนาดในโมเดล Simulink ของคุณ สิ่งนี้สามารถช่วยหลีกเลี่ยงความสับสนได้มาก เอกสารนี้อธิบายวิธีการดำเนินการอย่างชัดเจน นี้.
--อัปเดต--
หลังจากดูโค้ดของคุณแล้ว สิ่งนี้เป็นการยืนยันความสงสัยของฉันว่าอินพุต/เอาต์พุตของ vidfunc
ไม่สอดคล้องกับสิ่งที่โมเดล Simulink ของคุณคาดหวัง วิธีที่คุณดำเนินการนั้นขึ้นอยู่กับข้อจำกัดในการออกแบบของคุณเองและสิ่งที่คุณต้องการจากระบบนี้ โดยพื้นฐานแล้ว โมเดล Simulink และฟังก์ชัน MATLAB ของคุณไม่ตรงกัน...อันไหนถูกต้อง ฉันจะให้ความคิดทั่วไปโดยอิงจากการเดาที่ดีที่สุดของฉันเกี่ยวกับสิ่งที่คุณกำลังมองหา
ขั้นแรก Simulink กำลังส่งรูปภาพ (ในรูปแบบของเมทริกซ์ M-by-N) ไปยัง vidfunc
ซึ่งหมายความว่า vidfunc
ไม่จำเป็นต้องโหลดรูปภาพที่จุดเริ่มต้นของโค้ดอีกต่อไป ดังนั้นฉันเชื่อว่าคุณสามารถอัปเดตโค้ดสองสามบรรทัดแรกให้เป็นดังนี้:
function h=vidfunc(a)
BW = edge(a,'sobel'); %sobel edge detection
เห็นว่าตอนนี้ vidfunc
กำลังถ่ายภาพจริง (ไม่ใช่ชื่อไฟล์ที่มีภาพ) เป็นอินพุต โดยพื้นฐานแล้ว คุณกำลังลบบรรทัด a=imread(u);
และกระโดดเข้าสู่การประมวลผล a
ปัญหาอื่นคือผลลัพธ์ของ vidfunc
Simulink คาดหวังว่าเอาต์พุตจะเป็นรูปภาพ แต่ไม่ใช่ ฉันไม่แน่ใจ 100% ว่า h
ควรเป็นอะไรในโค้ดนี้ (เมื่อฉันดูโค้ดของคุณครั้งแรก ฉันคิดว่าสิ่งเหล่านี้จัดการกับวัตถุบรรทัด แต่ดูเหมือนจะไม่เป็นเช่นนั้น) ดูเหมือนว่าจะเป็นพิกัด y ของจุดสิ้นสุดของหนึ่งในเส้นสำคัญ อย่างไรก็ตาม ไม่ใช่สิ่งที่โมเดล Simulink ของคุณคาดหวัง อันนี้ไม่ตรงไปตรงมาในการแก้ไข อาจเป็นไปได้ว่าคุณอาจลองใช้ getframe เพื่อดึงภาพจากพล็อตของ เส้นของคุณ
ฉันรู้สึกว่าคำแนะนำที่ดีที่สุดที่ฉันสามารถให้คุณได้คือ ยกเลิกฟังก์ชัน MATLAB และปรับใช้ทุกอย่างใน Simulink ฉันคิดว่านี่จะง่ายกว่าการพยายามให้ vidfunc
เล่นกับโมเดลของคุณอย่างดี vidfunc
จริงๆ แล้วไม่ได้มีโค้ดมากมายขนาดนั้น ดังนั้นจึงไม่น่าจะยากเกินไปสำหรับคุณ ข้อดีอีกประการหนึ่งคือ เมื่อสิ้นสุดกระบวนการนี้ คุณจะมีโมเดล Simulink ที่ดีซึ่งแสดงขั้นตอนการประมวลผลภาพทั้งหมดที่คุณกำลังดำเนินการอย่างชัดเจน
ฉันเชื่อว่าการประมวลผลภาพทั้งหมดที่คุณกำลังทำด้วยฟังก์ชัน MATLAB ก็สามารถทำได้ด้วยบล็อก Simulink (ดูส่วน Simulink Blocks ของ doc)
ขอให้โชคดี.
person
grungetta
schedule
29.09.2012