การใช้ C# ร่วมกับ Emgu OpenCV เพื่อทำการติดต่อกล้อง
การใช้ C# ร่วมกับ Emgu OpenCV เพื่อทำการติดต่อกล้อง หากท่านผู้อ่านยังมองภาพรวมของการใช้งาน C# ร่วมกับ Emgu OpenCV ไม่ออก หรือไม่มีพื้นฐานการใช้งาน C# แบบ Window Application ผมขอแนะนำให้อ่านที่นี่ก่อน (หากยังไม่ได้ติอตั้ง Emgu จะต้องอ่านที่นี่ และทำตามอย่างเคร่งครัด เป็นอันดับแรก)
1. เริ่มจากการออกแบบรูปร่างหน้าตาของ GUI โดยการนำ pictureBox, button และ timer มาวางบนฟอร์ม จากนั้นกำหนดตำแหน่งและขนาดตามความต้องการ ดังนี้
2. ทำการกำหนด Time Interval ของ timer1 ให้มีค่าเท่ากับ 50mS (หรือค่าอื่นๆ ตามความต้องการ)
3. ให้ดับเบิลคลิกที่ button1 ตัว IDE จะสร้างฟังก์ชั่นของ button1 ให้โดยอัตโนมัติดังนี้
Code: (C-Sharp)
- private void button1_Click(object sender, EventArgs e){
- }
4. กลับไปที่หน้าต่างออกแบบ GUI (Form1.cs [design]) อีกครั้ง ให้ดับเบิลคลิกที่ button1 ตัว IDE จะสร้างฟังก์ชั่นของ button2 ให้โดยอัตโนมัติเช่นกัน ดังนี้
Code: (C-Sharp)
- private void button2_Click(object sender, EventArgs e){
- }
5. ต่อไปให้ทำกับ timer1 เหมือนกับที่ได้ทำไปในส่วนของ button1 และ button2 จะได้ฟังก์ชั่นของ timer1 ดังนี้
Code: (C-Sharp)
- private void timer1_Tick(object sender, EventArgs e){
- }
6. ต่อไปทำการ Add reference เข้ามาใน Project ขั้นตอนนี้ทำอย่างไรให้ศึกษาที่นี่
7. เริ่มเขียนโปรแกรม เริ่มจากทำการบอกตัว C# ว่าเราต้องการใช้ความสามารถของ Emgu โดยการเขียนโปรแกรมส่วนนี้ไว้ด้านบน (ให้วางต่อจาก using xxx ที่มีอยู่ก่อนหน้า)
Code: (C-Sharp)
- using Emgu.CV;
- using Emgu.CV.GPU;
- using Emgu.CV.UI;
- using Emgu.CV.Structure;
- using Emgu.CV.CvEnum;
- using Emgu.Util;
8. ทำการประกาศตัวแปรสำหรับใช้ในการอ้างอิงถึงกล้อง
Code: (C-Sharp)
- namespace Camera{
- public partial class Form1 : Form{
- Emgu.CV.Capture capture; // <---- เพิ่มบรรทัดนี้ลงไป (บรรทัดอื่นๆ คือส่วนที่ IDE สร้างไว้ให้ก่อนหน้า)
- public Form1(){
- InitializeComponent();
- }
9. เขียนโปรแกรมในส้วนของฟังก์ชัน Form1_Load
Code: (C-Sharp)
- private void Form1_Load(object sender, EventArgs e){
- capture = new Emgu.CV.Capture();
- if (capture == null){ // หากไม่สามารถเชื่มต่อกล้องได้ให้ทำการ...
- MessageBox.Show("Cannot connect to the device"); // แสดงข้อความให้ทราบ และ...
- Application.Exit(); // ออกจากโปรแกรม
- }
- button1_Click(null, null); // หากเชื่มต่อกล้องได้ให้เรียกฟังก์ชั่น button1_Click
- }
10.เขียนโปรแกรมในส่วนของ button1_Click, button2_Click และ timer1_Tick ดังนี้
Code: (C-Sharp)
- private void button1_Click(object sender, EventArgs e){
- timer1.Start(); // ให้ timer1 ทำงาน
- button1.Enabled = false;
- button2.Enabled = true;
- }
- private void button2_Click(object sender, EventArgs e){
- timer1.Stop(); // ให้ timer1 หยุดทำงาน
- button1.Enabled = true;
- button2.Enabled = false;
- }
- private void timer1_Tick(object sender, EventArgs e){
- ProcessFrame(); // เมื่อ timer1 นับเวลาครบตามที่กำหนด (50mS) จะเรียกฟังก์ชั่นนี้
- }
11. สร้างฟังก์ชั่นใหม่ชื่อ ProcessFrame() มีรายละอียดดังนี้
Code: (C-Sharp)
- private void ProcessFrame(){
- Emgu.CV.Image<Bgr, Byte> cameraImage = capture.QueryFrame(); // อ่านข้อมูลภาพจากกล้องมา 1 เฟรม
- if (cameraImage != null) // ถ้าอ่านข้อมูลภาพได้ให้...
- pictureBox1.Image = cameraImage.ToBitmap(); แสดงผลภาพที่ pictureBox1
- else{ // ถ้าอ่านข้อมูลภาพไม่ได้ให้...
- button2_Click(null, null); // เรียก button2_Click() และ
- MessageBox.Show("Cannot capture an image"); // แสดงผลข้อความให้ทราบ ตามด้วย...
- Application.Exit(); // ออกจากโปรแกรม
- }
- }
12. สุดท้าย ให้ทำการ Build และ Run ก็จะเห็นภาพหล่อๆ สวยๆ ปรากฎขึ้นมาให้เห็น
Comments
Post a Comment