Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 78 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
78
Dung lượng
15,78 MB
Nội dung
1 LỜI NÓI ĐẦU Trong năm gần đây, giới nghiên cứu ứng dụng công nghệ xử lý nhận dạng ảnh hướng nghiên cứu tập trung nhiều nhà khoa học lĩnh vực Từ năm 1970 mà lực tính tốn máy tính ngày trở nên mạnh mẽ hơn, máy tính lúc xử lý tập liệu lớn hình ảnh, đoạn video khái niệm xử lý ảnh đời là: Thị giác máy - Computer vision.Có thể nói xử lý ảnh số thị giác máy phát triển trở thành lĩnh vực khoa học Xử lý ảnh số không nâng cao chất lượng ảnh mà phân tích lý giải tìm giải thuật để ứng dụng vào thực tiễn Thị giác máy bao gồm lý thuyết kỹ thuật liên quan nhằm mục đích tạo hệ thống nhân tạo tiếp nhận thơng tin từ hình ảnh thu tạp liệu đa chiều Việc kết hợp thị giác máy với kỹ thuật khác công nghệ thông tin, truyền thông, điện tử, điều khiển tự động, khí… cho nhiều ứng dụng đời sống hàng ngày khoa học, an ninh, y học, quân sự… Ngày nay, ứng dụng thị giác máy trở nên rộng lớn đa dạng, len lỏi vào lĩnh vực từ quân sự, khoa học, vũ trụ, y học, sản xuất, tự động hóa tịa nhà Trong thời gian qua hướng dẫn tận tình Cơ HÀ THỊ KIM DUYÊN em dành thời gian nghiên cứu xử lý ảnh nhận dạng ảnh hay nói thuật tốn xử lý ảnh bám đối tượng – Tracking Những nội dung mà em nghiên cứu bao gồm: • • C • Nghiên cứu tổng quan xử lý ảnh số hệ bám đối tượng Tìm hiểu nghiên cứu thư viện mã nguồn mở OpenCV Nghiên cứu xây dựng thuật toán bám ảnh di động tối ưu dựa thư viện mã nguồn mở OpenCV Intel • Xây dựng hệ thống camera di động (phần cứng lẫn phần mềm) bám theo mục tiêu di dộng ứng dụng thuật tốn bám ảnh Camshitf • Đánh giá kết đạt thời gian nghiên cứu Để hoàn thành đồ án tiến độ có chất lượng, em xin gửi lời cảm ơn chân thành tới Cô Th.s HÀ THỊ KIM DUYÊN người trực tiếp hướng dẫn em làm đồ án Đồng thời em xin gửi lời cảm ơn sâu sắc tới anh, bác phòng Quang – điện tử, Viện vật lý – Viện khoa học công nghệ Việt Nam tạo điều kiện tối đa giúp đỡ em mặt thiết bị dụng cụ thí nghiệm phục vụ q trình làm đồ án Và cuối cùng, chúng em xin dành tất lịng biết ơn kính trọng sâu sắc tới bố mẹ chúng em, người sinh thành, nuôi dưỡng chúng em nên người, lo lắng, bảo từ việc nhỏ nhất, tạo điều kiện cho chúng em sống học tập cách tốt để vươn tới ước mơ hoài bão Em xin chân thành cảm ơn! Hà nội ngày 28 tháng năm 2019 Sinh viên thực Chương 1: TỔNG QUAN VỀ XỬ LÝ ẢNH VÀ HỆ THỐNG BÁM ĐỐI TƯỢNG 1.1Tổng quan xử lý ảnh Xử lý ảnh bao gồm lý thuyết kỹ thuật liên quan nhằm mục đích tạo hệ thống nhân tạo tiếp nhận thơng tin từ hình ảnh thu tập liệu đa chiều Đối với người chúng ta, q trình “học” thơng qua giới bên ngồi điều dễ dàng Q trình nhận thức “học” thơng qua q trình sống người Tuy nhiên với vật vô tri vô giác máy tính, robot… điều thực bước tiến gian nan Các thiết bị ngày không nhận thơng tin dạng tín hiệu đơn lẻ mà cịn có “nhìn” thật với giới bên ngồi Cái “nhìn” qua q trình phân tích, kết hợp với mơ máy học, mạng nơron… giúp cho thiết bị tiến dần tới hệ thống nhân tạo có khả định linh hoạt đắn nhiều Một số lĩnh vực ứng dụng công nghệ xử lý ảnh mang tính đột phá sau: 1.1.1 Trong lĩnh vực quân Các hệ thống tích hợp quang hồng ngoại có khả tự động điều khiển dàn hỏa lực (pháo, tên lửa) lắp đặt cho trận địa cao xạ, xe tăng, tàu chiến, máy bay, tên lửa vệ tinh (Hình 1.1) Chúng thay hỗ trợ dàn rada dễ bị nhiễu việc tự động phát hiện, cảnh giới, bám bắt mục tiêu Đặc biệt có loại lắp máy bay có khả điều khiển hỏa lực đánh phá hàng chục mục tiêu lúc Ngồi cịn phải kể đến đầu tự dẫn tên lửa đạn thông minh 1.1.2 Trong an ninh, phòng chống tội phạm, bảo vệ pháp luật Các hệ thống camera nhận dạng khuôn mặt vân tay tự động phát hiện, theo dõi, cảnh báo âm mưu hoạt động khủng bố Các xe robốt tự hành có gắn camera ứng dụng mơi trường độc hại, dị phá bom mìn (Hình 1.1) 1.1.3 Trong lĩnh vực hàng khơng vũ trụ Các hệ thống ống kính chụp ảnh viễn thám (remote sensing) lắp vệ tinh bay quanh trái đất chụp quan sát vật kích cỡ 0,5 m từ độ cao 750 km điều kiện thời tiết (Hình 1.1) Việc nối ghép ống kính với hệ thống GPS cho phép xây dựng đồ số có lĩnh vực ứng dụng quan trọng quốc phòng an ninh, phát triển kinh tế, xã hội 1.1.4 Trong công nghiệp, giao thông, xây dựng Hệ thống quang điện tử đóng vai trị thị giác máy (machine vision) có khả tự động đo đạc kiểm tra chất lượng sản phẩm dây truyền sản xuất: phân loại hạt ngũ cốc, cà phê; tìm lỗi lắp ráp linh kiện vi mạch khuyết tật mối hàn động Các hệ thống quang điện tử ứng dụng ngày nhiều giao thông đo tốc độ, tự động kiểm soát điều khiển phân luồng giao thơng (Hình 1.2) 1.1.5 Trong nghiên cứu y sinh dược học Các kính hiển vi có khả tự động nhận dạng đo đếm tế bào với độ xác cao Các kính hiển vi có hệ thống dẫn đường laser cho phép thực phẫu thuật phức tạp mổ u não, nơi mà khơng xác cỡ μm gây tổn hại đến dây thần kinh chằng chịt xung quanh 1.1.6 Trong cơng nghiệp giải trí truyền hình Các hệ thống tích hợp điều khiển camera kích thước khối lượng lớn dễ dàng tự động bám theo đối tượng chuyển động nhanh bóng bay, đua xe Hình 1.1: Một số hệ thống tích hợp quang-điện tử ảnh nhiệt quân chiến đấu Hình 1.2: Một số hệ thống tích hợp camera giám sát tàu viễn thám cơng nghiệp cơng nghệ vũ trụ Hình 1.3: Hệ thống camera điện tử ứng dụng nghiên cứu thời tiết công nghiệp 1.2 Giới thiệu chung Robot Rô bốt (robot) hay người máy loại máy thực cơng việc cách tự động điều khiển gián tiếp qua máy tính Rơ bốt tác nhân khí, nhân tạo, thường hệ thống khí-điện tử kết hợp hoàn hảo.Với xuất chuyển động mình, rơ bốt gây cho người cảm giác có giác quan người Từ “rô bốt” (người máy) thường hiểu với hai nghĩa cấu khí xác phần mềm tự hoạt động.Về lĩnh vực người máy Nhật Bản đầu lĩnh vực Ngày nay, Rô bốt tâm điểm cách mạng lớn sau Internet Rô bốt ngày sử dụng rộng rãi công nghiệp, y tế, giáo dục đào tạo, giải trí an ninh quốc phịng, thám hiểm khơng gian Rơ bốt sản phẩm cơng nghệ có độ phức tạp cao chứa hàm lượng tri thức vô phong phú tất cac lĩnh vực khoa học công nghệ Ngày người ta tranh cãi vấn đề “Một loại máy đủ tiêu chuẩn để coi rơ bốt???” Một cách gần xác, rơ bốt phải có vài (khơng thiết phải đầy đủ) đặc điểm sau đây: Không phải tự nhiên, tức người chế tạo Có khả nhận biết mơi trường xung quanh Có thể tương tác với vật thể mơi trường Có thơng minh có khả đưa lựa chọn dựa môi trường hoạt động theo chu trình lập trình sẵn Có khả điều khiển lệnh để thay đổi tùy theo yêu cầu người sử dụng Có thể di chuyển quay tịnh tiến chiều hay nhiều chiều Có khéo léo vận động 1.3 Giới thiệu tổng quan hệ thống rô bốt camera bám đối tượng (Tracking mobile robot) Hệ thống rô bốt hoạt động cảm biến cảm biến màu sắc, hồng ngoại, cảm biến dò đường, siêu âm phát triển tích hợp thêm “thị giác”.Với phát triển khoa học công nghệ, việc tích hợp rơ bốt hệ thống camera thông minh ứng dụng công nghệ xử lý ảnh cần thiết phục vụ cho cơng nghiệp, quốc phịng xã hội Hệ thống thị giác phân thành lớp, theo cấu trúc hệ, hệ có camera gắn cố định hệ có camera gắn tay máy (eye-in-hand) Trong hệ camera cố định, camera gắn cố định so với hệ trục tọa độ thực, thu thập ảnh mục tiêu môi trường Mục tiêu hệ camera cố định cung cấp tín hiệu điều khiển cho tay máy đặt vị trí mong muốn Mục đích cấu trúc eye-in-hand điều khiển tay máy cho ảnh mục tiêu di động cố định trì vị trí mong muốn mặt phẳng ảnh thu Máy tính Camera Robot Tín hiệu điều khiển Hình 1.4: Cấu trúc hệ camera cố định điều khiển giám sát cánh tay rô bốt camera Vật thể cần giám sát Robot eye-in-hand Hình 1.5: Cấu trúc hệ Camera rô bốt eye-in-hand Các nghiên cứu môi trường động bị bỏ xa so với môi trường tĩnh ảnh hưởng lớn tốc độ tinh toán độ chinh xác việc phân tích ảnh Do có nhiều thuật tốn để cải thiện tốc độ xử lý ảnh cải thiện can nhiễu trình thu thập liệu từ camera Một khó khăn thách thức thị giác máy việc phân loại đối tượng rô bốt phải đối mặt với nhiều đối tượng khác nhau, đối tượng quan tâm cịn đối tượng khác khơng Để nhận biết vị trí mục tiêu mơi trường động, đặc trưng mục tiêu quan trọng Các điểm lỗ, góc cạnh, đặc điểm điển hình dễ dàng tính tốn xử lý mơi trường tĩnh, mơi trường động khó chi phí thời gian lớn, ảnh hưởng tốc độ làm cho việc xử lý ảnh tách lấy đặc trưng đối tượng khó Bài tốn bám mục tiêu di động với quỹ đạo trước yêu cầu phải giữ đối tượng vị trí định mặt phẳng ảnh Thuật toán CamShift OpenCV sử dụng để tính tốn tọa độ trọng tâm đối tượng mặt phẳng ảnh Một số hệ thống tracking rô bốt thực tế triển khai: Hình 1.6: PAN robot Robot Pops (nguồn: www.mobilerobot.org) Hình 1.7: Robot Talon Robot MARRS (nguồn Internet) Hình 1.8: Robot thám hiểm hỏa Robot MIDbo Ngày việc xây dựng hệ thống rơ bốt thơng minh có khả thay người làm việc điều kiện khắc nghiệt nguy hiểm cần 10 thiết, đơn cử việc làm việc hầm mỏ nhà máy hạt nhân vùng nguy hiểm bom mìn…thì rơ bốt hoàn toàn hữu dụng lựa chọn tối ưu Với mục tiêu hướng tới xây dựng hệ thống rơ bốt camera thơng minh phục vụ cơng tác dị mìn cứu trợ cứu nạn, có khả thám, tơi tìm hiểu vào nghiên cứu chế tạo hệ tracking thơng minh có khả tự hành bám mục tiêu di động dựa công nghệ xử lý ảnh có giao tiếp kiểm sốt, lưu trữ thơng tin máy tính Có thể hệ thống lại rằng, hệ thống bám đối tượng bao gồm: LOS Đế cảm biến ảnh Bộ xử lý Mục tiêu Hình 1.9: Cảm biến ảnh, gimbal vi xử lý Hình 1.10: Tổng quan hệ thống bám Mục đích hệ thống bám video, ảnh tự động trì đường ngắm viết tắt LOS (Line Of Sight) cảm biến – mục tiêu cách ổn định hoàn toàn 64 int track_object = 0; int show_hist = 1; CvPoint origin; CvRect selection; CvRect track_window; CvBox2D track_box; // Meanshift¸ CvConnectedComp track_comp; int hdims = 50; // float hranges_arr[] = {0,180};// float* hranges = hranges_arr;// int vmin = 10, vmax = 256, smin = 30; int pointx, pointy; class CAboutDlg : public CDialog { public: CAboutDlg(); // Dialog Data //{{AFX_DATA(CAboutDlg) enum { IDD = IDD_ABOUTBOX }; //}}AFX_DATA / ClassWizard generated virtual function overrides //{{AFX_VIRTUAL(CAboutDlg) protected: virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support //}}AFX_VIRTUAL / Implementation protected: //{{AFX_MSG(CAboutDlg) virtual void OnOK(); //}}AFX_MSG DECLARE_MESSAGE_MAP() }; CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD) { //{{AFX_DATA_INIT(CAboutDlg) //}}AFX_DATA_INIT } void CAboutDlg::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); 65 //{{AFX_DATA_MAP(CAboutDlg) //}}AFX_DATA_MAP } BEGIN_MESSAGE_MAP(CAboutDlg, CDialog) //{{AFX_MSG_MAP(CAboutDlg) //}}AFX_MSG_MAP END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // COpencvUIDlgDlg dialog COpencvUIDlgDlg::COpencvUIDlgDlg(CWnd* pParent /*=NULL*/) : CDialog(COpencvUIDlgDlg::IDD, pParent) { //{{AFX_DATA_INIT(COpencvUIDlgDlg) / NOTE: the ClassWizard will add member initialization here //}}AFX_DATA_INIT / Note that LoadIcon does not require a subsequent DestroyIcon in Win32 m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); } void COpencvUIDlgDlg::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); // {{AFX_DATA_MAP(COpencvUIDlgDlg) / NOTE: the ClassWizard will add DDX and DDV calls here //}}AFX_DATA_MAP } BEGIN_MESSAGE_MAP(COpencvUIDlgDlg, CDialog) //{{AFX_MSG_MAP(COpencvUIDlgDlg) ON_WM_SYSCOMMAND() ON_WM_PAINT() ON_WM_QUERYDRAGICON() ON_WM_TIMER() ON_BN_CLICKED(IDC_OPENCAMERA, OnOpencamera) ON_BN_CLICKED(IDC_CLOSECAMERA, OnClosecamera) ON_BN_CLICKED(IDC_GRABFRAME, OnGrabframe) ON_BN_CLICKED(IDC_SAVEMOVIE, OnSavemovie) ON_BN_CLICKED(IDC_STOPSAVEMOVIE, OnStopsavemovie) ON_BN_CLICKED(IDC_STARTTRACKING, OnStarttracking) ON_BN_CLICKED(IDC_STOPTRACKING, OnStoptracking) ON_WM_MOUSEMOVE() ON_WM_LBUTTONDOWN() ON_WM_LBUTTONUP() 66 //}}AFX_MSG_MAP END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // COpencvUIDlgDlg message handlers BOOL COpencvUIDlgDlg::OnInitDialog() { CDialog::OnInitDialog(); / Add "About " menu item to system menu / IDM_ABOUTBOX must be in the system command range ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX); ASSERT(IDM_ABOUTBOX < 0xF000); CMenu* pSysMenu = GetSystemMenu(FALSE); if (pSysMenu != NULL) { CString strAboutMenu; strAboutMenu.LoadString(IDS_ABOUTBOX); if (!strAboutMenu.IsEmpty()) { pSysMenu->AppendMenu(MF_SEPARATOR); pSysMenu>AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu); } } / Set the icon for this dialog The framework does this automatically / when the application's main window is not a dialog SetIcon(m_hIcon, TRUE); // Set big icon SetIcon(m_hIcon, FALSE); // Set small icon // TODO: Add extra initialization here pwnd = GetDlgItem(IDC_SHOWPIC); pwnd->MoveWindow(35,30,640,480); pDC =pwnd->GetDC(); //pDC =GetDC(); hDC= pDC->GetSafeHdc(); pwnd->GetClientRect(&rect); CDC MemDC; CBitmap m_Bitmap1; m_Bitmap1.LoadBitmap(IDB_BLANK); 67 MemDC.CreateCompatibleDC(NULL); MemDC.SelectObject(&m_Bitmap1); //CClientDC dc(this); pDC>StretchBlt(rect.left,rect.top,rect.Width(),rect.Height(),&MemDC,0,0,48,48,SR CCOPY); m_Bitmap1.DeleteObject(); MemDC.DeleteDC(); b_flagProcess=0; Invalidate(); SetDlgItemText(IDC_EDIT_TIME,"Stop"); SetDlgItemText(IDC_EDIT_FRAME_WIDTH,"Stop"); SetDlgItemText(IDC_EDIT_FRAME_HEIGHT,"Stop"); SetDlgItemText(IDC_EDIT_FPS,"Stop"); SetDlgItemText(IDC_EDIT_FOURCC,"Stop"); SetDlgItemText(IDC_EDIT_FRAME_COUNT,"Stop"); SetDlgItemText(IDC_EDIT_X,"Stop"); SetDlgItemText(IDC_EDIT_Y,"Stop"); SetDlgItemText(IDC_EDIT_Z,"Stop"); ////////////////////////////////////////////////////// return TRUE; // return TRUE unless you set the focus to a control } void COpencvUIDlgDlg::OnSysCommand(UINT nID, LPARAM lParam) { if ((nID & 0xFFF0) == IDM_ABOUTBOX) { CAboutDlg dlgAbout; dlgAbout.DoModal(); } else { CDialog::OnSysCommand(nID, lParam); } } / If you add a minimize button to your dialog, you will need the code below / to draw the icon For MFC applications using the document/view model, / this is automatically done for you by the framework void COpencvUIDlgDlg::OnPaint() { if (IsIconic()) 68 { CPaintDC dc(this); // device context for painting SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0); // Center icon in client rectangle int cxIcon = GetSystemMetrics(SM_CXICON); int cyIcon = GetSystemMetrics(SM_CYICON); CRect rect; GetClientRect(&rect); int x = (rect.Width() - cxIcon + 1) / 2; int y = (rect.Height() - cyIcon + 1) / 2; / Draw the icon dc.DrawIcon(x, y, m_hIcon); } else { CDialog::OnPaint(); } if (!b_flagProcess) { CDC MemDC; CBitmap m_Bitmap1; m_Bitmap1.LoadBitmap(IDB_BLANK); MemDC.CreateCompatibleDC(NULL); MemDC.SelectObject(&m_Bitmap1); //CClientDC dc(this); pDC>StretchBlt(rect.left,rect.top,rect.Width(),rect.Height(),&MemDC,0,0,48,48,SR CCOPY); m_Bitmap1.DeleteObject(); MemDC.DeleteDC(); } } / The system calls this to obtain the cursor to display while the user drags / the minimized window HCURSOR COpencvUIDlgDlg::OnQueryDragIcon() { return (HCURSOR) m_hIcon; } 69 void COpencvUIDlgDlg::OnTimer(UINT nIDEvent) { / TODO: Add your message handler code here and/or call default /************************************************************** **********/ /* ÏƠʾÉãÏđÍ· */ /************************************************************** **********/ m_Frame=cvQueryFrame(m_Video); / cvNamedWindow("new",1); / cvShowImage("new",m_Frame); m_CvvImage.CopyOf(m_Frame,1); if (!b_flagTracking) { m_CvvImage.DrawToHDC(hDC, &rect); //cvWaitKey(10); } b_flagProcess=1; / KillTimer(nIDEvent); //===================================================== m_vieoProtery=cvGetCaptureProperty(m_Video,CV_CAP_PROP_POS_ MSEC); m_vieoProtery=cvGetCaptureProperty(m_Video,CV_CAP_PROP_FRA ME_WIDTH); itoa(m_vieoProtery,chEdit,10); SetDlgItemText(IDC_EDIT_FRAME_WIDTH,chEdit); m_vieoProtery=cvGetCaptureProperty(m_Video,CV_CAP_PROP_FRA ME_HEIGHT); itoa(m_vieoProtery,chEdit,10); SetDlgItemText(IDC_EDIT_FRAME_HEIGHT,chEdit); m_vieoProtery=cvGetCaptureProperty(m_Video,CV_CAP_PROP_FPS); itoa(m_vieoProtery,chEdit,10); SetDlgItemText(IDC_EDIT_FPS,chEdit); m_vieoProtery=cvGetCaptureProperty(m_Video,CV_CAP_PROP_FOU RCC); m_fameCount++; m_vieoProtery=cvGetCaptureProperty(m_Video,CV_CAP_PROP_FRA ME_COUNT); itoa(m_fameCount,chEdit,10); SetDlgItemText(IDC_EDIT_FRAME_COUNT,chEdit); // ============tạo trackbox================== m_x=track_window.x+track_window.width/2; 70 itoa(m_x,chEdit,10); SetDlgItemText(IDC_EDIT_X,chEdit); m_y=track_window.y+track_window.height/2; itoa(m_y,chEdit,10); SetDlgItemText(IDC_EDIT_Y,chEdit); m_z=(track_window.width+track_window.height)/2; itoa(m_z,chEdit,10); SetDlgItemText(IDC_EDIT_Z,chEdit); //============================================= if (b_flagSaveMovie) { if (!m_Movie) return; cvWriteFrame(m_Movie,m_Frame); } //=====Chuyển đổi không gian màu RGB => HSV======= int i, bin_w, c; if (!b_flagTracking) return; cvCopy( m_Frame, imageTrack, ); cvCvtColor( imageTrack, hsvTrack, CV_BGR2HSV ); // ° if( track_object )// { int _vmin = vmin, _vmax = vmax; cvInRangeS( hsvTrack, cvScalar(0,smin,MIN(_vmin,_vmax),0),cvScalar(180,256,MAX(_vmin,_vmax), 0), maskTrack ); // cvSplit( hsvTrack, hueTrack, 0, 0, ); // if( track_object < )// { float max_val = 0.f; cvSetImageROI( hueTrack, selection ); // cvSetImageROI( maskTrack, selection ); // cvCalcHist( &hueTrack, histTrack, 0, maskTrack ); // cvGetMinMaxHistValue( histTrack, 0, &max_val, 0, ); 71 cvConvertScale( histTrack->bins, histTrack->bins, max_val ? 255 / max_val : 0., ); // cvResetImageROI( hueTrack ); // remove ROI cvResetImageROI( maskTrack ); track_window = selection; track_object = 1; cvZero( histimgTrack ); bin_w = histimgTrack->width / hdims; for( i = 0; i < hdims; i++ ) { int val = cvRound( cvGetReal1D(histTrack->bins,i)*histimgTrack>height/255 ); CvScalar color = hsv2rgb(i*180.f/hdims); cvRectangle( histimgTrack, cvPoint(i*bin_w,histimgTrack->height), cvPoint((i+1)*bin_w,histimgTrack->height val),color, -1, 8, );// } } cvCalcBackProject( &hueTrack, backprojectTrack, histTrack ); // cvAnd( backprojectTrack, maskTrack, backprojectTrack, );// cvCamShift( backprojectTrack, track_window,cvTermCriteria( CV_TERMCRIT_EPS | CV_TERMCRIT_ITER, 10, ),&track_comp, &track_box );// track_window = track_comp.rect;// if( backproject_mode ) cvCvtColor( backprojectTrack, imageTrack, CV_GRAY2BGR ); // if( imageTrack->origin ) track_box.angle = -track_box.angle; cvEllipseBox( imageTrack, track_box, CV_RGB(255,0,0), 3, CV_AA, );// } if( select_object && selection.width > && selection.height > )// { cvSetImageROI( imageTrack, selection ); cvXorS( imageTrack, cvScalarAll(255), imageTrack, ); cvResetImageROI( imageTrack ); } 72 m_CvvImage.CopyOf(imageTrack,1); m_CvvImage.DrawToHDC(hDC, &rect); //=============Thiết lập timer================ CDialog::OnTimer(nIDEvent); } CvScalar COpencvUIDlgDlg:: hsv2rgb( float hue )// { int rgb[3], p, sector; static const int sector_data[][3]={{0,2,1}, {1,2,0}, {1,0,2}, {2,0,1}, {2,1,0}, {0,1,2}}; hue *= 0.033333333333333333333333333333333f; sector = cvFloor(hue); p = cvRound(255*(hue - sector)); p ^= sector & ? 255 : 0; rgb[sector_data[sector][0]] = 255; rgb[sector_data[sector][1]] = 0; rgb[sector_data[sector][2]] = p; return cvScalar(rgb[2], rgb[1], rgb[0],0);// } void COpencvUIDlgDlg::OnOpencamera() { // TODO: Add your control notification handler code here //m_Video=cvCaptureFromCAM(-1); if (!m_Video) m_Video=cvCreateCameraCapture(-1);//HIGHGUI // if (!m_Video) { int nChoice = MessageBox("No Camera","Note!",MB_OK|MB_ICONWARNING); if(nChoice=IDOK) {} return; } SetTimer(1,100,NULL); 73 } void COpencvUIDlgDlg::OnClosecamera() { / TODO: Add your control notification handler code here KillTimer(1); cvReleaseCapture(&m_Video); cvReleaseVideoWriter(&m_Movie); b_flagProcess=0; m_fameCount=0; b_flagSaveMovie=0; CDC MemDC; CBitmap m_Bitmap1; m_Bitmap1.LoadBitmap(IDB_BLANK); MemDC.CreateCompatibleDC(NULL); MemDC.SelectObject(&m_Bitmap1); pDC>StretchBlt(rect.left,rect.top,rect.Width(),rect.Height(),&MemDC,0,0,48,48,SR CCOPY); m_Bitmap1.DeleteObject(); MemDC.DeleteDC(); SetDlgItemText(IDC_EDIT_TIME,"Stop"); SetDlgItemText(IDC_EDIT_FRAME_WIDTH,"Stop"); SetDlgItemText(IDC_EDIT_FRAME_HEIGHT,"Stop"); SetDlgItemText(IDC_EDIT_FPS,"Stop"); SetDlgItemText(IDC_EDIT_FOURCC,"Stop"); SetDlgItemText(IDC_EDIT_FRAME_COUNT,"Stop"); SetDlgItemText(IDC_EDIT_X,"Stop"); SetDlgItemText(IDC_EDIT_Y,"Stop"); SetDlgItemText(IDC_EDIT_Z,"Stop"); } void COpencvUIDlgDlg::OnGrabframe() { if (!m_Video) { int nChoice = MessageBox("No camera!","Note",MB_OK|MB_ICONWARNING); if(nChoice == IDOK){}; return; } m_GrabFrame=cvQueryFrame(m_Video); 74 if (!m_GrabFrame) return; static char countsnap='1'; CString m_name=""; m_name=+countsnap; m_name+=".bmp"; IplImage * m_snap=cvCreateImage(cvGetSize(m_GrabFrame),m_GrabFrame>depth,m_GrabFrame->nChannels); cvCopy(m_GrabFrame,m_snap,NULL); m_snap->origin=0; const char* pszStr = m_name.GetBuffer(m_name.GetLength()); cvSaveImage(pszStr,m_snap); // countsnap++; } void COpencvUIDlgDlg::OnSavemovie() { // TODO: Add your control notification handler code here //m_Movie=cvCreateVideoWriter("video.avi",-1,10,cvSize(352,288),1); if (b_flagProcess) { //m_Movie=cvCreateVideoWriter("video.avi",CV_FOURCC('P','I','M','1 '),10,cvSize(352,288),1); m_Movie=cvCreateVideoWriter("video.avi",1,10,cvSize(640,480),1); b_flagSaveMovie=1; } else MessageBox("No Camera","Note",MB_OK|MB_ICONWARNING); } void COpencvUIDlgDlg::OnStopsavemovie() { / TODO: Add your control notification handler code here cvReleaseVideoWriter(&m_Movie); b_flagSaveMovie=0; } void COpencvUIDlgDlg::OnStarttracking() 75 { / TODO: Add your control notification handler code here if (!b_flagProcess) { MessageBox("Press Button Start!","Note",MB_OK|MB_ICONWARNING); return; } b_flagTracking=1; imageTrack=0; track_object=-1; if (!imageTrack) { imageTrack = cvCreateImage( cvGetSize(m_Frame), 8, );// imageTrack->origin = m_Frame->origin; hsvTrack = cvCreateImage( cvGetSize(m_Frame), 8, ); hueTrack = cvCreateImage( cvGetSize(m_Frame), 8, ); maskTrack = cvCreateImage( cvGetSize(m_Frame), 8, );// backprojectTrack = cvCreateImage( cvGetSize(m_Frame), 8, );// histTrack = cvCreateHist( 1, &hdims, CV_HIST_ARRAY, &hranges, ); //· histimgTrack = cvCreateImage( cvSize(320,200), 8, );//· cvZero( histimgTrack );// } origin = cvPoint(150,150); selection = cvRect(150,150,20,20);// / cvNamedWindow( "CamShiftDemo", );// / cvNamedWindow( "Histogram", ); / cvSetMouseCallback( "CamShiftDemo", on_mouse ); // } void COpencvUIDlgDlg::OnStoptracking() { / TODO: Add your control notification handler code here b_flagTracking=0; imageTrack=0; track_object=0; } void COpencvUIDlgDlg::OnMouseMove(UINT nFlags, CPoint point) 76 { // TODO: Add your message handler code here and/or call default //pwnd = GetDlgItem(IDC_SHOWPIC); //pwnd->GetWindowRect(&rect); //pwnd->MoveWindow(35,30,352,288); //if ((point.x>rect.left)&&(point.xrect.top)&&(point.y35)&&(point.x30)&&(point.yLoadCursor(IDC_CURSOR1)); if (select_object) { pointx=point.x-35; pointy=point.y-30; if( imageTrack->origin ) pointy = 480 - pointy;//480 selection.x = MIN(pointx,origin.x); selection.y = MIN(pointy,origin.y); selection.width = selection.x + CV_IABS(pointx - origin.x); selection.height = selection.y + CV_IABS(pointy - origin.y); selection.x = MAX( selection.x, ); selection.y = MAX( selection.y, ); selection.width = MIN( selection.width, imageTrack->width ); selection.height = MIN( selection.height, imageTrack->height ); selection.width -= selection.x; selection.height -= selection.y; } } CDialog::OnMouseMove(nFlags, point); } void COpencvUIDlgDlg::OnLButtonDown(UINT nFlags, CPoint point) { // TODO: Add your message handler code here and/or call default if( !imageTrack ) { MessageBox("Press Button StartTracking!","Note!",MB_OK|MB_ICONWARNING); return; } 77 if ((point.x>35)&&(point.x30)&&(point.yorigin ) pointy = 288 - pointy; if (imageTrack->width==800) { pointx=pointx*640/352; pointy=pointy*480/288; } origin.x = pointx; origin.y = pointy; selection = cvRect(pointx,pointy,0,0);// select_object = 1;//¡ } CDialog::OnLButtonDown(nFlags, point); } void COpencvUIDlgDlg::OnLButtonUp(UINT nFlags, CPoint point) { / TODO: Add your message handler code here and/or call default select_object = 0;// if( selection.width > && selection.height > ) track_object = -1;// CDialog::OnLButtonUp(nFlags, point); } void COpencvUIDlgDlg::OnAboutbox() { / TODO: Add your control notification handler code here CAboutDlg dlgAbout; dlgAbout.DoModal(); } 78 void CAboutDlg::OnOK() { CDialog::OnOK(); } void COpencvUIDlgDlg::OnCancel() { / TODO: Add extra cleanup here int user_choice = MessageBox("Exit?","Exit!",MB_OKCANCEL|MB_ICONWARNING); if(user_choice == IDOK) /*{ if(m_Video) destoryWindow(); };*/ CDialog::OnCancel(); } BEGIN_EVENTSINK_MAP(COpencvUIDlgDlg, CDialog) //{{AFX_EVENTSINK_MAP(COpencvUIDlgDlg) //}}AFX_EVENTSINK_MAP END_EVENTSINK_MAP() ... 3.1: Lưu đồ thuật toán bám đối tượng Dựa vào lưu đồ thuật tốn ta hình dung hệ thống bám tổng quan để xây dựng thuật toán điều khiển tối ưu phù hợp vói hệ thống, đáp ứng đủ yêu cầu đặt toán Sau... Với ưu điểm thuật toán Camshift việc xử lý ảnh bám đối tượng nhận di? ??n ảnh, kết hợp với ngôn ngữ C lựa chọn xây dựng riêng cho đề tài thuật tốn tối ưu việc xử lý ảnh bám đối tượng Thuật toán. .. nhận di? ??n khn mặt sử dụng thư viện mã nguồn mở OpenCV đếm số người ảnh 24 Hình 2.9: Kết thử nghiệm lập trình nhận di? ??n khn mặt 25 Chương trình nhận di? ??n khn mặt đếm số người ảnh dùng thư viện: