PIC Vietnam

Go Back   PIC Vietnam > Robotics > Xử lý ảnh

Tài trợ cho PIC Vietnam
Trang chủ Đăng Kí Hỏi/Ðáp Thành Viên Lịch Bài Trong Ngày Vi điều khiển

Xử lý ảnh Các thuật toán xử lý ảnh dùng trong robot

 
 
Ðiều Chỉnh Xếp Bài
Prev Previous Post   Next Post Next
Old 10-11-2007, 03:04 AM   #14
svn
Đệ tử 1 túi
 
Tham gia ngày: Sep 2006
Bài gửi: 24
:
Đây là trình tự các bạn phải làm để cài, cái vụ này mình công nhận nó ko làm tự nhận đường dẫn nên hơi chuối (chú ý là dùng dotnet nhé, VB, VC... cũng dc nhưng phải là .NET )
Đầu tiên, tải OpenCV gốc và OpenCVDotnet:
OpenCV: http://downloads.sourceforge.net/ope...2&big_mirror=1
OpenCVDotNet:
http://opencvdotnet.googlecode.com/f...-0.7-setup.exe

Sau khi download về, cài OpenCV (lấy từ cái link đầu tiên) vào thư mục c:\Program Files\OpenCV (chính xác thư mục này)
Sau đó cài OpenCVDotNet như bình thường, nó sẽ tìm trong thư mục trên bộ OpenCV gốc, do đó nếu các bạn ko cài hoặc cài vào thư mục khác nó báo lỗi ráng chịu (cái này nó ko tự detect đường dẫn dc, chuối thê ko bit)

Sau khi cài xong xuôi, mở VS2005 ra, tạo một project mới.
Vào Project>Add Reference, add thêm 2 file này trong thư mục cài OpenCVDotNet vào: OpenCVDotnet.dll và OpenCVDotnet.UI.dll
Thêm dòng sau vào đầu đoạn code (thường nằm trong form1.cs - mình dùng c#)
Code:
using OpenCVDotNet;
Vậy là có thể bắt đầu sử dụng thư viện này
Trong thư viện này, đã định nghĩa sẵn cho chúng ta 1 component, tương tự như picturebox, nhưng nhiều chức năng hơn, rất thuận tiện cho các ứng dụng xử lý ảnh: SelectPictureBox, tốt nhất nếu dùng OpenCVDotNet thì nên dùng luôn component này để lưu trữ, hiển thị ảnh luôn, component này chúng ta lôi ra từ file OpenCVDotnet.UI.dll :P
Đầu tiên, để capture ảnh từ 1 camera và hiển thị nó lên:
Code:
CVCapture capture = new CVCapture(); //ko nhất thiết phải khởi tạo = new CVCapture()
CVCapture là 1 object đặc tả cho các thiết bị như camera,webcam... đang có trên máy tính. Trường hợp chỉ có 1 cái webcam gắn vào nó sẽ tự detect và lưu vào đối tượng capture mình vừa tạo = dòng trên, còn có nhiều hơn 1 thì ... bạn phải làm luôn 1 form để chọn và cấu hình các tham số cho vào trong dấu () vậy, hoặc là điều chỉnh các tham số đó sau cũng dc.

Dùng đối tượng CVImage để lưu trữ hình ảnh, nên dùng cái này là tốt nhất, nó cũng rất dễ chuyển sang định dạng bitmap để dùng cho nhiều mục đích khác, nhưng các hàm xử lý ảnh của thư viện này thì chỉ dùng CVImage làm tham số
Code:
private CVImage image = null; //chưa có gì, nên cho nó = null
Tạo 1 SelectPictureBox trên form, giả sử đặt tên là SelectPictureBox1.
Để hiển thị hình ảnh thu dc từ webcam, có thể đặt đoạn code sau vào 1 timer, đặt interval là (1 / 24)*1000 ms (24 hình trên 1s ấy mà )
Code:
image = capture.QueryFrame();
            if (image == null) capture.Restart();
            selectPictureBox1.Image = image.ToBitmap();
Có nhiều bạn thắc mắc ko biết cái hình chữ nhật đỏ đỏ mình vẽ lên trên cái picture đó làm sao, cái đó ko phải mình làm, mà là một tính năng của SelectPictureBox Trong quá trình chương trình chạy, cứ cầm chuột nhấn giữ và kéo trên cái selectpicturebox là nó sẽ tự động vẽ ra 1 hình chữ nhật như vậy, sau khi thả chuột thì thông tin trong hình chữ nhật đó sẽ lưu lại, kể cả toạ độ của tâm hình chữ nhật đó.
Sau khi nắm dc vài component của thư viện này, phần còn lại là phải tìm hiểu về xử lý ảnh, chính xác là muốn xử lý cái gì, dùng thuật toán nào (cái này có thể ko cần tìm hiểu sâu, chỉ cần biết sơ sơ trình tự của từng cái là đủ để áp dụng các hàm có sẵn trong thư viện, chỉ cần sửa đôi chút trong hàm Track() trong source của mình (mình cũng chỉ sửa đôi chút từ cái source meanshift họ cung cấp mẫu thôi :"> ), để làm 1 ứng dụng nhỏ, đơn giản thì đoạn code trong hàm track() đó là đủ.
Trong ct của mình, trình tự sẽ là:
-Dùng chuột vẽ một hình chữ nhật bao quanh đối tượng di chuyển, thực chất là thay đổi vị trí và kích thước của SelectedRect trong component SelectPictureBox (chỉ cần giữ chuột và kéo, thả ra là nó tự thay đổi theo chúng ta chọn).
-Lưu biểu đồ màu của vùng dc chọn (bằng hàm UpdateHistogram)
-Sau một thời gian, áp dụng giải thuật detect = meanshift
Code:
using (CVImage bp = image.CalcBackProject(this.initialHistogram))
            {   
                // calculate mean shift with user parameters and region of interest.
                CVConnectedComp conn = bp.MeanShift(selectPictureBox1.SelectionRect, Iterations);
-Đặt lại SelectedRect cho SelectPictureBox1 ( hình chữ nhật mới bao quanh đối tượng di chuyển sẽ tự động dc vẽ)
Code:
selectPictureBox1.SelectionRect = conn.Rect;
Việc còn lại, là xác định xem vị trí mới này có thay đổi so với trước ko, lúc này mọi việc đơn giản hơn nhiều , rồi xuất tín hiệu điều khiển ra mạch điều khiển động cơ quay camera
-Lặp lại các bước trên.

Thân

P/s: giờ mình mới xem lại cái thư mục project đó, quá nhiều file ko cần thiết, một số mình viết khi định dùng directX, nhưng ko ăn nhập gì vào chương trình cả, cứ remove nó thẳng tay đi
svn vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
 


Quyền Sử Dụng Ở Diễn Ðàn
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 Mở
Smilies đang Mở
[IMG] đang Mở
HTML đang Tắt

Chuyển đến


Múi giờ GMT. Hiện tại là 09:48 PM.


Được sáng lập bởi Đoàn Hiệp
Powered by vBulletin®
Page copy protected against web site content infringement by Copyscape
Copyright © PIC Vietnam