- 76 ความคิดเห็น
Color Detection part 2: ตรวจจับวัตถุสีเหลือง (yellow object detection)
กลับมาอีกครั้งแล้วครับกับ lab9 วันนี้ผมจะนำเสนอ part2 ซึ่งเป็นเรื่อง
การตรวจจับวัตถุสีเหลือง (yellow object detection) ภาพรวมของ
part2 เราจะนำเสนอวิธีการตรวจจับวัตถุที่เป็นสีเหลือง และจะใช้ contour
ในการหาตำแหน่งของวัตถุนั้นนะครับ ขั้นสุดท้ายเราจะตีกรอบรอบวัตถุที่โปรแกรมตรวจจับได้นะครับ
ขั้นแรก : รับ input
จากกล้องวีดีโอ และแปลงภาพ input จาก RGB
เป็น HSV
cameraImage =
capture.QueryFrame(); //input image
Image<Hsv, Byte> hsvImage =
cameraImage.Convert<Hsv,Byte>(); //Convert RGB > HSV.
ขั้นที่สอง
: ใช้ cvInrange()
ในการแยกวัตถุที่มีสีเหลืองออกจาก background และกำจัด
noise ด้วย cvErode()
//Create result image.
Image<Gray, Byte> ResultImage = new Image<Gray, Byte>(hsvImage.Width, hsvImage.Height);
Image<Gray, Byte> ResultImage = new Image<Gray, Byte>(hsvImage.Width, hsvImage.Height);
//Define low range(16).
Image<Gray, Byte> IlowCh0 = new Image<Gray, Byte>(hsvImage.Width, hsvImage.Height, new Gray(16));
//Define hight range(30).
Image<Gray, Byte> IHiCh0 = new Image<Gray, Byte>(hsvImage.Width, hsvImage.Height, new Gray(30));
//Use cvinrange() method and hsvImage[0] = hsvimage channel 0
CvInvoke.cvInRange(hsvImage[0], IlowCh0, IHiCh0, ResultImage);
CvInvoke.cvErode(ResultImage, ResultImage, (IntPtr)null, 2); //Noise reduce.
Image<Gray, Byte> imgForContour = new Image<Gray, byte>(ResultImage.Width, ResultImage.Height);
CvInvoke.cvCopy(ResultImage, imgForContour, System.IntPtr.Zero); //Copy image for contoure
ขั้นที่สาม: ใช้ contour ในการหาตำแหน่ง และตีกรอบให้กับ contours ขั้นตอนในการใช้ contour มี 3 ขั้นนะครับ จะได้ไม่สับสน
สาม จุด หนึ่ง : จองเมมและสร้างตัวแปร
IntPtr storage = CvInvoke.cvCreateMemStorage(0);IntPtr contour = new IntPtr();
สาม จุด สอง: ใช้ cvfindContours(); ในการหา contours output จะถูกเก็บไว้ใน seq
CvInvoke.cvFindContours(imgForContour, storage, ref contour, System.Runtime.InteropServices.Marshal.SizeOf(typeof(MCvContour)), Emgu.CV.CvEnum.RETR_TYPE.CV_RETR_EXTERNAL, Emgu.CV.CvEnum.CHAIN_APPROX_METHOD.CV_CHAIN_APPROX_NONE, new Point(0, 0));Seq<Point> seq = new Seq<Point>(contour, null);
สาม จุด สาม : loop เพื่อดูว่า มี contours ทั้งหมดกี่อัน และ get ค่าตำแหน่งของ contours นั้นมาด้วย
for (; seq != null && seq.Ptr.ToInt32() != 0; seq = seq.HNext)
{
// get ค่า X,Y width,Height ของ contours
Rectangle bndRec = CvInvoke.cvBoundingRect(seq, 1);
// คำนวณหาพื้นที่ของ contours
double areaC = CvInvoke.cvContourArea(seq, MCvSlice.WholeSeq, 1) *-1;
if (areaC > 200) // หลีกเลี่ยง noise เล็กๆ โดยการดูขนาดของ contours
{
// วาดกรอบสี่เหลี่ยมให้กับวัตถุ
CvInvoke.cvRectangle(cameraImage, new Point(bndRec.X, bndRec.Y), new Point(bndRec.X + bndRec.Width, bndRec.Y + bndRec.Height), new MCvScalar(0, 0, 255), 2, LINE_TYPE.CV_AA, 0);
}
}
Output
76 ความคิดเห็น
ถ้าจะตรวจจับวัตถุ สีแดง เขียว น้ำเงิน ต้องเปลี่ยนอะไรตรงไหนบ้างครับ
//Define low range(16).
Image IlowCh0 = new Image(hsvImage.Width, hsvImage.Height, new Gray(16));
//Define hight range(30).
Image IHiCh0 = new Image(hsvImage.Width, hsvImage.Height, new Gray(30));
เปลี่ยน low rang(16) กับ high rang(30) เป็นให้อยู่ใน rang สีแดง เขียว น้ำเงิน
สีแดงน่าจะอยู่ 0 -10 กว่าๆ มั้ง จำไม่ได้ ลองปรับดู
สีเขียว 60-80 น้ำเงิน 160 กว่ามั้ง ลองปรับๆ ดูครับ ดูค่าสีได้ใน paint ในส่วนของค่า HUE ครับ
ขอบคุณครับ
ถ้าจะให้มันอยู่ในโปรแกรมเดียวกันก็ใส่โค้ดส่วนนี้
/Define low range(16).
Image IlowCh0 = new Image(hsvImage.Width, hsvImage.Height, new Gray(16));
//Define hight range(30).
Image IHiCh0 = new Image(hsvImage.Width, hsvImage.Height, new Gray(30));
ไป3อันใช่มั้ยครับ
ครับ
ถ้าจะให้มันส่งค่าผ่านพอร์ต RS-232 ไปบอร์ตไมโคร ว่าใช่ช่วงสีนี้รึเปล่า ต้องทำยังไงอ่าครับ
ในโปรแกรมคุณสามารถตรวจว่า วัตถุอยู่ในช่วงสีนี้หรือเปล่าได้หรือยังครับ ถ้าทำได้แล้ว ต่อไปคุณก็เขียนโปรแกรมให้ติดต่อกับบอร์ดไมโครครับ ซึ่งในส่วนนี้ผมก็ไม่เคยเขียนเหมือนกันครับ ^_^
โปแกรมจับสีได้ตามช่วงแล้วครับ มีวิธีว่าเมื่อเห็นวัตถุช่วงสีนี้แล้วให้เป็นตัวแปร a มั้ยครับ
if (areaC > 200) // หลีกเลี่ยง noise เล็กๆ โดยการดูขนาดของ contours
{
// เจอวัตถุในช่วงที่กำหนด สร้างตัวแปร a ได้เลยครับ
}
ถ้าจะให้นับพิกเซลของวัตถุในภาพจะทำได้มั๊ยครับบ
@Pakapon ทำได้ครับ มีหลายวิธีด้วยครับ
วิธีแรก ภายในกรอบสีแดง ใช้ loop วนนับจำนวนจุดที่เป็นสีขาว
วิธีที่สอง ใช้ cvContourArea ในการหาพื้นที่ของวัตถุ ครับ
วิธีที่สาม ใช้ความกว้าง * ความสูง ของกรอบสีแดงแทนครับ (จำนวน pixel ที่ได้จะไม่เท่ากับ จำนวน pixel จริงของวัตถุ แต่วิธีนี้จะค่อนข้างง่าย และไม่ยุ่งยาก ) double area = bndRec.Width * bndRec.Heigh
ลองดูครับ ^_^
ขอบคุนครับบ ^^
มีหนังสือให้ศึกษารึป่าวครับ หรือว่าต้องคิดฟังก์ชั่นขึ้นมาเอง
หนังสือมีแต่ภาษาอังกฤษครับ ภาษาไทยไม่เคยเจอนะ TT ลอง search ในกูเกิ้ลดูครับ
พอจะมี keyword มั๊ยครับ
ลองอ่านหนังสือ Opencv เล่มนี้ดูครับ
http://www.cse.iitk.ac.in/users/vision/dipakmj/papers/OReilly%20Learning%20OpenCV.pdf
http://www-2.dc.uba.ar/materias/visrob/data/downloads/otros/OpenCV_2_Computer_Vision_Application_Programming_Cookbook.pdf
ส่วนผมศึกษาวิธีใช้ไลบราลี่ใน emgucv ในเว็บนี้ครับ http://www.emgu.com/wiki/files/2.3.0/document/Index.html
ลองดูครับ ^_^
ขอบคุนครับ
ผมลองทำตามโค้ดนี้มันขึ้นว่า The name 'imgForContour' does not exist in the current context อะนะ จะแก้ยังไงดี
@Pakapon Ponton ส่งโค๊ดมาทาง mail ผมทีครับ kengzer@gmail.com เดี๋ยวผมช่วยดูให้
สาม จุด สอง: ใช้ cvfindContours(); ในการหา contours output จะถูกเก็บไว้ใน seq
CvInvoke.cvFindContours(imgForContour, storage, ref contour, .....)
ตัวแปร imgForContour มัน error อ่ะครับ ต้องประกาศก่อนรึว่ายังไง
แล้วถ้าต้องประกาศก่อน ประกาศแบบไหนครับ
เพิ่ม code ตรงนี้เข้าไปใน 3.1 นะครับ
Image imgForContour = new Image(ResultImage.Width, ResultImage.Height);
CvInvoke.cvCopy(ResultImage, imgForContour, System.IntPtr.Zero);
แล้วอย่างงี้โปรแกร ตรวจคนไม่ใส่หมวกกันน๊อก ใช้หลักการยังไงครับ
@OF_sex อธิบายคงจะลำบากมากครับ เพราะงานมันค่อนข้างยาก และซับซ้อน แต่ถ้าอยากจะศึกษาจริงๆ ทิ้งเมล์ลไว้ครับ หรือ msg มาที่ facebook/labplays ผมจะส่ง paper ให้อ่านครับ
อยากศึกษา ครับ แต่ไม่มีคนสอน หนังสือก็ไม่รู้จะไปดูที่ไหร
@OF_sex เรื่อง image processing (opencv , emgucv) มีเยอะแยะมากมายครับ แต่ถ้าเป็นภาษาไทย คงจะหาลำบากหน่อย ส่วนเรื่องการตรวจหมวกกันน็อค หาได้ยากมากครับ เพราะมีเพียงไม่มีคนที่ศึกษาเรื่องนี้ ส่วนมากจะเป็นคนแถบเอเซีย เช่น ไทย ฮ่องกง คนตะวันตก เขาไม่ได้ศึกษากันครับ บ้านเมืองเขาไม่มีปัญหาเรื่องหมวกกันน็อคอะครับ
อยากได้ เว็บ สำหรับคึกษาอืนๆ อีกพอจะแนะนำได้หรื่อไม่ครับ หรือ Road map ในการคึกษาเกียวกับ image processing อยากจะเขียนโปรแกรมที่เกียวกับ image processing ได้ รวมถึงเอาไปพลิกแพงใช้กับการเขียนโปรแกรมอืนๆครับ
โปรแกรม ตรวจหมวกดูคนใส่หมวกกันน๊อก เป็นดปรเจ็คจบของ ม.น ป.ตรี หรือ โทครับ
เว็บสำหรับศึกษา imageprocessing ลองค้นหาในกูเกิ้ลดูครับ มีเยอะแยะมากมาย คีย์เวิร์ดสำคัญ ก็พวก image processing , opencv , emgucv ต้องค่อยๆ อ่านและทำความเข้าใจครับ อย่าไปรีบร้อน
หนังสือที่แนะนำคือ Learning opencv http://www.cse.iitk.ac.in/users/vision/dipakmj/papers/OReilly%20Learning%20OpenCV.pdf
ก่อนคุณจะเขียนโปรแกรมทางด้าน image processing ได้คุณต้องเข้าใจก่อนว่า image คืออะไร โอเปอร์เรชั่นพื้นฐานมีอะไรบ้าง ซึ่งหาอ่านได้ตามอินเตอร์เน็ตทั่วไป หลังจากพอเข้าใจหลักการพื้นฐานแล้ว คุณก็ต้องเลือก tool มาสักตัว เพื่อที่จะใช้เขียนโปรแกรม(OpenCv , EmguCV , matlab) แล้วแต่ชอบ เลยครับ ถ้าเลือก emgucv ผมแนะนำให้ลองทำตาม และเรียนรู้ ในเว็บ labplays ตั้งแต่ lab1 เลยครับ
______________________
โปรแกรมตรวจจับหมวกกันน็อค เป็นโปรเจคจบ ของวิศวกรรมคอมพิวเตอร์ มหาวิทยาลัยนเรศวร ป.ตรี ครับ
http://www.youtube.com/watch?feature=player_embedded&v=oNwVzun8k3I
เขียนมาถึง lab7 แล้ว ครับ แต่ก็มีบางช่วงที่ไม่เข้าใจ
(ขอบคุนสำหรับคำแนะนำครับ) เดียวขอกับไปดูตั้งพื้นฐานก่อน
สุดยอดไปเลยครับ หอไอเฟลไม่ได้สร้างเสร็จภายในวันเดียวครับ ^_^
มีคำถาม ครับ emgucv ที่ใช้ C# กับ opencv C++
ความไวของการใช้งานต่างกันไม่ครับ มีคนบบอก ว่า emgucv ที่ใช้ C# มันช้ามาก
(ไปติดต่อเรียน image processing คนที่จะสอนบอกว่า emgucv ที่ใช้ C# มันช้า เขาจะสอน C++ ให้ ไม่แน่ใจที่เขาพูดแบบนี้ เพราะว่าเขาไม่ถนัด C# หรือป่าาว )
ประเด็นคือว่า เป็น c# อยู่ งงปลาๆ ส่วน C++ ไม่เคยจับ เลยกลัวการเริ่มใหม่แล้วจา พากันงง ทั้ง c# c++
c++ กับ c# ในเรื่องของความเร็ว ก็ต่างกันอยู่ครับ จะต่างกันมากหรือต่างกันน้อย ขึ้นอยู่กับโปรแกรมเมอร์ด้วยครับ เอาเข้าจริงๆ ถ้าโปรแกรมเมอร์เขียนโค๊ดไม่ดีอาจทำให้ c++ ช้ากว่า c# ก็เป็นได้ครับ แต่ถ้าตัดตัวแปรเรื่องโปรแกรมเมอร์ออก ความเร็วของ c++ อาจจะเร็วกว่า c# ครับ แต่ไม่มากจนเรามองเห็นด้วยตาเปล่า งาน image processing ที่ผมเคยทำ ผมก็ทำบน c# ซะส่วนใหญ่ ผมก็ไม่เห็นจะเจอปัญหาเรื่อง Real Time เลยครับ
มีการเปิดหลักสูตรติวเข้ม หรือป่าวครับ 55 ถ้ามีนี้สมัคคนแรกเลยถ้าสอนผ่าน team viewer ก็น่าจะ ok นะครับ
ยังไม่มีหรอกครับ ผมก็พึ่งเริ่มสนใจ image processing ได้ไม่นานหรอกครับ ประสบการณ์ก็มีอยู่น้อยนิด ยังสอนใครไม่ได้หรอกครับ
ถ้าหากมีวัตถุสีเดียวกันอยู่ในภาพมากกว่า 1 วัตถุ
เราต้องดูจากอะไรหรอครับถึงจะรู้ได้ว่า วัตถุไหนอยู่ก่อน วัตถุไหนอยู่หลัง
ตอนนี้ผมดูจาก แกน x เป็นหลัก เลยใช้ bndRec.X แต่มันรู้แค่ตำแหน่งของวัตถุเดียวอ่ะครับ อีกวัตถุ ไม่รู้จะหาจากไหนได้
แบบในภาพตัวอย่างอ่ะครับ
จะรู้ได้ไงว่า กระดูก อยู่ใกล้ขอบซ้ายมากกว่า ฝาขวดน้ำ อ่ะครับ
รอ อ่านบทความใหม่ๆ อยู่ นะ ครับ อิอิ
ขอโทษนะครับ ที่ตอบช้า พอดีผมพึ่งทำงาน ชีวิตเลยวุ่นวายมากเลยครับ
@Famez ZyrenZe': ทำตามวิธีที่คุณใช้ก็ได้ครับ เมื่อคุณเจอวัตถุ คุณก็เก็บแค่พารามิเตอร์ x,y,width,height ลงในอาเรย์ หรือ list ก็ได้ครับ ทีนี้ก็แล้วแต่คุณว่าจะเรียงลำดับจากพารามิเตอร์ไหน แกน X หรือแกน Y กว้าง หรือ สูง แล้วแต่สะดวกเลยครับ ข้อสำคัญ เรียงลำดับดีๆ นะครับ
OF_sex: ผมจะพยายามอัพบทความใหม่ให้เร็วที่สุดครับ ^_^
เออ ถ้าอย่างนี้ ตัว Qr code เราควรจะจับ สี ดำ หรือสีขาวดี ละครับ
จะทำตัวอ่าน QR code หรอครับ ไอเดียแจ่มเลยครับ ผมก็ไม่เคยทำเหมือนกันครับ เท่าที่ได้ลองอ่านๆ เมื่อสักครู่ ค่อนข้างยากและซับซ้อนเหมือนกันครับ ขั้นแรกคุณต้องเข้าใจก่อนว่าหลักการมันทำงานอย่างไรครับ แล้วค่อยมาว่ากันเรื่องอัลกอลิทึมใน image processing ครับ ถ้าสนใจลองอ่านนี้ดูครับ
http://www.aishack.in/2012/02/scanning-qr-codes/
http://www.thonky.com/qr-code-tutorial/introduction/
http://raidenii.net/files/datasheets/misc/qr_code.pdf
ตอนนี้ ที่ ทำๆ อยู่ คือ ทำ คือตัว http://www.youtube.com/watch?v=zkO70PjqYDg ใช้ Aforge.net ซึ้งกว่ามันจะอ่านได้ ช้ามาก
แลยกะ ว่า Emgu ตัดภาพให้มันเป็น สีขาวหรื่อไม่ก็ดำ มันจะได้ โพกัสที่ รูป qrcode น่าจะอ่านได้ไวกว่า
(จะลองเอาไปใช้คิดเงินแทนบาโค๊ต ใช้QR กับกล้องเว็บแคมแทน)
ไอเดียดีมากครับ ถ้าจะโฟกัสเฉพาะที่ตัว QR Code ผมแนะนำลองดูเรื่อง shape detection ครับ ในส่วนของ rectangle ครับ เราจะสามารถรู้ตำแหน่งของ QR Code ได้เลยครับ
emgu: http://www.emgu.com/wiki/index.php/Shape_%28Triangle,_Rectangle,_Circle,_Line%29_Detection_in_CSharp
Aforge.net: http://www.aforgenet.com/articles/shape_checker/
" ขั้นแรก : รับ input จากกล้องวีดีโอ และแปลงภาพ input จาก RGB เป็น HSV
cameraImage = capture.QueryFrame(); //input image
Image hsvImage = cameraImage.Convert(); //Convert RGB > HSV. "
--------------------------------------------------------------
ทำแล้วภาพที่ออกมามันยังเปนภาพเดิมไม่เปลี่ยนไปแบบที่พี่ทำไว้อะคับ
ทำไงดี
ภาพที่ถูกแปลงมาเป็น HSV คุณให้แสดงผลที่ไหนครับ ใน pictureBox หรือเปล่าครับ ถ้าใช่ ผมแนะนำให้ลองเปลี่ยนมาใช้ CvInvoke.cvShowImage("Windows name",HSVimgage); แสดงภาพแทนครับ เพราะว่าภาพที่แสดงบน pictureBox มันจะถูกแปลงกลับมาเป็นโหมด bitmap ครับ ภาพมันก็เลยเหมือนเดิม
ขอบคุณครับ ^ ^
อยากทราบว่า เราจะ save ภาพที่เราได้จากส่วน output เป็น jpg ต้องใช้คำสั่งอะไรคับหมายถึงภาพที่ได้จาก CvInvoke.cvShowImage("Windows name",HSVimgage);
--------------------------------------------------------------------------------
HSVimage.Save(@"path/filename.jpg") ครับ
ขอบคุณครับ
ไม่ทราบว่าเราสามารถนับจำนวนกรอบที่ตีเช่น กรอบแรก เก็บค่า x1 y1 width1 height1 กรอบสองเก็บ x2 y2 width2 height2 จะได้เป็นสองกรอบใช่มั๊ยครับ
คือสิ่งที่ผมจะทำคือ capture ภาพในแต่ละกรอบมาเก็บใน DB อ่าครับ ต้องทำอย่างไรครับ
int count = 0; // นับจำนวนกรอง
for (; seq != null && seq.Ptr.ToInt32() != 0; seq = seq.HNext)
{
// get ค่า X,Y width,Height ของ contours
// คำนวณหาพื้นที่ของ contours
if (areaC > 200)
{
count++
// วาดกรอบสี่เหลี่ยมให้กับวัตถุ
}
}
ลองดูครับ ไม่แน่ใจว่า ตรงตามที่คุณต้องการหรือเปล่า
ที่ผมทำตอนนี้คือ หาวัตถุได้หลายอันแล้ว แล้วนับจำนวนได้
คืออยากถามอีกซักนิดนะครับ คือ ผมจะมีวิธีดึง ข้อมูลพวก X,Y width,Height ของ contours มาใส่ใน array อย่างไร คือวัตถุที่เจอมีหลายชิ้นน่ะครับ จึงต้องใข้ อาเรย์ช่วย เช่น
วัตถุแรก >>
object[ลำดับวัตถุ][ข้อมูลพวก X,Y width,Height ของ contours]
ผมอยากทราบว่าต้องประกาศ objectเป็นตัวแปรชนิดใดและใส่ตรงไหนน่ะครับ ขอบคุณมากครับ
อ่าตอนนี้ผมลองทำดูได้แล้วครับ ขอบคุณมาก วันหลังมาถามใหม่ ^^
เยี่ยมไปไเลยครับ ดีแล้วคครับ ที่สามารถแก้ปัญหาได้ด้วยตัวเอง เพราะมันจะส่งผลดีกับตัวคุณเองในอนาคตครับ
ขอไฟล์มาศึกษาได้ไหมคับพี่
ผมทำเเล้วรัน ตีกรอบไม่ได้อะคับ
เรื่องไฟล์จริงๆ ผมไม่ได้หวงอะไรหรอกครับ แต่ถ้าเกิดผมเอาลิ้งมาให้ดาวน์โหลดกัน ทุกคนที่เข้ามาก็จะโหลดแล้วก็เอาไปรัน โดยที่ไม่ได้ใส่ใจรายละเอียดในส่วนของตัวโค๊ดกันครับ ผมเลยไม่เอามาให้โหลดดีกว่า เพราะเราจะได้ลงมือทำเอง ได้เจอปัญหาเอง และจะได้แก้ไขปัญหาเองครับ ถ้าเกิดปัญหาอะไรก็ลองหาทางแก้ไขด้วยตัวเองดูก่อน ถ้าไม่ไหวจริงๆ แล้วค่อยไปหาที่ปรึกษาดีกว่าครับ ค่อยๆทำ ใจเย็นๆ เดี๋ยวก็โหดเองครับ ^^
คับผม
หลักการ opencv กับ emgu นี้้เหมือนกันใช่ไหมครับ ต่างกันที่หลักของภาษาหรือเปล่า ผมหมายถึง c++ c# ครับ
เข้าใจถูกแล้วครับ
สวัสดีครับ ตามโปรแกรมจับวัตถุที่เหลืองสองชิ้นที่ตีกรอบสองกรอบ ถ้าผมต้องการที่จะดึงพิกัดกึ่งกลางของทั้งสองกรอบ ออกมาเป็นจุดมาจะต้องเขียนโปรแกรมยังไงอ่ะครับ จะแยกได้ไหมว่าเราจะให้กรอบไหนเป็นกรอบหนึ่งหรือสอง แล้วถ้าจะจับวัตถุสี่กรอบสามารถทำได้ไหมครับ
"ต้องการที่จะดึงพิกัดกึ่งกลางของทั้งสองกรอบ"
: แต่ละกรอบเราสามารถรู้ ตำแหน่ง X,Y ด้านบนซ้าย ความกว้าง ความสูง แล้วหนิครับ สามารถนำมาคำนวณหาตำแหน่งกึ่งกลางของกรอบได้เลย
"จะแยกได้ไหมว่าเราจะให้กรอบไหนเป็นกรอบหนึ่งหรือสอง"
: แยกได้ครับ
"จะจับวัตถุสี่กรอบสามารถทำได้ไหมครับ"
: ได้ครับ
อยากได้ความสูง กับความกว้าง เอามาแสดง ไม่ทราบว่าต้องทำไงคับ
จากหัวข้อ 3.2 ครับ เราสามารถรู้ coordinate ของ rectangle ของวัตถุได้ครับ bndRec.X bndRec.Y bndRec.Width bndRec.Height ครับ จากนั้นคุณก็เอาค่าดังกล่าวไปแสดงได้เลยครับ
ขอบคุณคร้าบ มีอีกอย่างนึง
คือผมอยากจะเอา รูปภาพมา ทำแทนการจับภาพจากกล้อง พอจะมีคำแนะนำบ้างมั้ยครับ
คือผมจะ ตีกรอบรูปร่างที่ต้องการ ประมานนี้แหละ แต่จะทำจากเครื่องสแกน
แต่จะเริ่มจากรูปภาพก่อน
แล้ว input จาก webcam กับ input จากรูป มันต่างกันตรงไหนล่ะครับ? มันก็เหมือนกันหนิครับ คุณเข้าใจคำว่า video หรือเปล่าครับ video คือ เฟรมรูปหลายๆเฟรมเอามาเรียงต่อกัน ดังนั้นถ้าคุณทำกับ video ได้ คุณก็ทำกับ รูปภาพเดี่ยวๆ ได้ครับ
เข้าใจแต่กำลังหาทางดึงจากรูปคับ พอดีไม่ได้เรียนมาทางนี้ ก้เลยไม่ค่อยรู้คำสั่งคับ
ลองดู lab 2 ครับ ใน code ของขั้นตอนที่ 8
ของผม detect ตามรูป อะครับ ถ้าต้องการรูพิกัดของรูปที่เปนสีเหลืองผมต้องทำยังไงครับ
ถ้าจะ Detect แล้วจะให้กรอบสี่เหลี่ยมขึ้นค้างเอาไว้ ต้องทำอย่างไรหรอครับ
ขอสอบถามหน่อยครับ ตรง cvFindContours ถ้าเรารับภาพมาเปน .jpg นะครับ เราจะต้องเลี่ยนครงนี้ใช่ไหมครับ CvInvoke.cvFindContours(imgForContour, storage, ref contour, System.Runtime.InteropServices.Marshal.SizeOf(typeof(MCvContour)), Emgu.CV.CvEnum.RETR_TYPE.CV_RETR_EXTERNAL, Emgu.CV.CvEnum.CHAIN_APPROX_METHOD.CV_CHAIN_APPROX_NONE, new Point(0, 0)); แล้วถ้าเปลี่ยนต้องเปลี่ยนที่เป็น Runtime ใช่ไหมครับ เปลี่ยนเป็นยังไงครับ ขอบคุณครับ
ขอโทษที่ตอบช้านะครับ พอดีช่วงนี้ผมยุ่งๆ อะครับ
@thongchai.jindatam เราสามารถรู้ตำแหน่งพิกัดของวัตถุที่เรา detected เจอ จากตัวแปร Rectangle bndRec ครับ โดย bndRec จะเก็บค่า X , Y ,Width , Height ครับ
@Anonymous กรอบสี่เหลี่ยมเกิดจากอะไรครับ มันเกิดจากเราเจอวัตถุที่ต้องการ detect ไม่ใช่หรอครับ ถ้าเจอให้วาดกรอบสี่เหลี่ยม ถ้าไม่เจอก็ไม่ต้องวาด แต่ถ้าไม่เจอแล้วคุณต้องการให้วาด คุณก็สั่งให้มันวาดสิครับ
@asashi ทำความเข้าใจเรื่อง cvFindContours ใหม่นะครับ cvFindContours เป็น Method ที่ใช้หา contours จากภาพ binary โดยมี parameter ดังนี้
cvFindContours(IntPtr image, IntPtr storage, ref IntPtr firstContour, int headerSize, RETR_TYPE mode, CHAIN_APPROX_METHOD method, Point offset)
จุดสำคัญอยู่ที่ IntPtr image ครับ มันคือภาพอินพุทแบบ binary ที่เราต้องการหา contours ครับ
ผมแนะนำให้คุณลองศึกษาความต่างระหว่าง วีดีโอกับภาพธรรมดา แล้วคุณจะเข้าใจครับ ^^
Vasanครับมีลาย เฟชไหมครับ ผมขอหน่อยนะครับพี่
Post a Comment