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

86 comments:

  1. Em đang mắc vấn đề này thì gặp được bài viết này. Cảm ơn anh Bình Nguyên nhiều nha.

    ReplyDelete
  2. OMG, anh là Nguyễn Thanh Bình viết theo thứ tự tiếng anh là Bình Nguyễn em ạ :(

    ReplyDelete
  3. Vâng, em nhầm. Em hỏi anh tí: Em sử dụng một button để hiển thị một ảnh lên một Picture Control có ID là IDC_STATIC_OUTPUT1. Bây giờ em muốn dùng một button khác để xử lý chính ảnh đó và hiển thị ảnh được xử lý lên một Picture Control khác có ID là IDC_STATIC_OUTPUT2. Tuy nhiên em vẫn chưa lấy được ảnh từ IDC_STATIC_OUTPUT1. Anh có thể cho em xin một đoạn code lấy ảnh này được không ạ, em cảm ơn anh nhiều.

    ReplyDelete
  4. Load 1 image:

    IplImage* img=0;
    img=cvLoadImage(fileName);
    if(!img) printf("Could not load image file: %s\n",fileName);

    Hiển thị image:

    cvShowImage("Ten cua so OpenCV",img);

    ReplyDelete
  5. Ý em muốn xin là code lấy ảnh từ Picture Control có ID là IDC_STATIC_OUTPUT1 để xử lý và hiển thị lên Picture Control có ID là IDC_STATIC_OUTPUT2.

    ReplyDelete
  6. Picture control la doi tuong dc dung nhu mot cai gia treo tam anh ma thoi, du lieu thuc cua buc anh nam o IPLImage object. Em hay tao ra mot ban copy cua doi tuong nay roi xu ly, sau do tao ra mot cvNamedWindow moi gan vao OUTPUT2 tuong tu nhu da lam voi OUTPUT1 la xong thoi. em hay coi them huong dan su dung OpenCV trong sach nay:

    http://www.ieev.org/2009/09/learning-computer-vision-with-opencv.html

    ReplyDelete
  7. Hiện tại em đang làm cái đề tài phát hiện đối tượng chuyển động, em xem hình trên thấy hình như anh cũng làm cái này rồi. Anh có thể hướng dấn tài liệu và cho em ít code tham khảo được không? Em cảm ơn nhiều.

    ReplyDelete
  8. À quên, anh có thể gửi vào gmail của em cũng được:
    balinh6989@gmail.com

    ReplyDelete
  9. Trong thư mục cài đặt OpenCV em vào thư mục samples/c rồi tham khảo các file blobtrack.cpp, bgfg_xxx.cpp, đây là các ví dụ sử dụng thuật tóan motion detection trong OPENCV, hiện nay theo anh biết OPENCV implement 2 thuật toán chính 1 la Mixture of Gaussian, hai là giải thuật dựa trên bayes có tên là gì đó mà anh wên mất :). Dựa vào mấy ví dụ trên em có thể dò ra sourcode của thuật toán trong bộ mã nguồn của OPENCV. Anh cũng đã xây dựng một bộ thư viện riêng cho quy trình các xử lý thông minh trên camera và nó sẽ được tích hợp trong VnSLib trong tương lai gần...

    ReplyDelete
  10. Thế em mà quên mất, để em thử xem, cảm ơn anh trước nha.

    ReplyDelete
  11. Anh Bình cho em hỏi tý, tao sao file avi hiển thị trong opencv có file hiển thị được, có file lại không hiển thị được. Vậy file avi sử dụng trong opencv là file như thế nào?

    ReplyDelete
  12. Việc hiển thị avi trong OpenCV được hay không còn tùy thuộc vào codec em cài trong máy tính của mình. Vì OpenCV sử dụng window codec. Kinh nghiệm là những file nào window media player chạy được thì OpenCV sẽ mở được :). Em nên thử check lại file xem có hư không, cài bộ codec mới nhất. OpenCV có thể mở nhiều định dạng khác ngòai avi.

    ReplyDelete
  13. Chào anh Bioz!
    Em đang làm bài toán phân lớp đối tượng với nguồn vào là camera. Ngôn ngữ em dùng là C#, hiện tại em đang dùng phương thức lấy Video bằng cách gọi API của Win chứ không qua OpenCV. Tuy nhiên có thể là do thuật toán không tốt hay vấn đề gì đó(em không rõ) mà chương trình chạy rất chậm, Với nguồn là ảnh GRB 600*600 x 20 frame/giây mà chuyển sang đen trắng đã giật liên hồi rồi! Anh có thể cho em biết một vài thông số khi anh dùng OpenCV, ví dụ như trong chương trình anh demo bằng bức ảnh phía trên, tốc độ video là bao nhiêu frame/s, diện tích ảnh,... và em có nên chuyển sang dùng OpenCV không!
    Mục tiêu của em bước đầu là tách đối tượng ra khỏi nền(giống như trong ảnh phía trên của anh), anh có thể giúp em một chút về giải thuật phần này luôn được không!
    Cảm ơn anh rất nhiều!
    Email của em là nvhuan@live.com

    ReplyDelete
  14. Em đang dùng C# vậy thì nên chuyển sang sử dụng EMGU hay là OPENCV C#. Đó là 2 phiên bản của OpenCV nhưng được viết lại trên c#, một cái dùng cách wrapper C lại C function còn một cái viết lại hoàn toàn bằng C#. (anh ko nhớ rỏ tên, em tự tìm xem). Chương trình của anh viết để chạy trên ipnc camera (DSP) mà tốc độ đã là 16 frames/s có bao gồm object classification. do vậy tốc độ của em như vậy là ko ổn. Vui lòng đọc thêm bài viết về tối ưu mã C anh đã viết để tối ưu con trỏ, vòng lặp ...

    ReplyDelete
  15. cho e hỏi là anh dùng project loại gì mà nó không nhận m_hWnd

    ReplyDelete
  16. Cảm ơn lời khuyên của anh! Em mới test thử EMGUCV, tốc độ tuyệt vời! Em sẽ tìm hiểu kĩ anh chàng này! Có lẽ làm CV mà không dùng OpenCV thì thật là lãng phí!
    Sau này sẽ phải nhờ anh nhiều nữa!
    Smile!

    ReplyDelete
  17. @Bichkhe: anh dùng project visual c++ -> MFC application -> dialog base với VS2008
    @nvhuan: em chỉ nên dùng OpenCV cho thao tác input và output còn thì vì em còn đi học em nên tự xử lý bằng code của mình. nó sẽ giúp nội công của em thăng tiến rất nhanh. Cái gì lạm dụng cũng sẽ không tốt :)

    ReplyDelete
  18. Chào  anh , em đang làm xử lý ảnh về Motion Tracking dùng webcam , em dùng hàm Absdiff  () để tách foreground và background sau đó dùng findContour () để tìm biên của motion những cho kết quả không tốt lắm , anh có thể cho em biết làm sao anh tách được foreground và background tốt như vậy và làm cách nào mà anh chuyển phần bên trong contour thành màu trắng như vậy được ?
    cảm ơn anh nhiều !

    ReplyDelete
  19. - anh thật ra ko rõ lắm về mấy cái hàm em xài tuy nhiên theo tên của nó mà đoán thì Absdiff là hàm tách motion bằng phương pháp so sánh giá trị giữa các frame liền kề rồi dùng threshold để chọn ra những pixel nào thuộc về motion. Phương pháp này chủ yếu lấy ra được boundary/edge của motion chứ ko phải trọn vẹn motion object (thường là như vậy), có rất nhiều biến tướng của cách này tuy nhiên đa phần khá nhạy cảm với môi trường và không cho kết quả tốt lắm dù tốc độ cao và đơn giản. findContour thì đoán là hàm tính connected component labeling dựa vào contour. Thông trường trước khi tính tới bước này em cần thực hiện việc rectify object, tức là chuẩn hóa lại motion đã detect bằng tóan tử morphology.
    - Có nhiều phương pháp motion detect khác như: edge diff, median diff, waterflow, Mixture of Gaussians Model... Cho kết quả tốt hơn. Trong OpenCV implement Mixture of Gaussian và Complex motion detection em có thể thử, coi mấy cái example của nó đi.

    ReplyDelete
  20. Chao anh!
    Em chay thu code file bgfg_segm.cpp nhung gap bao loi: error LNK2001: unresolved external symbol _cvCreateFGDStatModel
    em ko biet sua bang cach nao

    ReplyDelete
  21. đó là lỗi liên kết thư viện, gây ra do setting compile ko đúng. Em hãy coi lại bài hướng dẫn cài đặt OpenCV v1 ở đoạn gần cuối nói về setting lib.
    Lần sau vui lòng viết tiếng Việt có dấu, nếu ko cầu hỏi sẽ ko được hiển thị và trả lời :(

    ReplyDelete
  22. Chào anh,
    Cám ơn anh, cái lỗi hôm trước là do chưa add thư viện cvaux.lib vào.
    Em đang đọc về MOG. Em ko hiểu cái chương trình trong file cvbgfg_gaussmix.cpp hoạt động thế nào và cách viết chương trình này theo algorithm trên bài báo "An Improved Adaptive Background Mixture Model for Real-
    time Tracking with Shadow Detection" đính kèm trong file đó. Anh có thể giải thích giùm em được ko ạ?

    ReplyDelete
  23. - Chương trình đó chạy thế nào thật ra anh cũng ko biết vì chưa chạy thử :). Anh chỉ nhìn lướt qua và nhận ra rằng em cần truyền tham số từ command line cho nó. Đây là các tham số cấu hình cho thuật tóan. Em nên đọc kỉ source code, đọc kỉ comment bên trong để biết cách nó sử dụng các thông số đó như thế nào, đồng thời nghía qua cái source thuật tóan trong opencv code. Nếu lười hơn cũng có thể hỏi google, anh tin là em sẽ tìm thấy, nếu thấy thì vui lòng share lên đây cho những người khác coi.
    - Để hiểu bài báo này trước tiên em phải hiểu về Gaussian, hiểu về ước lượng. Hãy đọc nhìều lần, cộng với đọc kỉ code của thuật tóan trong OpenCV code em sẽ dần dần có ý niệm.
    - Nôm na của thuật tóan này là nó mô hình hóa sự biến đổi của từng pixel trong video frame bằng xác suất. Thật ra có nhiều cách mô hình hóa này, nếu em tìm hiều thuật tóan còn lại trong OpencV em sẽ thấy nó dùng histogram còn trường hợp này nó dùng N Gaussians. Frame by frame với mỗi pixel sẽ có N Gaussian được tính tóan, cập nhật để có một sự tích lũy quá trình biến đổi giá trị của pixel đó qua các trọng số.
    - Phương pháp này thuộc về lớp background subtraction nên trước tiên sẽ tính tóan background rồi sau đó dựa vào current frame để suy ra foreground.
    - Việc xác định background dựa vào nguyên lý: giá trị nào của pixel có độ ổn định cao thì đó là background. (cái này biết được nhờ quá trình thống kê tích lũy frame by frame dùng N Gaussian).

    Hy vọng một vài giải thích sơ bộ sẽ giúp em có hướng đi để bước tiếp. Nghiên cứu = kiên trì = đọc, chỉ cần ko bỏ cuộc em sẽ hiểu :p

    ReplyDelete
  24. Cảm ơn anh!
    Đề tài của em là dùng 1 webcam gắn vào cái servo.Webcam sẽ quay và quét góc 180 độ nếu thấy có object thì servo quay bám theo object đó sao cho object ở giữa màn hình.Cái em đang thắc mắc là mỗi khi webcam quay thì background đã thay đổi rồi,không còn là background trước nữa,liệu em có dùng MOG được không? Hiện tại ý tưởng của em là khi webcam quay em sẽ lần lượt chụp lại các background,sau đó khi phát hiện object trong background nào thì so sánh với background đó.

    ReplyDelete
  25. camera có 3 dạng: 1 là static, 2 là dynamic, 3 là chuyển động theo quỹ đạo cố định.
    Thật ra vẫn chưa rỏ em là dạng 2 hay dạng 3 vì em kô nói cụ thể. Tuy nhiên MOG thường chỉ ứng dụng cho dạng 1. Trong trường hợp dạng 1 người ta thường thực hiện tách foreground, background trước rồi mới dựa vào đó mà tracking, theo vết. Tuy nhiên với dạng 2 và 3 thì trình tự này hơi khó thực hiện. Với 2 và 3 người ta thường tracking dựa vào kết quả của object detection hay image analysic. Theo ý của em thì cũng có người đã làm, với dạng 3 em có thể xây dựng mô hình background dạng hình panorama. Nói chung có rất nhiều các bài tóan khác nhau cần giải quyết liên quan tới camera, như là kết hợp 1 camera tỉnh + 1 camera động, camera tỉnh detect còn camera động theo vết. Hay phối hợp nhiều camera động để quan sát nhiều hướng ... Em nên đặt ra một bài tòan vừa sức, đi cùng với ứng dụng rỏ ràng, giải quyết để đáp ứng với yêu cầu ứng dụng chứ đừng giải quyết vấn đề theo yêu cầu học thuật chủ quan sẽ rất khó.

    ReplyDelete
  26. Chào anh
    Em bị cái lỗi này mà không biết khắc phục ra sao, đã 2 ngày trôi qua mà ko làm dc gì cả.Nếu
    Em đang làm cái project sử dụng OpenCV và RS232 viết trên VC++,RS232 em dùng Microsoft Communication Control 6.0. Khi em viết 2 cái project riêng biệt thì chạy tốt ko bị sao cả, khi em ghép 2 cái vào cùng 1 MFC thì compile dc,build dc,ko báo lỗi,nhưng execute ko ra gì cả. Em ko biết 2 cái này có bị xung đột gì đó không? Nếu anh đã từng gặp trường hợp tương tự thì giúp em cái, em gấp lắm
    Cảm ơn anh!

    ReplyDelete
  27. - Anh vẫn chưa hiều cái vụ ko ra gì cả của em cụ thể là thế nào. Vì anh ko biết RS232 nên cũng ko có ý kiến gì được nhưng nếu em mô tả kỉ hơn thì anh có thể giúp em suy đóan lý do :)

    ReplyDelete
  28. Không excute được nghĩa là click cái file .exe trong debug ko chạy được ứng dụng đó anh,cũng không báo gì cả.
    Chắc anh học bên CNTT hả?

    ReplyDelete
  29. hahaha lỗi kiểu này thì thật khó nhỉ:
    - em thử compile lại dưới chế độ release xem sao.
    - Xử lý để loại bỏ hết các warning trong quá trình compile.
    - Trong hàm xử lý chính em hãy comment các hàm lại rồi gắn vô từ từ để check xem lỗi run-time này xãy ra do hàm nào. Nhớ kiên nhẫn và làm kỉ :)
    - Chưa chắc đã có sự giống nhau 100% giữa 2 cái độc lập và cái tổng hợp, em nên check kỉ lại. Lỗi này thường gây ra do cấp phát/ truy xuất bộ nhớ ko đúng, ngoài ra cũng có thể do chương trình load lib quá nặng, dùng bộ nhớ quá nhiều... do vậy mà nó ko có ưu tiên để chạy. Trường hợp này dù ko chạy nhưng nếu mở Ctr-Alt-Del em sẽ thấy nó trong list process.

    ReplyDelete
  30. Em chào anh ạ. Hiện nay em cung đang viết chương trình xử lý ảnh sử dụng visual 2008. Em đang thắc mắc không biết trong opencv của mình có hàm tính số pixel trong một miền không ạ(nó giống như hàm regionprops trong matlap đó ạ)? Em kính mong nhận được sự giúp đỡ của anh. Em xin chân thành cảm ơn!

    ReplyDelete
  31. http://www.ieev.org/2009/09/learning-computer-vision-with-opencv.html

    - Theo anh biết thì ko có hàm nào uyển chuyển như regionprops nhưng nó có cung cấp bộ hàm tính connected component labeling. Em hãy tìm hàm này trong tài liệu ở trên, chỉ cần search từ khóa này là thấy thôi. Hy vọng trả lời đúng ý em hỏi :)

    ReplyDelete
  32. Hiện tại em đang làm một con rô bốt bám đối tượng chuyển động, anh Bình có thể cho em đoạn code về nhận dạng đối tượng di chuyển (như em thấy trên hình trong bài viết này) được không ạ, em cảm ơn nhiều. Email của em là: balinh6989@gmail.com

    ReplyDelete
  33. Nguyên tắc của blog này là ko cung cấp source code một cách lẻ tẻ, không hỗ trợ debug, mã nguồn của các thuật toán như em yêu cầu sẽ được xuất bản thông qua thư viện VnSLib trong thời gian tới. Hiện tại em có thể tham khảo OpenCV, trong đó có mọi thứ em cần tuy hơi phức tạp và khó hiểu. Chúc em vui vẻ và thông cảm!

    ReplyDelete
  34. Anh ơi, em có một chương trình thế này:

    void CwebcamDlg::process()
    {
    cvNamedWindow("IDC_STATIC8", 1);
    cvNamedWindow("IDC_STATIC", 1);

    HWND hWnd = (HWND) cvGetWindowHandle("IDC_STATIC");
    HWND hWnd2 = (HWND) cvGetWindowHandle("IDC_STATIC8");


    HWND hParent = ::GetParent(hWnd);
    ::SetParent(hWnd, GetDlgItem(IDC_STATIC)->m_hWnd);
    ::ShowWindow(hParent, SW_HIDE);

    HWND hParent2 = ::GetParent(hWnd2);
    ::SetParent(hWnd2, GetDlgItem(IDC_STATIC8)->m_hWnd);
    ::ShowWindow(hParent2, SW_HIDE);

    ////////////////////////////////////////////

    Code

    ////////////////////////////////////////////

    if( cvWaitKey( 10 ) >= 0 )
    break;


    cvReleaseImage( &frame_copy );
    cvDestroyAllWindows();
    cvReleaseCapture( &capture );


    }

    Ở dialog:

    void CwebcamDlg::OnBnClickedButton1()
    {
    process();
    }

    void CwebcamDlg::OnBnClickedCancel()
    {

    cvDestroyAllWindows();
    OnCancel();

    }


    Khi ấn vào OK thì nó chạy chương trình Process, và khi ấn vào Cancel thì nó đóng tất cả. Nhưng khi em thực hiện thì khi ấn Cancel thì chỉ đóng cửa sổ mà vẫn tiếp tục debug, e phải ấn vào stop debug mới dừng được chương trình, Em nghĩ tại chưa giải phóng bộ nhớ khi tạo các khung hình,ko bit có phải không ạ và làm thế nào để có thể dừng hoàn toàn chương trình khi ấn Cancel để mình có thể sử dụng file .exe cho các demo. Thank anh ah.

    ReplyDelete
  35. em share code kiểu này thật là làm khó nhau quá :) nhìn đây thì đóan là trong đọn Code là một loop có dạng while(abc){capture frame from video; xu ly ...}. Một trong những cách dễ nhất là em hãy khai báo abc là toàn cục. để khi em nhấn cancel thì trong hàm sự kiện click em chỉ việc gán abc = false là chương trình tự động ngừng capture. Có một nguyên tắc mà em phải ghi nhớ trong lập trình multithread (ở đây là một dạng của multithread) là các tiến trình hạn chế can thiệp trực tiếp vào tài nguyên của nhau, việc điều khiển thường thực hiện qua các flag.

    ReplyDelete
  36. :D Sorry anh, bởi vì đây là đoạn code cho một paper, e mới demo, chưa public thế nên GS em không cho cho share code trên mạng. ANh thông cảm. Đúng là trong đoạn code trên e có dùng vòng lặp và capture webcam:

    void CwebcamDlg::process()
    {
    cvNamedWindow("IDC_STATIC8", 1);
    cvNamedWindow("IDC_STATIC", 1);

    HWND hWnd = (HWND) cvGetWindowHandle("IDC_STATIC");
    HWND hWnd2 = (HWND) cvGetWindowHandle("IDC_STATIC8");


    HWND hParent = ::GetParent(hWnd);
    ::SetParent(hWnd, GetDlgItem(IDC_STATIC)->m_hWnd);
    ::ShowWindow(hParent, SW_HIDE);

    HWND hParent2 = ::GetParent(hWnd2);
    ::SetParent(hWnd2, GetDlgItem(IDC_STATIC8)->m_hWnd);
    ::ShowWindow(hParent2, SW_HIDE);

    ////////////////////////////////////////////


    for(;;)
    {
    frame = cvRetrieveFrame( capture );

    ......Code......

    detect_and_draw(frame_copy);

    if( cvWaitKey( 10 ) >= 0 )
    break;
    }

    ////////////////////////////////////////////



    cvReleaseImage( &frame_copy );
    cvDestroyAllWindows();
    cvReleaseCapture( &capture );


    }


    void CwebcamDlg::detect_and_draw( IplImage* img)
    {
    .......Code......

    cvShowImage( "IDC_STATIC", img );
    cvReleaseImage( &gray );
    }


    ở đây em dùng for(;;) và dùng lệnh break để thóat khi ấn phím, ở một hàm bên ngoài e có dùng lệnh để hiển thị ảnh trên khung khai báo ở process(). Như vậy có ảnh hưởng j đến chương trình chính không ạ. Nếu ảnh hưởng thì có cách nào để hiển thị ảnh tốt hơn (mục đích em muốn dùng khung cố định gắn trực tiếp vào GUI, chứ ko dùng kiểu các khung tự động xuất hiện riêng lẻ). Nếu để khung tự động xuất hiện riêng lẻ thì e có thể stop debug bằng cách dùng lệnh break khi ấn esc. Tuy nhiên khi gắn vào khung cố định bằng HWND hWnd em không thể nào dừng debug được ạ. Em cũng mới tìm hiểu về VC2008 và openCV thế nên không rõ lắm.

    Em đã sửa chương trình thành như sau tuy nhiên vẫn không stop dc

    void CwebcamDlg::process()
    {
    abc=1;
    while(abc)
    {
    Code
    }
    }

    void CwebcamDlg::OnBnClickedCancel()
    {
    abc=0 ;
    cvDestroyAllWindows();
    OnCancel();

    }

    vÀ ngoài ra khi em sử dụng cách hiển thị như trên theo hướng dẫn của anh, thì khi chương trình bắt đầu chạy, bao giờ nó cũng hiện ra một window rồi biến mất ngay, em nghĩ là do hàm
    cvNamedWindow("IDC_STATIC8", 1);
    cvNamedWindow("IDC_STATIC", 1);
    Nó không ảnh hưởng đến chương trình nhưng trông không đc đẹp mắt lắm. Anh có cách nào hoặc gợi ý hướng nào đó để làm cho ảnh hiện luôn trên khung mà không nhảy ra window khác dc khôg ạ. Thank anh!

    ReplyDelete
  37. anh cũng bó chíu, tuy nhien anh se đề nghị một cấu trúc như sau:

    trong hàm init của chuong trình hay dialog em se khai báo tòan bộ window như sau:
    BOOL CMainDlg::OnInitDialog()
    {
    cvNamedWindow("Video", 1);
    HWND hWnd = (HWND) cvGetWindowHandle("Video");
    HWND hParent = ::GetParent(hWnd);
    ::SetParent(hWnd, GetDlgItem(IDC_STATIC_OUTPUT1)->m_hWnd);
    ::ShowWindow(hParent, SW_HIDE);
    ...
    }

    trong hàm xử lý system event(exit chương trình,..) em sẽ hủy bộ nhớ và các cửa sổ
    void CMainDlg::OnSysCommand(UINT nID, LPARAM lParam)
    {
    if ((nID & 0xFFF0) == IDM_ABOUTBOX)
    {
    CAboutDlg dlgAbout;
    dlgAbout.DoModal();
    }else if(nID == SC_CLOSE)
    {
    cvDestroyWindow("Video");
    controlKey = 'q';

    cvReleaseImage(&standardColorImage);
    cvReleaseImage(&standardGreyImage);
    delete[] standardGreyData;
    delete[] standardColorData;

    CDialog::OnClose();
    }else
    {
    CDialog::OnSysCommand(nID, lParam);
    }
    }

    Trong hàm xử lý chính:
    process(){
    - cap phat bo nho
    - flag = true;
    while(flag){
    - capture
    - xu ly
    - cvShowImage( "Video", img );

    }
    - huy bo nho
    }

    hàm sử lý sự kiện click cancel chỉ làm 1 chuyện đơn giản là bật cờ:
    clickCancel(){
    flag = false;
    }

    trong quá trình thiết kế chương trình em nên tách bạch giữa algorithm, input, output, interface. Không nên để 4 cái này nhập nhằng trong cùng 1 hàm với nhau như hàm detect_and_draw của em.

    Anh chỉ có thể góp ý như thế còn lỗi của em chỉ là do kỉ năng lập trình còn yếu, chịu khó debug sẽ fix được thôi.

    ReplyDelete
  38. chào a. e mới bắt đầu nghiên cứu open cv về nhận dạn khuôn mặt người a có thể share e tài liệu (tiếng việt) đc ko ah.
    vì mới tìm hiểu nên còn non a cho e code đơn giản chạy đưa 1 bức hình đc ko ah.
    e cảm ơn a nhiều!!!

    ReplyDelete
  39. - IEEV chính là tài liệu tiếng Việt :)
    - vui lòng đọc: http://www.ieev.org/2010/03/adaboost-haar-features-face-detection.html
    trong đó có ví dụ demo.

    ReplyDelete
  40. Anh Bình em không viết trên nền MFC mà là console vậy em muốn hiển thị nhiều hình trên một cửa sổ thì đoạn code ra sao (nó không có cái này GetDlgItem(IDC_STATIC_OUTPUT1)->m_hWnd)? "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" em chưa hiểu cái này update như thế nào? nội dung và thời điểm ? phạm vi xác định như thế nào nếu ở console? anh có thể lấy ví dụ cụ thể được không? thanks!

    ReplyDelete
  41. Chào Loc, em có thể tham khảo tại đây:
    http://www.ieev.org/2011/03/hien-thi-nhieu-anh-tren-cung-mot-window.html

    ReplyDelete
  42. anh có thể cho em một gợi ý để làm tracking không. em chạy demo motemp của opencv thì nó detect ra được các motion object là các hình chữ nhật, em ko biết làm sao để tracking nó.Em cảm ơn anh nhiều

    ReplyDelete
  43. - motion: hay là foreground object là các đối tượng di chuyển trong video. Detect motion là tìm ra các region, silhouette, edge của các di chuyển đó.
    - tracking: là tìm ra motion path của 1 đối tượng di chuyển qua N frames, trả lời cho câu hỏi đối tượng A ở frame N hiện là motion nào trong frame N+1...

    Ví dụ em chạy dùng phương pháp tính difference giữa các frame để suy ra motion, các hình chử nhật em thấy được vẽ nhờ kết quả của Connected component labelling. Để tracking em có thể đơn giản dựa vào kết quả của motion detection của frame N và frame N + 1 rồi dựa vào mối liên hệ hình học như overlapped, content để xác định blob nào tương ứng với blob nào ... em hãy chạy ví dụ blobtrack.cpp để hiểu chi tiết về quá trình này.

    http://opencv.willowgarage.com/wiki/VideoSurveillance

    http://opencvlibrary.svn.sourceforge.net/viewvc/opencvlibrary/trunk/opencv/doc/vidsurv/Blob_Tracking_Modules.doc

    ReplyDelete
  44. Mình cũng bị lỗi giống bạn Francis.
    Viết chương trình XLA cũng ổn ổn rồi. giờ chuyển qua giao tiếp RS232 để dk động cơ, nhưng cứ đưa cái MSComm vào là lỗi . Mặc dù Build không báo lỗi, nhưng khi chạy thì báo
    http://cb8.upanh.com/20.592.27493797.GVH0/error.jpg.
    Mình cũng thử viết chương trình truyền nhận thử, thấy Ok. rùi viết thêm lệnh OpenCV vào trong đó. khai báo #include thì ko sao, tới khi viết bất kỳ lệnh nào của OpenCV là lại bị lỗi như trên. Mình tìm hiểu thấy vài người cũng bị giống mình.
    Ai biết lỗi này giúp mình với. Thanks

    ReplyDelete
  45. có vẻ như đây không thuộc lĩnh vực quen thuộc với tất cả các thành viên hiện nay của IEEV, vì vậy thật tiếc ko giúp gì cho bạn được, hy vọng có ai đó biết sẽ giúp bạn. Khi giải quyết được vấn đề bạn vui lòng share giải pháp cho các bạn khác. Cảm ơn.

    ReplyDelete
  46. Mình đang làm một bài load ảnh của opencv lên MFC, nhưng hình hiển thị nhấp nháy, bạn biết cách khắc phục không, chỉ tớ với. Tớ dùng Picture control type của nó là Bitmape.

    Cảm ơn mọi người nhiều

    ReplyDelete
  47. bạn hiển thị ảnh hay video?

    ReplyDelete
  48. Em dùng opencv, trích ảnh ra từ video để xử lý, sau đó hiển thị lại ảnh đó. Em đang làm về theo vết đối tượng dùng opencv, em dùng thuật toán lọc Particle Filter(Lọc hạt).

    ReplyDelete
  49. 1. em hiển thị sequence image chứ không phải single image.
    2. vấn đề nháy có thể do tốc độ xử lý thuật tóan của em chậm -> latency (em thử chỉ hiển thị video ko thôi mà comment đoạn xử lý lại để check điều này)
    3. Vấn đề nháy có thể liên quan tới cách em xử lý GDI, CDC trong MFC (anh ko biết cách em làm như thế nào), để giải quyết thì em đọc lại phần xử lý đồ học trong MFC, cách xử lý double buffer, invalid interface, onPain event ... có thể download ví dụ đồng hồ analog trong phần sản phẩm của IEEV để tham khảo.

    ReplyDelete
  50. xin Bioz chỉ giúp cách liên kết OpenCV vào C# được không? C# có sử dụng được OpenCV không hay phải dùng emguCV?

    ReplyDelete
  51. câu hỏi này tương đương với: C# có thể sử dụng C++ DLL được hay không. Câu trả lời là được, với điều kiện DLL C++ phải được build đúng format và bên trong C# bạn cần một C# wrapper như là một interface cho c++ library. Lý do: trong C/C++ có nhiều kiểu dữ liệu và cấu trúc không giống trong C# do vậy cần phải có lớp trung gian để đồng bộ.
    emguCV chính là dùng phương pháp này để có thể gọi OpenCV trên C#. VnSLib và ví dụ VnPlibCam trong phần download của IEEV cũng là một minh họa tương tự.

    ReplyDelete
  52. anh Bioz ! em chạy blob track cho kết quả tốt trên video nhưng khi em dùng trên camera ip thì ko được tốt lắm,lá cây hoặc vật gì động đậy cũng phát hiện được, làm sao để chỉ detect người và xe mà thôi ? có lúc người đi bộ hoặc xe đi ngang qua cũng ko phát hiện. Anh có thể gợi giúp em ý tưởng được ko,em cảm ơn anh trước nha !

    ReplyDelete
  53. có rất nhiều vấn đề ảnh hưỡng tới kết quả, ở đây anh sẽ nói về sự khác biệt giữa video và ip camera:

    - size của video: vì trong thuật tóan thường sử dụng các filter để lọai bỏ các blob không cần thiết dựa vào kích thước, ratio, ... do vậy điều này sẽ ảnh hưỡng rất lớn.
    - codec: mỗi loại codec sẽ gây ra các lọai nhiễu, biến dạng trên video làm cho kết qua motion detection không hề giống nhau.
    - giao thức truyền video: RTP hay http, H264 hay MJPEG sẽ ảnh hưỡng tới kết quả. Thông thường RTP chạy không tốt vì nó truyền theo stream và mã hóa dựa trên IFrame do đó mà input data thường bị biến dạng, blur, răng cưa ... không ổn định.
    - tốc độ truyền video: trong video offline em thường có tốc độ rất ổn định khỏang 24-30 frame/s. Còn với ip camera thì tốc độ này nhiều khi chỉ là 6f/s tùy theo tốc độ mạng. Tốc độ sẽ ảnh hưỡng rất lớn tới kết quả vì input frame sẽ không liên tục, cái xe đi được 5m thì mới xuất hiện 1 lần trên video input thì làm sao thuật tóan track được :), làm sao background modeling họat động chính xác được?


    Trên đây là một vài ý cơ bản cho em thấy những điểm cần khắc phục. Đương nhiên là có những vấn đề hầu như không thể khác phục, có những vấn đề em có thể pass qua tùy theo mục tiêu và điều kiện em đang có.

    ReplyDelete
  54. em cảm ơn anh nhiều ! em cũng chỉ là tay ngang chưa được học căn bản về xử lý ảnh, nhưng lại được giao làm về vấn đề trên.nếu em có hỏi gì ngốc nghếch mong a bỏ qa :)

    ReplyDelete
  55. chỉ có thái độ ngốc nghếch và ngu dốt chứ không có câu hỏi ngốc nghếch. Câu hỏi của em cũng chính là sự khác biệt giữa lý thuyết và áp dụng thực tiễn. Khi em áp dụng các thuật tóan trên video, demo (lý thuyết, điều kiện lý tưởng) thì kết quả bao giờ cũng khác với thực tiễn, trên ứng dụng, thiết bị thực. Nếu có thắc mắc gì thì em hãy cứ trao đổi, nếu vấn đề nhỏ trả lời ngay được thì anh sẽ trả lời còn vấn đề rộng hơn thì anh sẽ cố gắng để có bài viết tương ứng trong khả năng. Chúc em thành công.

    ReplyDelete
  56. anh Bioz ơi, anh đã từng dùng opencv để lưu thành video chưa ? Em cũng dùng nhưng ko thể tạo được CvVideoWriter dùng hàm cvCreateVideoWriter. nó toàn trả về NULL ko.Em cảm ơn anh trước !

    ReplyDelete
  57. anh chưa dùng bao giờ, chắc sắp :), khi nào dùng sẽ trả lời, em fix được thì vui lòng share cho bà con.

    ReplyDelete
  58. Anh Bioz anh có bao giờ bị lỗi dưới đây chưa

    Microsoft Visual C++ Runtime Library
    Runtime Error!
    Program: C:\playback\myprogram.exe

    abnormal program termination.


    Em chạy chương trình tracking,chế biến từ blobtrack sample với camera thì khoảng 4-5 ngày là nó văng lỗi đó ,nhấn ok là chương trình dừng luôn..
    Nếu a biết lỗi đó thì chỉ e khi nào mà nó lại văng lỗi đó ra, Em sữa 6 tháng rồi mà vẫn chưa xong . hic hic ,mong anh giúp đỡ.

    ReplyDelete
  59. cho em hỏi là khi muốn truyền dữ liệu từ pc xuống vdk trong c++ (kết hợp xử lý ảnh) thì mình cần những gì hả anh? em tìm không thấy mscomm như trong visual basic hay serial port như trong c#

    ReplyDelete
  60. chào anh Bioz
    hiện nay e đang tìm hiểu về emgucv để làm đồ án
    đề bài e thế này:
    Chẳng hạn chúng ta có một camera giám sát trong
    hành lang, camera sẽ chuyển động trong một phạm vi nhất định. làm thế
    nào để xác định có vật thể nào (con người, xe,...) đi vào trong vùng
    quan sát hay không ?
    cách đơn giản là chúng ta lấy ảnh hiện tại trừ ảnh nền để biết phần
    sai khác và tiến hành xác định phần sai khác đó là gì. Nhưng muốn làm
    được ta phải làm sao xây dựng được ảnh nền trước. Đề tài này tập trung
    vào cách xây dựng ảnh nền.

    anh có thể hướng dẫn các giải thuật của bài này cho e được không?
    e thanks trước nha

    ReplyDelete
  61. Em vui lòng đọc comment ở trên. Chỉ nói thêm là camera của em được gọi là panning và tilting camera. Kỹ thuật cơ bản cho camera dạng này là người ta cố gắng xây dựng một panorama cho background rồi extract đối tượng, hoặc sử dụng trực tiếp các phương pháp như optical flow để detect motion, object detection để detect object chứ không thông qua background modelling.
    P/s: câu hỏi này có vẻ như là cái căn bản mà giảng viên hướng dẫn của em cần trả lời cho em.

    ReplyDelete
  62. anh ơi,cho e hỏi là,cái source của a trên đó muốn chạy được thì mình cần add thêm thư viện nào nữa anh,e không biết,xin a chỉ giùm

    ReplyDelete
  63. source trong trang sản phẩm em cứ lấy về compile và chạy, mọi thư viện cần thiết đã được copy và set up sẵn hết rồi.

    ReplyDelete
  64. anh Bình ơi cho em hỏi: Em đang dùng openCV để hiển thị hình ảnh được capture từ camera. Em muốn hiển thị hình ảnh đó lên một picture control thì em phải làm thế nào ạ?

    ReplyDelete
  65. Theo anh được biết opencv 2.2 trở đi có hỗ trợ hàm để hiện thị từ IPLImage sang picture control.Vấn đề của việc này chỉ là làm sao chuyển từ IPLImage sang doi tuong Bitmap hay Image được hỗ trợ bởi picture control, anh đã làm cái này rồi nhưng không biết để đâu nhưng biết chắc nó rất đơn giản, em thử search: IPLImage to bitmap hay sang doi tuong mà Picture control hỗ trợ. Thao tác này đơn giản là chuyển memory thôi :). Hãy thử, nếu em ko thể thì báo anh sẽ giúp cụ thể hơn,còn nếu giải quyết được thì post trả lời luôn lên đây :)

    ReplyDelete
  66. anh Bình ơi. cái phần hiển thị lên picture control thì em hiển thị được rồi, nhưng có điều là khi em chạy chương trình thì ngốn quá nhiều bộ nhớ của ram và đến khi tràn bộ nhớ thì nó báo lỗi, anh giúp em giải quyết vấn đề này với ạ. em tham khảo trên trang: http://wenku.baidu.com/view/517272ec102de2bd96058842.html
    Em cảm ơn anh. code này của em như sau: ngoài ra em không thêm gì hết nữa.
    ////////////////////////////////////////////////
    void CMyProMFCDlg::OnBnClickedCapture()
    {
    cvNamedWindow("LiveImage",0);
    HWND hWnd = (HWND)cvGetWindowHandle("LiveImage");
    HWND hparent = ::GetParent(hWnd);
    ::SetParent(hWnd,GetDlgItem(IDC_ShowImg)->m_hWnd);
    ::ShowWindow(hparent,SW_HIDE);

    CvCapture* camera;
    IplImage* cameracapture;

    while(1)
    {
    camera = cvCreateCameraCapture(0);
    cameracapture = cvQueryFrame(camera);
    cvShowImage("LiveImage",cameracapture);
    if(cvWaitKey(10)==27)
    break;
    }
    cvReleaseImage(&cameracapture);
    cvReleaseCapture(&camera);
    cvDestroyWindow("LiveImage");
    }

    ReplyDelete
  67. haizzzz cách này không phải đã được hướng dẫn trong bài viết của anh sao. Còn ví dụ thì em down cái project .cvs trong mục sản phẩm của IEEV,có sẵn 2 ví dụ khung cho xử lý video và hình. Hàng VN chất lượng cao không coi mà coi hàng tầu em.

    ReplyDelete
  68. anh ơi! cái ví dụ em tải về, em dịch nó không được, nó báo lỗi anh ạ. Nó báo lỗi ở thư viện #include afxcontrolbar.h anh ạ! em phải sửa thế nào hả anh. anh giúp em với. Anh cũng cho em hỏi luôn là có trường hợp em viết trên win32 console app khi biên dịch thì chạy được một thời gian chương trình báo lỗi do tràn bộ nhớ. em phải giải quyết thế nào ạ.

    ReplyDelete
  69. anh đảm bảo ví dụ đó là những ví dụ hoàn hảo nhất trên internet hiện nay cho những người mới và anh đã viết rất kỉ nên không thể có lỗi. Lỗi của em xuất phát từ việc em install bản VS 2008 express chứ không phải bản pro, full. Hoặc trong quá trình install em đã install thiếu MFC lib component. Để fix thì em chỉ việc kiếm VS bản full và install đầy đủ vào là ok.

    ReplyDelete
  70. This comment has been removed by the author.

    ReplyDelete
  71. anh vẫn chưa hiểu câu hỏi, em hãy nói rõ hơn.

    ReplyDelete
  72. anh Bình cho em hỏi với ạ! trong C++ (MFC) em muốn chuyển một kiểu số thực float về một chuỗi ký tự kiểu String thì em phải làm thế nào ạ. Em cảm ơn anh.

    ReplyDelete
  73. anh Bình cho em hỏi. Em có chương trình MFC để làm giao diện cho xử lý ảnh, khi em nhấn button để thoát chương trình ra mà chương trình của em không thoát ra được, muốn thoát toàn bộ chương trình thì em phải nhấn nút stop của MFC. Vậy em cần phải làm thế nào để thoát được chương trình MFC của em khi em nhấn button đó. Trong hàm của button đó em đã hủy bộ nhớ dùng cvRelease... và OnOK() mà không được anh ạ.
    Em cảm ơn anh.

    ReplyDelete
  74. em có thể download ví dụ CVs trong phần sản phẩm của IEEV để tham khảo. Về cơ bản thì lý do của việc này có thể là do em chưa end một xữ lý nào đó, hoặc bộ nhớ, thiết bị đang bị chiếm dụng. Vì vậy kiểm tra toàn bộ các xứ lý và đảm bảo tài nguyên được release, file được close, ... trong tình huống dùng nhiều thread, loop thì phải đảm bảo end loop và end thread bằng cách sử dụng kỹ thuật điều khiển bằng cờ, hay signal, hoặc event ....

    ReplyDelete
  75. nếu em hiểu bản chất của float và string thì vấn đề rất đơn giản. nên hiểu rằng dù là float hay string thì trong bộ nhớ cũng chỉ là số. điều cốt lõi nằm ở cách em ứng xử với giá trị số đó như thế nào?! và cấu trúc bộ nhớ cho 1 phần tử như thế nào?! Trong các ứng dụng unicode thì mỗi ký tự là 2byte, bình thường thì 1 byte. a thì trong bộ nhớ là 69 chẳng hạn (ví dụ đại loại thế) ... vậy nếu muốn chuyển từ mảng số thực sang chuỗi chỉ đơn giản là định ra cho mình một logic rồi copy giá trị từ bộ nhớ này sang bộ nhớ khác, một dạng ánh xạ thôi. Ví dụ sơ sơ: float b[10]; char c[10]; c[i] = hàm convert hay xu ly de dua gia tri float ve khoang gia tri ung voi char(b[i]); hay cung co the memcpy(c+i, b+i, n byte);

    anh chỉ vẻ đại ra thế hy vọng em hiểu ý và suy nghĩ cách cho mình.

    ReplyDelete
  76. Anh Bình cho em hỏi. Em có một chương trình sử dụng MFC, em muốn khi em nhấn nút start debugging trên mfc thì chương trình xử lý ảnh của em sẽ tự động chạy. Vậy em cần cho hàm xử lý ảnh của em nằm trong hàm nào của MFC ạ?
    Em cảm ơn anh.

    ReplyDelete
  77. anh đã tạo ra project CVs trong đó có các ví dụ mẫu cho xử lý ảnh và video bằng OpenCV. Em có thể học hỏi kinh nghiệm từ chúng. vì đây là những ví dụ rất rất đơn giản, nên em cần chịu khó xem code, debug để tự mình rút ra kinh nghiệm ... anh nghĩ rằng IEEV hỗ trợ tới mức như vậy là ko còn gì có thể hơn được rồi :)

    http://www.ieev.org/p/san-pham.html

    ReplyDelete
  78. anh Bình ơi, cho em hỏi password để giải nén file download ở mục sản phẩm là gì ạ? em cám ơn

    ReplyDelete
  79. trong trang sản phẩm em không chịu đọc cái quote, trong đó có thông tin để giải nén. Thật ra cũng mong mọi người thông cảm, sở dĩ có vụ pass là vì mục tiêu của hệ thống này trước mắt chỉ phục vụ cho người VN như một hệ thống kín.

    ReplyDelete
  80. anh Bình ơi cho e được hỏi ,e đang muốn 1 chương trình tự động load camera vào 1 cửa sổ ,rùi nhấn 1 button1 để capture lại ,e không biết giả quyết cho chương trình tự động chạy ( khi nhấn f5 debug )và capture từ 1 frame e , e không tìm dc cách nào để thoát khỏi vòng lặp while(1),a giúp e với!
    phan dialog thi e khai báo
    .....
    cvNamedWindow("LiveImage",0);
    HWND hWnd = (HWND)cvGetWindowHandle("LiveImage");
    HWND hparent = ::GetParent(hWnd);
    ::SetParent(hWnd,GetDlgItem(IDC_ShowImg)->m_hWnd);
    ::ShowWindow(hparent,SW_HIDE);

    process ()
    {
    CvCapture* camera;
    IplImage* cameracapture;
    int flag=1;
    while(1)
    {
    camera = cvCreateCameraCapture(0);
    cameracapture = cvQueryFrame(camera);
    cvShowImage("LiveImage",cameracapture);
    if(cvWaitKey(10)==27)
    break;
    }
    cvReleaseImage(&cameracapture);
    cvReleaseCapture(&camera);
    cvDestroyWindow("LiveImage");
    }
    ::button1()
    process();

    ReplyDelete
  81. điều đầu tiên anh muốn em nhớ là mọi điều khiển trong một hệ thống bất đồng bộ (multithread) đều thông qua flag, event, interrupt, message.
    Nhớ điều đó em sẽ thấy, ở đây process với while có thể coi là một thread, interface và các sự kiện tương tác trên đó có thể coi là (nôm na coi là) một thread khác. Vậy câu hỏi sẽ được đưa về thành: làm thế nào để khi raise một event, change value của một flag, send message, tạo ngắt trong thread này mà thread kia bắt được và hiểu? Ví dụ nếu ta dùng Flag, vậy flag phải là một biến khai báo toàn cục sao cho cả hai thread đều truy xuất được khi đó chương trình sẽ đại loại như sau:

    flag = 1;

    process()
    {
    flag = 1;
    while(flag != 0)
    {
    ... create capture;
    ... query frame from camera;
    if(flag == 2)
    {
    ... save image, dung cvImgSave đại loại vậy
    flag = 1;
    }
    ...
    }
    }

    EventClickButtonCancel(){
    flag = 0;
    }
    EventClickButtonSave(){
    flag = 2;
    }

    hy vọng em hiểu, các phương pháp phức tạp hơn thì em tự tìm hiểu để nâng cao.

    ReplyDelete
  82. anh Bình ơi! e muốn là 1 giao diện để tiện quan sát kết quả ngỏ vào input của bãi giữ xe, e seach thì thấy người ta dùng datadrid ,e chỉ muốn gồm 4 cột thui! cot 1 stt, cot 2 ngày, cột 3 là giờ và cột 4 là số xe sau khi nhận dạng. a có bài hướng dẫn nào về cái đó kg? giúp e với! ah e còn phải tạo 1 csdl để đối chiếu thông tin ở output nưa!e định lưu biển số xe vào .txt để so sánh đối chiếu,a thấy dc kg?hay phải truy xuất bên asscess! thân

    ReplyDelete
  83. mấy cái này khá dễ em chỉ việc vào codeproject và tìm bài viết về datagrid là có hàng tá các source code trong đó.

    ReplyDelete
  84. Em down source nhưng e ko thấy pass để giải nén anh nhi

    ReplyDelete
  85. chào anh.
    Em đang làm : nhận dạng người đi qua khung hình.
    em chưa biết phải định hướng ntn anh có thể giúp em được không ạ. cảm ơn anh nhiều

    ReplyDelete

chia sẻ cho chúng tôi ý tưởng hay khó khăn của bạn ...

All Rights Reserved by IEEV © 2009 - 2016
Powered By Blogger, Designed by Sweetheme

Contact Form

Name

Email *

Message *

Powered by Blogger.