Thaigaming Network the 10th: evolution of the future.

สมัครสมาชิก | รายชื่อสมาชิก | Social Groups | ปฏิทิน | ค้นหา | ข้อความใหม่วันนี้ | ทำสัญลักษณ์ว่าอ่านแล้ว |




กลับไป   Thaigaming > Thaigaming Contents > HowTo

Comment
 
Share Tutorial Tools แสดงผล
[Hitzuja's Toy] Webcam 2 Cursor ... ใช้เมาส์จนเบื่อ ลองเว็บแคมบ้างดีไหม ?
[Hitzuja's Toy] Webcam 2 Cursor ... ใช้เมาส์จนเบื่อ ลองเว็บแคมบ้างดีไหม ?
เขียนโดย Hitzuja
06 Oct 2009
Lightbulb [Hitzuja's Toy] Webcam 2 Cursor ... ใช้เมาส์จนเบื่อ ลองเว็บแคมบ้างดีไหม ?

Click the image to open in full size.

ยามว่างของนักคอมพิวเตอร์เขาทำอะไรกันครับ บางคนเล่นเกม บางคนสร้างหุ่นยนต์ และอื่นๆ ผมก็ว่างครับเลยทำอะไรมาฝาก นี่ก็เป็นของเล่นอีกชิ้นหนึ่งของผมครับ ผมสังเกตการทำงานของ Wii Remote แล้วก็นึกสับปะดนคิดว่าถ้าเราจะเอา Web Camera มาใช้แบบนี้บ้างจะเป็นยังไง ... แต่ขอบอกนะครับว่าผมไม่เคยเรียนไฟฟ้ามาก่อน ถ้าผมอธิบายผิดหลักไฟฟ้าเมื่อไหร่ ใครผ่านไปผ่านมาก็ช่วยผมทีนะครับ

สรุปว่าโปรแกรมนี้จะใช้แสงจากหลอดตัวส่ง Infrared เป็นวัตถุอ้างอิง และใช้ Webcam มาแทน Mouse โดยรับภาพตำแหน่งแสง Infrared แล้วไปประมวลคิดตำแหน่งของ Cursor ใน Windows ครับ โดยรูปภาพที่ได้จาก Webcam จะถูกฝากไว้ที่ Clipboard ก่อน (ทุกครั้งที่คุณกด Copy ไฟล์หรือข้อความต่างๆ จะมีการมาฝากไว้ที่ Clipboard ก่อนทุกครั้ง ก็เลยเหมือนที่พักข้อมูลชั่วคราว) แล้วโปรแกรมก็จะนำภาพที่ฝากไว้นั้นมาหาตำแหน่งวัตถุท ี่แกน X,Y ครับ

รูปนี้ก็การทำงานแบบง่ายครับ

Click the image to open in full size.
อันนี้สามารถใช้รีโมตทั่วๆไปได้นะครับ แต่ถ้าไม่มีรีโมตก็ต้องทำเองหน่อย ตามนี้ครับ

เตรียมอุปกรณ์ก่อนแล้วกันครับ

Click the image to open in full size.

ตามรูปเลยครับ
  1. Web-Camera ความละเอียดไม่ต้องมากมาย แนะนำว่าอยู่ที่ 320x240 ถึง 640x480 ครับ
  2. หลอดตัวส่ง Infrared (Infrared LED หรือ IR-LED) สัก 2 ตัวเป็นอย่างน้อย ... ขอย้ำว่าไม่ใช่หลอดไฟ LED ธรรมดานะครับ
  3. สายไฟ ไม่ต้องยาวมากเกิน ใช้แค่ 2 สีก็พอครับ แดงกับดำ
  4. Switch 2 แบบ คือ กดเปิด-กดปิด กับ กดค้างเปิด-ปล่อยปิด (อันนี่เรียก Push-on Switch)
  5. รังถ่าน (Battery Holder) ขนาด AA ก้อนเดียวกำลังดี 2 ก้อนได้ แต่อย่าถึง 4 ก้อนขึ้นไปนะครับ
  6. ถ่าน AA ตามร้านขายของชำหรือในห้างทั่วๆไป
  7. [เสริม] Protoboard ถูกๆสักแผง ช่วยให้สะดวกขึ้นในการต่อวงจรไฟฟ้า
  8. [เสริม] Gelatin Filter ชนิดรับเฉพาะแสง Infrared เท่านั้น ... หายากล่ะครับ
  9. [เสริม] Resistor ตัวต้านทาน ช่วยให้หลอด Infrared LED อยู๋ได้นานขึ้น
* [เสริม] หมายถึงว่าจะมีหรือไม่ก็ ตามสบายนะครับ ... แต่ที่อยากให้ใช้คือ Gelatin Filter จริงๆมันจำเป็นมากเลยล่ะ แต่เพราะมันหายากมากมาย ผมเลยบอกว่าไม่สำคัญไปแทน อาจารย์ผมเขาสั่งมาการ Amazon.com ครับ

นี่เป็นส่วน Hardware นะครับ ถ้าถามผมว่า แล้วจะไปหาของแบบนี้ได้ที่ไหน ? ร้านอุปกรณ์ไฟฟ้าทั่วไปครับ ถ้าในห้างก็ อมร. กับ NPE ครับ ... ต่อมาเราก็เชื่อมมันเข้าด้วยกัน

Click the image to open in full size.

ต่อตามรูปนี้นะครับ ... ปัญหาของคนที่ไม่เคยทำอะไรแบบนี้มาก่อนคือ จะทำไงให้สายไฟมันติดกับขั้วหลอดกับ Switch ได้ มันมักจะหลุดบ่อยๆ เพราะเหตุนี้ล่ะครับ ผมถึงแนะนำให้ใช้ Protoboard ไงครับ ที่ผมแนะนำ Protoboard ก็เพราะผมเป็นคนไม่ใช่หัวแร้งครับ ... ถ้าใครใช้หัวแร้งก็ดีครับ มันแน่นอนกว่า Protoboard เยอะ แต่ว่าถอนไม่ได้นะติดแล้วติดเลย

ลืมบอกลักษณะของหลอดตัวส่ง Infrared LED ไปเลยครับ ... โดยปกติแสงจาก IR-LED จะไม่สามารถมองเห็นได้ด้วยตาเปล่า อาจต้องใช้กล้องมือถือ กล้องเว็บแคม ถึงจะเห็นแสงครับ เช่นเดียวกับรีโมตทีวีที่บ้านคุณครับ เวลาคุณกดเปลี่ยนช่องคุณก็ไม่เห็นอะไรออกจากหน่้ารีโ มต แต่ถ้าลองเอากล้องไปดูแล้วคุณจะเห็นไฟกระพริบๆระยิบร ะยับอยู่ในกล้อง เพราะเหตุนี้ไงครับผมถึงเลือก IR-LED มาใช้กับงานนี้โดยเฉพาะ

ต่อวงจรเสร็จแล้วก็ลองทดสอบดูนะครับ ว่าใช้กล้องดูแล้วเห็นแสงจากหลอดไฟหรือไม่ ? ถ้าเห็นก็ถือว่าดีครับ แต่ถ้าไม่เห็นคงต้องเช็คกันหน่อยว่าผิดตรงไหน

เสร็จแล้วครับ ส่วนของ Hardware ... ต่อมาเป็น Software บ้างล่ะ ผมจะใช้ Visual Basic 6 นะครับ (ก็มันง่ายสุดแล้วนิครับ)

อย่างแรกเลย คือ เอากล้องเว็บแคมเชื่อมกับคอมพิวเตอร์ครับ ลง Driver ให้เรียบร้อยนะครับแล้วจะได้ไปเริ่มเขียน VB6 กัน ... ผมศึกษาจากหนังสือเรื่อง "การเขียนโปรแกรม Digital Image Processing ด้วย Visual Basic" เขียนโดยคุณ สิทธิโชค ยอดระยับ ครับ เป็นการสอนการเขียนโปรแกรมเชื่อมต่อกับ Webcam ... เป็นหนังสือเล่มหนึ่งที่เขียนได้น่าสนใจและเข้าใจง่า ยมากครับ ผมจึงได้สอบถามกับตัวคุณ สิทธิโชค เองเลยว่า จะอนุญาติไหมถ้าผมจะนำส่วน Source Code ในหนังสือของคุณมาลงในบทความนี้ คุณ สิทธิโชคเขาเปิดไฟเขียวให้เลยครับ เลยได้ไฟล์ Source Code มาแจกสมาชิกกัน

Download :
http://www.thaigaming.com/downloads-file-10471.htm

เป็น *.zip มานะนะครับ มีทั้งของคุณสิทธิโชคและก็ของผมด้วย ... ถามว่าเอาของผมคนเดียวไม่ได้หรือไง อยากจะบอกว่า Source Code ของผมกึ่งสำเร็จรูปแล้วก็จริง แต่ว่ามันสกปกมาก และถ้าใครอยากเริ่มต้นใหม่เลยก็แนะนำให้เอาของคุณ สิทธิโชคไปต่อยอดครับ

มีส่วนการเชื่อต่อกับ Webcam แล้ว ... ต่อไปเป็นส่วนการควบคุม Cursor Mouse กันครับ
อย่างแรกคือประกาศตัวแปรให้ ตำแหน่ง Cursor ก่อน
code:
Private Declare Function SetCursorPos Lib "user32" (ByVal x As Long, _
ByVal y As Long) As Long                               

Private Declare Sub mouse_event Lib "user32" (ByVal dwFlags As Long, ByVal dx As _
Long, ByVal dy As Long, ByVal cButtons As Long, ByVal dwExtraInfo As Long)        

Private Const LEFTDOWN = &H2
Private Const LEFTUP = &H4
Private Const RIGHTDOWN = &H8
Private Const RIGHTUP = &H10
Private Const MIDDLEDOWN = &H20
ผมประกาศตัวแปรไว้ว่า LEFTDOWN, LEFTUP ก็คือกด LeftClick ครับ LEFTDOWN ก็กดลง LEFTUP ก็ปล่อย สำหรับข้างขาวก็เช่นเดียวกัน

ต่อมาคือสมการที่จะทำให้ภาพวัตถุใน Webcam มีตำแหน่งใกล้เคียงกับ Cursor ครับ
code:
U = N - 16
V = O - 16
        
check

SetCursorPos Abs(invertx - N * scale_x + offset_x), Abs(inverty - O * scale_y + offset_y)
อธิบายสมการหน่อยแล้วกัน ... คิดเองทำเอง กลัวผู้อ่านจะไม่เข้าใจ

Abs(invertx - N * scale_x + offset_x), Abs(inverty - O * scale_y + offset_y)

โดย
invert = ตำแหน่งกลับหัวในแกน X,Y ปรับแต่งส่วนกลับให้ตำแหน่งวัตถุเคลื่อนที่ได้ใกล้เค ียงตำวแหน่ง Cursor
N , O = ค่าแท้ของตำแหน่งวัตถุในแกน X,Y คือ ภาพวัตถุในกล่อง Webcam
scale_ = อัตราส่วนขยายในแกน X,Y ปรับตามขนาดได้เพื่อให้เหมาะสมกับขนาด Resolution
offset_ = ค่าปรับแต่งตำแหน่งในแกน X,Y เพื่อตั้งศูนย์ให้ Cursou ไม่ออกนอกจอได้
Abs คือ ค่าสมบูรณ์ (Absolute) นะครับ เพื่อป้องกันค่าลบ ซึ่งจะทะให้โปรแกรมสับสนได้

ส่วน check ที่อยู่ก่อนหน้าสมการนั้นก็เหมือนเป็นการ Refresh ค่าตลอดเวลาครับ ...

และอีกส่วนที่คุณอาจจะยังไม่คิดจะใช้ในตอนนี้คือควบค ุมให้มีการกด LeftClick RightClick หรือ MiddleClick
code:
Private Sub cmdLC_Click()
    mouse_event LEFTDOWN, 0, 0, 0, 0
    mouse_event LEFTUP, 0, 0, 0, 0
End Sub
Private Sub cmdMC_Click()
    mouse_event MIDDLEDOWN, 0, 0, 0, 0
    mouse_event MIDDLEUP, 0, 0, 0, 0
End Sub
Private Sub cmdRC_Click()
    mouse_event RIGHTDOWN, 0, 0, 0, 0
    mouse_event RIGHTUP, 0, 0, 0, 0
End Sub
ตามที่ประกาศตัวแปลไว้ล่วงหน้านะครับ

เท่านี้ล่ะครับที่ผมทำค้างไว้ ... ถ้าถามผมว่าเอามาแจกทำไมกัน ? ผมเห็นว่าแนวคิดนี้ก็ยังไม่ค่อยมีใครทำมากมายนัก ผมจะวางไว้ตรงนี้ ใครที่มีความคิดสร้างสรรค์แปลกใหม่ ถ้าสนใจมาหยิบไปได้เลยครับ รอใครสักคนมาต่อยอดมัน และอีกอย่างที่น่าจะช่วยนักศึกษาที่ใกล้จะจบบางท่านไ ด้นะครับ ถ้านึก Project จบไม่ออกล่ะก็ ลองรับผลงานชิ้นนี้ไปลองดูได้ครับ Concept นี้คงจะช่วยได้บ้างเล็กน้อยก็ยังดีนะ ... ลองเอา Source Code ของผมไปนั่งมองเล่นๆดูก่อนก็ได้ครับ

ผมลองเขียนบทความแนวนี้เป็นครั้งแรก ถ้ามันอ่านแล้วรู้สึกหงุดหงิดใจต้องขออภัยด้วยนะครับ

ข้อเสียของโปรแกรมนี้ ต้องบอกให้รู้กันก่อนครับว่า โปรแกรมนี้ใช้ Clipboard เป็นที่พักรูปภาพ ดังนั้นอาจจะหน่วงไปสักนิด หรืออาจกระตุกได้

ขอบคุณมากครับ

Credit : คุณ สิทธิโชค ยอดระยับ <sit07th@hotmail.com> ผู้เขียนหนังสือ "การเขียนโปรแกรม Digital Image Processing ด้วย Visual Basic" (สิงหาคม 2550) , อาจารย์ไกรมน มณีศิลป์ ที่ปรึกษาโครงการ และเอื้อเฟื้อ Gelatin Filter , นายเอกพันธ์ ซังแก้ว และ นางสาวเยาวดี กีรติธเนศกุล ผู้ร่วมทดสอบโปรแกรม Hitzuja's W2C , http://www.ex-designz.net/apidetail.asp?api_id=167 , http://forums.devx.com/showthread.php?t=144143 (by Drakenza, mstraf, Alex Stephen, Rune Bivrin) , http://www.webtropy.com/articles/art...f=SetCursorPos , http://social.msdn.microsoft.com/For...3-f7c5c1c4ff0d (by Isty Ahmad) , http://www.eggheadcafe.com/software/...ouseevent.aspx (by Julien Louyot) , http://allapi.mentalis.org/apilist/mouse_event.shtml
Tutorial Tools

tutorials ล่าสุด

สมาชิกจำนวน 6 คน ที่ได้ขอบคุณ Hitzuja สำหรับโพสที่มีประโยชน์นี้
 
ความคิดเห็น: prirya on 08 Oct 2009, 12:46
สุดยอดครับ ดีๆ ผมคิดว่้าถ้่ามันสามารถเอามาใช้กับ Emulator Wii ได้ ที่ใช้เมาส์แทนรีโมทอยู่ตอนนี้ ไม่ต้องซื้อ wii แล้วมั่งอย่างนี้เพราัะเล่นได้เหมือน wii แปะๆ แต่ Emulator Wii ยัง online ไม่ได้แึค่นั้นเอง นี้แหละคนไทยตัวจริง
ตอบพร้อมอ้างอิงข้อความเดิม
  #1 (permalink)  
ความคิดเห็น: koko64 on 08 Oct 2009, 13:18
wiimote ใช้การควบคุม2แบบครับแบบควบคุมทิศทางกับการกดซึ่งใช้ การส่งคลื่นลักษณะสัญญาณต่างกัน ซึ่งผมเคยลองทำแล้วจากการหาข้อมูลจากพันทิพย์ ซึ่งผลปรากฏว่าท้อเลยไปซื้อเครื่องwiiมาเล่นแทน-*- อิอิ
ตอบพร้อมอ้างอิงข้อความเดิม
  #2 (permalink)  
ความคิดเห็น: Hitzuja on 08 Oct 2009, 19:05
โปรแกรมของผมเทียบกับ Wii Remote ของผมก็ตกอับเลยครับ ของผมยังด่อยพัฒนานัก อันนี้เป็น Concept ให้ต่อยอดครับ

ลองคิดอะไรสนุกๆอีกอย่างก็ หาแว่นที่ขาใหญ่ๆสักหน่อยหรือหมวกแข็งๆสักใบ แล้วคุณก็เอาหลอดตัวส่ง Infrared ของผมไปติดที่แว่นก็ได้ครับ ... อันนี้คือจะควบคุม Cursor ด้วยหัวครับ คือ ถ้าหันหน้าซ้าย แสง IR ก็จะไปซ้ายด้วย แล้วภาพที่ได้อยู่ในกล้องนั่นก็จะได้ค่า X,Y ไปคุม Cursor ครับ

ใครทำแบบนี้แล้วลองส่งภาพมาให้ดูบ้างครับ ... อีกอย่างที่ผมแนะนำนะก็ถุงมือแบบหนัง Minority Report ครับ ถุงมือติด IR-LED ไว้ที่นิ้ว
แก้ไขโดย Hitzuja : 08 Oct 2009 เวลา 19:17.
ตอบพร้อมอ้างอิงข้อความเดิม
  #3 (permalink)  
ความคิดเห็น: bankcoolzx on 09 Oct 2009, 18:31
ลองเล่นดูแล้วครับ หงุดหงิด นิดนึง ^^"

เหลือผมยังใช้ไม่เป็นก็ไม่ทราบ ผมก็ "เปิด" แล้วเจ้าจุดสน้ำเงิน มันก็ วิ่งไปทั่วเลย

-0-" พอจะอธิบาย วิธีใช้ได้หรือเปล่าครับ ^^
ตอบพร้อมอ้างอิงข้อความเดิม
  #4 (permalink)  
ความคิดเห็น: Hitzuja on 09 Oct 2009, 19:50
จุดสีน้ำเงินนั้นคือตำแหน่งศูนย์กลางของวัตถุทั้งหมด หมายถึงแสงครับ ถ้ามีแสงมากกว่า 1 จุด โปรแกรมจะคำนวนเอาทุกจุดมารากเส้นคิดพื้นที่และจะหาจ ุดตัดเพื่อให้ได้ศูนย์กลาง ดังนั้น คุณควรจะอยู่ในทีที่ไม่มีแหล่งกำเนิดแสงรบกวนครับ ... แนะนำว่าให้ลองหัน Webcam ชี้เข้ากำแพง แล้วก็ใช้ Pointer หรือปากกา Laser ยิงไปที่กำแพง เพื่อให้เห็นความต่างของระดับแสง โปรแกรมจะทำงานได้สะดวกขึ้นครับ

... อย่างนี้ล่ะครับ ผมไม่ค่อยเขียนโปรแกรมมาก โปรแกรมผมมันจึงใช้ยาก ผมเองยังใช้มันลำบากเลยครับ
ตอบพร้อมอ้างอิงข้อความเดิม
  #5 (permalink)  
ความคิดเห็น: coretack999 on 09 Oct 2009, 22:05
แล้วจะทำให้มันยุ่งยากทำไมเนี่ย คนเราเน้อ - -*
ตอบพร้อมอ้างอิงข้อความเดิม
  #6 (permalink)  
ความคิดเห็น: bankcoolzx on 10 Oct 2009, 18:23
อ้างอิง:
ข้อความของ coretack999 อ่านข้อความ
แล้วจะทำให้มันยุ่งยากทำไมเนี่ย คนเราเน้อ - -*
ไปว่าเขา แล้วนายทำได้ เปล่าครับ
เค้าทำมา ให้ศึกษาต่อยอด นะครับ
ไม่ก็ อย่างผมเอาไป ลองใช้ดู ว่า เป็นอย่างไร

มาพูดอย่างนี้ คนทำหมดกำลังใจกันพอดี คิดดิครับ
ตอบพร้อมอ้างอิงข้อความเดิม
  #7 (permalink)  
ความคิดเห็น: Burnarm on 10 Oct 2009, 20:13
^
^
^
พี่แบ๊งค์นี่เจออะไรดีๆก็จะมาทำให้ได้เลยนะครับ ^^ อยากลองทำเหมือนกัน แต่อุปกรณ์แถวบ้านจะหาไม่ค่อยเจอ -*-
ตอบพร้อมอ้างอิงข้อความเดิม
  #8 (permalink)  
ความคิดเห็น: Hitzuja on 10 Oct 2009, 21:35
อ้างอิง:
ข้อความของ coretack999 อ่านข้อความ
แล้วจะทำให้มันยุ่งยากทำไมเนี่ย คนเราเน้อ - -*
ต้องขอโทษด้วยนะครับ ผมมือใหม่หัดเขียนโปรแกรม ตอนเรียนก็มีแต่ C# กับ Java แต่ภาษาทั้ 2 เรื่องเชื่อมต่อกับ Hardware นั้น ไม่มีแหล่งความรู้ให้ผมศึกษานะ ผมก็เลยต้องหันมาหา VB6 ล่ะครับ

ขอโทษจริงๆครับ
ตอบพร้อมอ้างอิงข้อความเดิม
  #9 (permalink)  
ความคิดเห็น: koko64 on 11 Oct 2009, 09:37
ถ้าจำไม่ผิดเคยเห็นมีคนพัฒณาเอาไปทำโปรเจ็คจนสามารถเ ริ่มใช้กับคนพิการทางตาได้แล้วนี่ครับแต่ไม่เห็นออกข ่าว-*-
ตอบพร้อมอ้างอิงข้อความเดิม
  #10 (permalink)  
ความคิดเห็น: alestadx on 11 Oct 2009, 11:06
น่า สนใจ ดี อะคับ
ตอบพร้อมอ้างอิงข้อความเดิม
  #11 (permalink)  
ความคิดเห็น: Hitzuja on 11 Oct 2009, 19:45
อ้างอิง:
ข้อความของ koko64 อ่านข้อความ
ถ้าจำไม่ผิดเคยเห็นมีคนพัฒณาเอาไปทำโปรเจ็คจนสามารถเ ริ่มใช้กับคนพิการทางตาได้แล้วนี่ครับแต่ไม่เห็นออกข ่าว-*-
ใช่ครับ พอผมทำเสร็จ ก็มีคนที่ฟังข่าวมาบอกผมแบบนี้เหมือนกัน ... ผมไม่รู้ว่าใครทำก่อนนะ ว่าจะลองหามาดูเหมือนกันเผื่อของเขาจะใช้ดีกว่า แต่คงไม่ Free แน่
ตอบพร้อมอ้างอิงข้อความเดิม
  #12 (permalink)  
ความคิดเห็น: coretack999 on 15 Oct 2009, 23:49
เหล้าเก่าในขวดใหม่
ตอบพร้อมอ้างอิงข้อความเดิม
  #13 (permalink)  
ความคิดเห็น: crazykiku on 24 Oct 2009, 15:45
code โหลดไม่ได้อ่ะค่ะ อยากได้มากมายเพราะ กำลังทำโปรเจคทางด้านนี้ค่ะ

แล้วอยากทราบรายละเอียดของโปรแกรมด้วยอ่ะค่ะว่าเป็นย ังงัย
แก้ไขโดย crazykiku : 24 Oct 2009 เวลา 16:13.
ตอบพร้อมอ้างอิงข้อความเดิม
Comment

Tags
webcam vb game
Tutorial Tools
แสดงผล

กฎการส่งข้อความ
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is ใช้ได้
Smilies are ใช้ได้
[IMG] code is ใช้ได้
HTML code is ใช้ได้
Trackbacks are ใช้ได้
Pingbacks are ใช้ได้
Refbacks are งดใช้




Home | News | Event | Article | Howto | Preview | Review | Cheat | Play | Anime | Club | Download | Blog | Group | Service | Forum
Copyright © 2000-2008 Thaigaming Network. All Right Reserved.