Thông báo

Collapse
No announcement yet.

Sử dụng OpenCV trong Visual C++ 2008

Collapse
X
 
  • Lọc
  • Giờ
  • Show
Clear All
new posts

  • #46
    Nguyên văn bởi tomathang Xem bài viết
    Mình đang viết luận văn về phát hiện mặt người sử dụng haar-like boosting.
    Mình đã làm được tới bước trích ra các đặc trưng từ tập ảnh mẫu huấn luyện (có mặt, không có mặt) và lưu vào 1 file .txt
    Bạn nào giúp mình cách dùng lệnh Haartraining trong opencv để huấn luyện và lưu vào file .XML với.
    Mình tìm tài liệu mà không thấy, chỉ thấy ebook Learning OpenCV nói về hàm haartraining() mà không nói rõ hơn.
    (OpenCv 2.1 + vs 2008).
    Cám ơn nhiều.
    chào bạn.file .xml dùng để nhận dạng khuôn mặt thì trong openCV/data đã có sẵn bạn chỉ cần lấy ra và sử dụng.
    còn đây là code nhận dạng khuôn mặt sử dụng win32 ko dùng MFC rất dễ hiểu bạn có thể tham khảo.

    #include "cv.h"
    #include "highgui.h"

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <assert.h>
    #include <math.h>
    #include <float.h>
    #include <limits.h>
    #include <time.h>
    #include <ctype.h>
    #include <iostream>

    // Create a string that contains the exact cascade name
    const char* cascade_name =
    "C:/OpenCV2.1/data/haarcascades/haarcascade_frontalface_alt2.xml"; //lựa chọn đường dẫn cho phù hợp
    /* "haarcascade_profileface.xml";*/


    // Function prototype for detecting and drawing an object from an image
    void detect_and_draw( IplImage* image );
    int dem=0;
    // Main function, defines the entry point for the program.
    int main( int argc, char** argv )
    {

    // Create a sample image
    IplImage *img = cvLoadImage("D:\\1.jpg"); // bạn có thể thay đổi đường dẫn cho phù hợp với ảnh bạn cần nhận dạng

    // Call the function to detect and draw the face positions
    detect_and_draw(img);

    // Wait for user input before quitting the program
    cvWaitKey();

    // Release the image
    cvReleaseImage(&img);
    std::cout << "co tat ca"<<dem << " nguoi//";
    // Destroy the window previously created with filename: "result"
    cvDestroyWindow("result");
    //MessageBox(dem);

    // return 0 to indicate successfull execution of the program
    system("pause");
    return 0;
    }

    // Function to detect and draw any faces that is present in an image
    void detect_and_draw( IplImage* img)
    {

    // Create memory for calculations
    static CvMemStorage* storage = 0;

    // Create a new Haar classifier
    static CvHaarClassifierCascade* cascade = 0;

    int scale = 1;

    // Create a new image based on the input image
    IplImage* temp = cvCreateImage( cvSize(img->width/scale,img->height/scale), 8, 3 );

    // Create two points to represent the face locations
    CvPoint pt1, pt2;
    int i;

    // Load the HaarClassifierCascade
    cascade = (CvHaarClassifierCascade*)cvLoad( cascade_name, 0, 0, 0 );

    // Check whether the cascade has loaded successfully. Else report and error and quit
    if( !cascade )
    {
    fprintf( stderr, "ERROR: Could not load classifier cascade\n" );
    return;
    }

    // Allocate the memory storage
    storage = cvCreateMemStorage(0);

    // Create a new named window with title: result
    cvNamedWindow( "result", 1 );

    // Clear the memory storage which was used before
    cvClearMemStorage( storage );

    // Find whether the cascade is loaded, to find the faces. If yes, then:
    if( cascade )
    {

    // There can be more than one face in an image. So create a growable sequence of faces.
    // Detect the objects and store them in the sequence
    CvSeq* faces = cvHaarDetectObjects( img, cascade, storage,
    1.1, 2, CV_HAAR_DO_CANNY_PRUNING,
    cvSize(40, 40) );

    // Loop the number of faces found.
    for( i = 0; i < (faces ? faces->total : 0); i++ )
    {
    // Create a new rectangle for drawing the face
    CvRect* r = (CvRect*)cvGetSeqElem( faces, i );

    // Find the dimensions of the face,and scale it if necessary
    pt1.x = r->x*scale;
    pt2.x = (r->x+r->width)*scale;
    pt1.y = r->y*scale;
    pt2.y = (r->y+r->height)*scale;

    // Draw the rectangle in the input image
    cvRectangle( img, pt1, pt2, CV_RGB(255,0,0), 3, 8, 0 );
    dem++;
    }
    }

    // Show the image in the window named "result"
    cvShowImage( "result", img );

    // Release the temp image created.
    cvReleaseImage( &temp );
    }

    Comment


    • #47
      Cám ơn huypyvn, nhưng bài báo cáo mình cần làm theo từng bước: 1- trích đặc trưng, 2-huấn luyện từ file chứa đặc trưng, 3-dectect.
      File XML trong Opencv có sẵn là tối ưu và chính xác cao để phát hiện, nhưng mình cần huấn luyện lưu vào file xml từ file text chứa đặc trưng như mình nói trên.
      Vì file text chứa đặc trưng này mình sẽ dùng nhiều thuật toán khác nhau để huấn luyện (Adaboost, SVM) nên mình mới làm từng bước để so sánh kết quả giữa các thuật toán.

      Comment


      • #48
        bạn tomathang có thể tham khảo ở các trang web sau:
        http://www.shervinemami.info/faceRecognition.html
        http://www.cognotics.com/opencv/serv...t_4/index.html

        Comment


        • #49
          Chào các bác! Em sang kỳ tới là làm đồ án tốt nghiệp,em định xử lý ảnh dùng ARM cho robot. Bác nào có tài liệu giúp em với ạ.
          Thanks các bác!

          Comment


          • #50
            Các bác cho em hỏi,muốn học xử lý ảnh thì bắt đầu từ đâu ạ,thấy nó hay quá mà không biết học như thế nào,em chưa biết gì về nó cả
            ĐẠI HỌC SƯ PHẠM KỸ THUẬT I

            Nợ cha một sự nghiệp - Nợ mẹ một nàng dâu

            Comment


            • #51
              Với những bài tut cơ bản của anh nthung2002 và những ý tưởng từ anh compvis em cũng đã hoàn thành sơ bộ project detect vật cản vả đạc khoảng cách(trong tầm <70 cm). Tuy nhiên khoảng cách này hoàn toàn là phải đo đạc rồi tìm hàm nội suy, chứ công thức Z = fx*D/(Xright-Xleft) cho kết quả không được đúng (đã thử nhiều phương án, quan hệ này không được tuyến tính). Đây là video của em, một lần nữa cảm ơn hai anh:

              Comment


              • #52
                Chào a 'ooooo' !! e cũng đang tìm hiểu về vấn đề đo khảng cách sử dụng opencv.e rât ấn tượng với clip của a.Liệu a có thể post đoạn code lên diẽn đàn để mọi người tham khảo được không ạ?
                Chân thành cảm ơn a nhiều!!

                Comment


                • #53
                  Hiện tại chưa được bạn ơi.
                  Tuy nhiên kiến thức chủ yếu nằm trong hai chương 11, 12 của cuốn Learning OpenCV Computer Vision with the OpenCV Library
                  Bạn cũng có thể tham khảo link sau: http://www.pages.drexel.edu/~nk752/distanceTut.html
                  và ở đây: http://sites.google.com/site/todddan...m_laser_ranger

                  Chúc bạn thành công!
                  Last edited by ooooo; 24-05-2011, 10:40.

                  Comment


                  • #54
                    Nguyên văn bởi ooooo Xem bài viết
                    Hiện tại chưa được bạn ơi.
                    Tuy nhiên kiến thức chủ yếu nằm trong hai chương 11, 12 của cuốn Learning OpenCV Computer Vision with the OpenCV Library
                    Bạn cũng có thể tham khảo link sau: http://www.pages.drexel.edu/~nk752/distanceTut.html
                    và ở đây: http://sites.google.com/site/todddan...m_laser_ranger
                    Chúc bạn thành công!
                    Thanks bác nhiều. Có j khó khăn mong anh và mọi người giúp đỡ.

                    Comment


                    • #55
                      Nguyên văn bởi ooooo Xem bài viết
                      Với những bài tut cơ bản của anh nthung2002 và những ý tưởng từ anh compvis em cũng đã hoàn thành sơ bộ project detect vật cản vả đạc khoảng cách(trong tầm <70 cm). Tuy nhiên khoảng cách này hoàn toàn là phải đo đạc rồi tìm hàm nội suy, chứ công thức Z = fx*D/(Xright-Xleft) cho kết quả không được đúng (đã thử nhiều phương án, quan hệ này không được tuyến tính). Đây là video của em, một lần nữa cảm ơn hai anh:

                      Congratulations ! Những việc làm của em làm tôi liên tưởng tới bản thân mình ngày xưa. Nghĩ là quyết tâm làm bằng được. Không phải cảm ơn tôi em nhé. Nghiên cứu khoa học là phải say sưa, tự mày mò đủ thứ. Thành quả đạt được sẽ là động lực cho những công việc tiếp theo. Xin chúc mừng em !

                      Em có thể nâng bài toán lên tầm cao hơn khi cameras của em chuyển động (áp dụng cho robot).
                      Last edited by compvis; 25-05-2011, 20:58.

                      Comment


                      • #56
                        Nguyên văn bởi dds1988 Xem bài viết
                        Chào a 'ooooo' !! e cũng đang tìm hiểu về vấn đề đo khảng cách sử dụng opencv.e rât ấn tượng với clip của a.Liệu a có thể post đoạn code lên diẽn đàn để mọi người tham khảo được không ạ?
                        Chân thành cảm ơn a nhiều!!
                        NOT recommended

                        Comment


                        • #57
                          @ooooo: Rất tuyệt vời chúc mừng bạn
                          Bể học vô biên

                          Comment


                          • #58
                            Các bạn cho mình hỏi chút về opencv nhé! định lập topic nhưng sợ admin la. hehe!!!

                            ai tìm hiểu về opencv giải thích chút về cấu trúc CvSeg đi! đọc hoài mà không hiểu:

                            typedef struct CvSeq {
                            int flags; // miscellaneous flags
                            int header_size; // size of sequence header
                            CvSeq* h_prev; // previous sequence
                            CvSeq* h_next; // next sequence
                            CvSeq* v_prev; // 2nd previous sequence
                            CvSeq* v_next // 2nd next sequence
                            int total; // total number of elements
                            int elem_size; // size of sequence element in byte
                            char* block_max; // maximal bound of the last block
                            char* ptr; // current write pointer
                            int delta_elems; // how many elements allocated

                            // when the sequence grows

                            CvMemStorage* storage; // where the sequence is stored
                            CvSeqBlock* free_blocks; // free blocks list
                            CvSeqBlock* first; // pointer to the first sequence block
                            }

                            cấu trúc này thấy khá quan trọng và dùng nhiều nhưng mình hiểu nó mơ hồ quá, mong các bạn giúp đỡ!!

                            Comment


                            • #59
                              có ai đi ngang qua mà biết giải thích giùm mình tí đi!!

                              Comment


                              • #60
                                Nguyên văn bởi vinachip Xem bài viết
                                Các bạn cho mình hỏi chút về opencv nhé! định lập topic nhưng sợ admin la. hehe!!!

                                ai tìm hiểu về opencv giải thích chút về cấu trúc CvSeg đi! đọc hoài mà không hiểu:

                                typedef struct CvSeq {
                                int flags; // miscellaneous flags
                                int header_size; // size of sequence header
                                CvSeq* h_prev; // previous sequence
                                CvSeq* h_next; // next sequence
                                CvSeq* v_prev; // 2nd previous sequence
                                CvSeq* v_next // 2nd next sequence
                                int total; // total number of elements
                                int elem_size; // size of sequence element in byte
                                char* block_max; // maximal bound of the last block
                                char* ptr; // current write pointer
                                int delta_elems; // how many elements allocated

                                // when the sequence grows

                                CvMemStorage* storage; // where the sequence is stored
                                CvSeqBlock* free_blocks; // free blocks list
                                CvSeqBlock* first; // pointer to the first sequence block
                                }
                                cấu trúc này thấy khá quan trọng và dùng nhiều nhưng mình hiểu nó mơ hồ quá, mong các bạn giúp đỡ!!
                                @vinachip: đây là một dạng cấu trúc (có thể định nghĩa theo dạng class - lớp) mà trong c,c++ người ta gọi nó là "Linked List". Cấu trúc này được sử dụng với dạng dữ liệu phức hợp và vì thế nó cũng rất phức tạp trong định nghĩa và sử dụng. Nếu bạn có kiến thức tốt về c,c++ thì bạn sẽ hiểu rõ. Bạn có thể tham khảo các link dưới đây:

                                http://www.inversereality.org/tutori...nkedlists.html
                                http://locklessinc.com/articles/flexible_lists_in_cpp/
                                http://www.dreamincode.net/code/snippet82.htm
                                ... and so on...
                                You could Google it


                                Trong OpenCV, sử dụng con trỏ CvSeq như một mảng để chứa các phần tử. Để hiểu rõ nhất về CvSeq, bạn hãy làm một ví dụ nhỏ với cvFindContours. Một link tôi cho là khá hay về cvFindContours mà bạn có thể tham khảo:
                                http://guitarhero-opencv.googlecode....n/trunk/cv.cpp

                                Comment

                                Về tác giả

                                Collapse

                                nthung2002 Tìm hiểu thêm về nthung2002

                                Bài viết mới nhất

                                Collapse

                                Đang tải...
                                X