Top Ad unit 728 × 90

Latest news

recent

Hiển thị nhiều khung hình (multi-view) với OpenCV

Như đã giới thiệu ở các bài viết trước đây, OpenCV là một thư viện mã nguồn mở hỗ trợ cho việc triển khai và nghiên cứu các ứng dụng computer vision. Thư viện này cũng cung cấp những chức năng rất mạnh trong việc đọc, hiển thị các định dạng ảnh và video. Một cặp hàm rất quen thuộc dùng để tạo ra một cửa sổ view mới và hiển thị ảnh đó là cvNamedWindow, cvShowImage. Tuy nhiên yếu điểm của Open CV là chỉ hỗ trợ chức năng hiển thị chủ yếu để người dùng kiểm chứng kết quả, vì nó tạo ra những cửa sổ riêng biệt ngòai giao diện điều khiển chính, trông rất rời rạc.
Hơn thế nửa trong trường hợp bạn cần hiển thị nhiều kết quả khác nhau, nhiều video và nhiều hình ảnh cùng lúc thì ô la màn hình của bạn sẽ tùm lum các cửa sổ. Vậy giải pháp nào giúp bạn có thể vừa tận dụng sức mạnh có sẵn của OpenCV vừa có thể thiết kế một giao diện hợp nhãn. Có ba cách: Một là bạn sử dụng một lớp mở rộng của OpenCV do Adrian Kaehler có tên là Multiwin nhằm gom nhiều cửa sổ hiển thị của OpenCV thành một dưới dạng ma trận. Hai là bạn hãy thực hiện thao tác gộp nhiều ảnh nhỏ thành một ảnh lớn, gom frame của nhiều movie thành một frame lớn rồi mới show ra cửa sổ view của OpenCV. Ba là phương pháp mà tui đã mày mò ra xuất phát từ kiến thức lập trình C trên window như sau: các đối tượng trên màn hình của bạn đều là những cửa sổ, các cửa sổ đều có Id và có thể có cửa sổ cha chứa nó hoặc cửa sổ con. Nếu coi mỗi màn hình view tạo bởi hai hàm trên là một cửa sổ thì bạn hòan tòan có thể kết chúng vào những cửa sổ khác có vị trí cố định trên màn hình chính của ứng dụng như là những cửa sổ con. Khi đó bạn sẽ có kết quả giống như việc gắn nhiều màn hình tivi lên nhiều cái đinh trên một bức tường :p. Sau đây là một đọan code để làm chuyện đó, nhỏ như con thỏ nhưng cũng mất của tui mấy tiếng, bà con nhớ ghi công khi sử dụng :)
cvNamedWindow("Ten cua so OpenCV", 1);
HWND hWnd = (HWND) cvGetWindowHandle("Ten cua so OpenCV");
HWND hParent = ::GetParent(hWnd);
::SetParent(hWnd, GetDlgItem(IDC_STATIC_OUTPUT1)->m_hWnd);
::ShowWindow(hParent, SW_HIDE);

Về sau chỉ cần update cửa sổ view bằng hàm cvShowImage với nội dung và tại thời điểm mong muốn thì tự động nó sẽ hiển thị gọn gàng trong phạm vi control cha đã thiết lập.

Và đây là ứng dụng visual surveillance đầu tiên của tôi có áp dụng kỉ thuật này.


Lưu ý: trong ví dụ này tôi sử dụng group box control làm control cha với ID là IDC_STATIC_OUTPUT1, vì lập trình bằng VS2008 nên chỉ đơn giản kéo thả control vào form, định vị trí rồi đặt tên ID như mong muốn trong thuộc tính là xong. Nên đặt tên của cửa sổ OpenCV sao cho khó trùng lắp, ví dụ Ten cua so OpenCV -> VnSLib_Shadow

Các bạn muốn sử dụng phương pháp 1 có thể download source code của Adrian Kaehler ở đây.

Trong trường hợp bạn muốn sử dụng phương pháp Made in Vietnam của Bioz thì vui lòng tải bộ ví dụ OPENCV tại kho sản phẩm của IEEV


Binh Nguyen - Bioz
Hiển thị nhiều khung hình (multi-view) với OpenCV Reviewed by Bioz Nguyen on 1:08:00 PM Rating: 5
All Rights Reserved by IEEV © 2009 - 2016
Powered By Blogger, Designed by Sweetheme

Contact Form

Name

Email *

Message *

Powered by Blogger.