Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 80 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
80
Dung lượng
15,62 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: • 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 C • 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 2011 Sinh viên thực Hà Tiến Thanh 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ó “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 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 số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 hồ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 toá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 đố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 hồn tồ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 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 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() ... ước lượng đối tượng cửa sổ ảnh cố định, chia ảnh đối tượng thành ma trận điểm ảnh (pixel) sau thực ước lượng điểm ảnh phương pháp Gauss, sau tính trung bình pixel khung ảnh cố định đối tượng, trình... ảnh. Tính tốn trọng tâm hướng vật thể có kết hợp lọc nhằm loại bỏ nhiễu vào hệ thống 31 3.2 Thuật tốn Camshift tối ưu hóa hệ bám đối tượng Trong xử lý ảnh việc nghiên cứu thuật toán bám đối tượng. .. tính đối tượng phù hợp với đối tượng lập trình từ trước, bám đối tượng khác phải lập trình lấy lại đặc tính cho đối tượng Phương pháp Correlation-base template matching phương pháp so sánh với ảnh