1. Trang chủ
  2. » Giáo Dục - Đào Tạo

Xử lý ảnh và ứng dụng theo dõi đối tượng chuyển động

62 7 0

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

ĐẠI HỌC QUỐC GIA HÀ NỘI TRƯỜNG ĐẠI HỌC CÔNG NGHỆ Lê Anh Vũ XỬ LÝ ẢNH VÀ ỨNG DỤNG THEO DÕI ĐỐI TƯỢNG CHUYỂN ĐỘNG KHÓA LUẬN TỐT NGHIỆP ĐẠI HỌC CHÍNH QUY Ngành : Cơng Nghệ Điện Tử - Viễn Thông HÀ NỘI 2005 LUAN VAN CHAT LUONG download : add luanvanchat@agmail.com ĐẠI HỌC QUỐC GIA HÀ NỘI TRƯỜNG ĐẠI HỌC CÔNG NGHỆ Lê Anh Vũ XỬ LÝ ẢNH VÀ ỨNG DỤNG THEO DÕI ĐỐI TƯỢNG CHUYỂN ĐỘNG KHĨA LUẬN TỐT NGHIỆP ĐẠI HỌC CHÍNH QUY Ngành : Công Nghệ Điện Tử - Viễn Thông Cán hướng dẫn : Nguyễn Vinh Quang HÀ NỘI 2005 LUAN VAN CHAT LUONG download : add luanvanchat@agmail.com Lời cảm ơn Để hồn thành khóa luận giúp đỡ nhiệt tình tạo điều kiện thầy cô nhà trường bạn lớp , Sự tận tình cảm thơng gia đình,anh em Em xin chân thành cảm ơn thầy Nguyễn Vinh Quang, người hưỡng dẫn em làm khóa luận này, thầy nhiệt tình giúp đỡ em suốt q trình làm khóa luận vật chất lẫn tinh thần Em xin cảm ơn Nhà Trường đặc biệt thầy cô khoa Điện Tử thuộc Phịng Thí Nghiệm ROBOTIC Trường, người mà hàng ngày tạo điều kiện bảo ban em Cảm ơn bạn lớp K46DC, người sát cánh chia sẻ mình! Hà Nội, ngày 05/06/2005 LUAN VAN CHAT LUONG download : add luanvanchat@agmail.com Mục lục Mở đầu…………………………………………………………………………….1 Phần 1: LÝ THUYẾT XỬ LÝ ẢNH …………………………………………….2 Chương 1: Lý Thuyết xử lý ảnh …………………………………………………2 1.1:Thu nhận ảnh số hóa…………………………………………………2 1.2:Phân tích ảnh…………………………………………………………….2 1.3:Quyết định……………………………………………………………… Chương 2: Thu nhận hình ảnh…………………………………………… … 2.1:Thu nhận ảnh…………………………………………………………….3 2.2:Lưu ảnh………………………………………………………………… Chương 3: Phân tích ảnh……………………………………………………….…8 3.1:Khái niệm pixel pixil lân cận…………………………………………8 3.2:Một số công cụ trợ giúp xử lý ảnh………………………………………8 3.2.1:Tích chập……………………………………………………………… 3.2.2:Kỹ thuật lọc số………………………………………………………….11 3.2.3:Biến đổi Fourier……………………………………………………… 11 3.3:Tiền xử lý…………………………………………………………………16 3.3.1:Phương pháp tiền xử lý miền không gian…………………… 16 3.3.2:Phương pháp tiền xử lý miền tần số………………………… 17 3.4:Làm trơn ảnh………………………………………………………….…18 3.4.1:Lấy trung bình điểm ảnh lân cận, lọc tuyến tính……………… 18 3.4.2:Phương pháp lọc trung vị…………………………………………… 19 3.4.3:Trung bình hóa hình ảnh…………………………………………… 19 3.4.4:Làm trơn hình ảnh nhị phân………………………………………….20 3.5:Phát biên…………………………………………………………….22 3.6:Lập ngưỡng………………………………………………………………25 Phần 2: PHẦN THỰC NGHIỆM:……………………………………………… 26 Chương 1: Ngơn ngữ lập trình…………………………………………… 28 Chương 2:Điều khiển công LPT Win200/NT/XP…………………….31 Chương 3:Minh họa thuật tốn chương trình………………………….34 Tài liệu tham khảo:………………………………………………………………….52 LUAN VAN CHAT LUONG download : add luanvanchat@agmail.com TÓM TẮT NỘI DUNG KHĨA LUẬN: Nội dung khóa luận ứng dụng lý thuyết xử lý ảnh số qua thiết bị thu ảnh , web camera để điều khiển hệ tự động theo dõi đối tượng chuyển động Khóa luận chia làm hai phần chính, phần lý thuyết phần thực nghiệm : -Trong phần lý thuyết , ta tìm hiểu khái niệm xử lý ảnh số, bao gồm lý thuyết Xử lý ảnh,Thu nhận hình ảnh Phân tích ảnh -Ở phần này, giới thiệu khái niệm xử lý ảnh ứng dụng thuật toán xử lý ảnh cơng cụ tốn học tích chập, phưong pháp tiền xử lý : lọc nhiễu, phát biên, phân ngưỡng ảnh… -Phần thực hành gồm phần: Phần tìm hiểu ngơn ngữ lập trình thư viện AVICap Microsoft Phần giới thiệu cách giao tiếp điều khiển công LPT VC++ Phần phần , bao gồm thuật tốn chương trình điều khiển LUAN VAN CHAT LUONG download : add luanvanchat@agmail.com LỜI MỞ ĐẦU Trong thập kỷ gần đây, xử lý ảnh nghiên cứu mạnh mẽ có nhiều ứg dụng thực tế Như y học, xử lý ảnh số dùng để phát nhận dạng khối u , cải thiện ảnh X quang , nhận dạng đường biên mạch máu từ ảnh chụp mạch tia X sống gia đình, xử lý ảnh dùng để cải thiện ảnh Ti vi Trong truyền thông video hội nghị video, điện thoại video vấn đề cần có giải tần rộng Việc mã hóa thẳng chương trình video chất lượn quảng bá cần đến 100 triệu bit/s Điều đáp ứng được.Nhưng cách mã hóa số khơi phục ảnh (là vấn đề xử lý ảnh ) việc thực với băng tần 100 nghìn bit/s Cịn lĩnh vực khoa học kỹ thuật, xử lý ảnh có đóng góp quan trọng, đặc biệt lĩnh vực Robot Robot thông minh ngày khơng thể thiếu yếu tố xử lý ảnh Đó vấn đề nhận dạng đối tượng mơi trường Từ việc nhận dạng giải nhiều tốn tránh vật cản, dị đường Xử lý ảnh chia làm q trình sau: Thu nhận hình ảnh, phân tích ảnh định Mơ hình sản phẩm theo dõi đối tượng dùng camera LUAN VAN CHAT LUONG download : add luanvanchat@agmail.com PHẦN 1: LÝ THUYẾT XỬ LÝ ẢNH CHƯƠNG : HỆ THỐNG XỬ LÝ ẢNH Một hệ thống xử lý ảnh điển hình cho hình vẽ sau: Lưu trữ Thiết bị thu nhận ảnh (Camera Sensor) Thu nhận ảnh Lưu trữ Số hố Phân tích ảnh Nhận dạng Hệ định Hình 1.1, Các giai đoạn xử lý ảnh Từ hình vẽ 1.1 ta thấy hệ thống xử lý ảnh bao gồm thu nhận ảnh, số hóa ảnh, phân tích ảnh cuối định (tùy thuộc vào yêu cầu ứng dụng cụ thể mà đưa định cho phù hợp) 1.1 Thu nhận ảnh số hóa Việc thu nhận ảnh thơng qua camera Các camera tương tự (loại camera ống kiểu CCIR) số (loại camera kiểu CCD_ Charge Coupled Device) Ảnh thu qua thiết bị khác máy quét v v Nếu ảnh nhận tương tự phải số hóa nhờ q trình lấy mẫu lượng tử hóa trước phân tích, xử lý hay lưu trữ ảnh 1.2 Phân tích ảnh Ở giai đoạn ảnh xử lý theo nhiều công đoạn nhỏ như: cải thiện ảnh, khôi phục ảnh để làm bật số đặc tính ảnh hay làm ảnh gần với trạng thái gốc Tiếp theo phát đặc tính biên, phân vùng LUAN VAN CHAT LUONG download : add luanvanchat@agmail.com 1.3 Quyết định Cuối tùy theo mục đích ứng dụng, giai đoạn nhận dạng hay định khác CHƯƠNG 2: THU NHẬN HÌNH ẢNH 2.1 Thu nhận ảnh Để thu nhận ảnh người ta thường dùng camera truyền hình, camera gồm tube sensor mạch rắn thiết bị điện tử kèm Camera sensor mạch rắn có số ưu điểm so với camera tube nhẹ hơn, nhỏ hơn, bền hơn, bền tiêu thụ công suất thấp Tuy nhiên, số camera tube có độ phân giải cao camera sensor mạch rắn Một số loại sử dụng phổ biến camera tivi Vidicon Camera Vidicon vỏ kính hình lăng trụ chứa súng phóng electron đầu hình (faceplate) đầu Dịng electron hội tụ làm lệch điện áp đặt vào cuộn dây hình vẽ 2.1 Mạch làm lệch làm cho dòng electron quết lên bề mặt hình để “đọc” hình ảnh Bề mặt bên hình phủ màng mỏng kim loại suốt, màng mỏng tạo thành điện cực mà từ tạo tín hiệu điện hình ảnh Một lớp nhạy sáng phủ màng mỏng kim loại Lớp tạo thành bao gồm cầu trở kháng có kích cỡ nhỏ, trở kháng cầu tỷ lệ nghịch với cường độ sáng Phía sau lớp nhạy sáng có lưới tích điện dương để giảm tốc LUAN VAN CHAT LUONG download : add luanvanchat@agmail.com electron phát từ súng phóng electron cho electron tới bề mặt đích vận tốc khơng Ở chế độ hoạt động bình thường, điện áp dương đặt vào lớp kim loại hình Khi khơng có ánh sáng, lớp nhạy sáng đóng vai trị chất điện mơi, dịng electron phủ lớp electron lên bề mặt bên hình để cân với điện tích dương lớp kim loại Khi chùm electron quét bề mặt hình, lớp nhày sáng trở th ành tụ điện với điện tích âm bề mặt phía điện tích dương bề mặt đối diện Khi ánh sáng va vào hình, trở kháng giảm el ectron phép chuyển động tự trung hịa với điện tích dương Vì lượng điện tích chuyển động tự tỷ l ệ với ánh sáng vùng cục hình, hiệu ứng t ạo hình ảnh hình giống với ảnh chiếu hình tube Nghĩa là, tập trung c ác điện tích electron cao vùng tối thấp vùng sáng Khi dòng electron quét hình lần thứ hai thay điện tích bị mất, tạo thành dịng điện chảy lớp kim loại phía ngồi chân tube Dòng tỷ lệ với số electron thay tỷ l ệ với cường độ sáng vị trí cụ thể dòng quét Sự thay đổi dòng electron qt tạo tín hiệu hình ảnh tỷ lệ với cường độ ảnh đầu vào Cuộn hội tụ dòng electron: Lớp nhạy sáng LUAN VAN CHAT LUONG download : add luanvanchat@agmail.com Lưới Các chân tube Dòng electron Súng phóng electron Màn hình Lớp phủ kim loại suốt Cuộn làm lệch dịng electron Hình 2.1.Sơ đồ vidicon Hình 2.2 Mẫu qt dịng electron: Hình 2.2 minh họa chuẩn qt.Dịng electron qt tồn hình 30 lần giây, vết quét hoàn chỉnh (gọi khung) gồm 525 dịng có 480 dịng chứa thơng tin hình ảnh Nếu dòng quét cách kết hiển thị lên hình TV, hình ảnh nhấp nháy rõ rệt Có thể khắc phục tượng cách sử dụng cấu quét mà khung chia thành hai trường mành xen kẽ nhau, trường gồm 2625 dòng quét 60 lần giây hay tốc độ khung tăng lên gấp đôi Trường hợp khung quét dòng lẻ (là đường chấm chấm hình 2.2) mành thứ hai quét dòng chẵn Sơ đồ quết gọi chuẩn RETMA (Radio-Electronics Television Manufacturers Association ) Hiệp hội hãng chế tạo Radio, Tivi, máy móc điện tử) Các chuẩn khác có tốc độ dịng mành cao , nguyên lý hoạt độn4g mạch giống Các thiết bị CCD gồm hai loại: Sensor quét dòng sensor khối Thành phần Sensor CCD quét dòng hàng phân tử ảnh silic gọi photosites Các LUAN VAN CHAT LUONG download : add luanvanchat@agmail.com pTop.y = pBottom.y = pLeft.y = pRight.y = i; init = true; } } } } } Hình chữ nhật xây dung lên tử điểm trên, cho ta vị trí vật sáng , Khung hình chữ nhật sau dễ dàng thay màu định nghĩa tử trước if (init) { /*Thay khung với điểm màu xác định trước */ for (int i=pLeft.x; i Nó khơng cho ta biết chút thơng tin hình dạng vật iii> Nó khơng cho ta trọng tâm vật iv> Và quan trọng nhất, khơng bám có nhiều đối tượng chuyển động(Tuy nhiên , tính thử nghiệm nên đề tài sử dụng thuật toán để áp dụng) LUAN VAN CHAT LUONG download : add luanvanchat@agmail.com Một thuật toán cải tiến hơn: Hình P3.2.3 :Ảnh camera bắt nhiều vật Thuật toán phát theo đối tượng cách nhận dạng đoạn phần tử tạo nên đối tượng hình Mỗi đoạn tạo nên tiêu đề độ dài đoạn đó.Đối tượng cấu trúc nên nhóm đoạn với BYTE Y; int index; /* Biến sử dụng thuật toán */ QSEG segment; std::list object; for (int i=0; i Nó theo dõi nhiều đối tượng ii> Nó theo dõi hình dáng đối tượng iii> Số lượng điểm ảnh tạo nên đối tượng dễ dàng tính tốn được.Với mẫu thơng tin cách tính tốn khong cách thích hợp, toạ độ đối tượng ba chiều xác định • Phần Chương Trình : // ChildView.cpp : implementation of the CChildView class #include "stdafx.h" #include "Tracker.h" #include "MainFrm.h" #include "ChildFrm.h" #include "ChildView.h" LUAN VAN CHAT LUONG download : add luanvanchat@agmail.com #include "TrackDlg.h" #include #include #ifdef _DEBUG #define new DEBUG_NEW #endif typedef struct QSEG_ { POINT head; UINT length; } QSEG, *LPQSEG; // CChildView BYTE CChildView::bThreshold = 250; DWORD CChildView::dwRectangle = 0; DWORD CChildView::dwSegment = 0; CChildView::CChildView() { } CChildView::~CChildView() { } BEGIN_MESSAGE_MAP(CChildView, CWnd) ON_WM_PAINT() ON_COMMAND(ID_DEVICE_REFRESH, OnDeviceRefresh) ON_COMMAND_RANGE(ID_DEVICE_NAME, ID_DEVICE_NAME+CVideoCapWnd::m_dwDeviceMax, OnDeviceName) ON_COMMAND(ID_CAPTURE_SOURCE, OnCaptureSource) ON_COMMAND(ID_CAPTURE_FORMAT, OnCaptureFormat) ON_COMMAND(ID_CAPTURE_DISPLAY, OnCaptureDisplay) ON_WM_SIZE() ON_COMMAND_RANGE(ID_CAPTURE_100, ID_CAPTURE_200, OnCaptureZoom) ON_COMMAND(ID_TRACK_BRIGHTNESS, OnTrackBrightness) ON_COMMAND(ID_TRACK_STOP, OnTrackStop) ON_COMMAND(ID_CAPTURE_STOP, OnCaptureStop) END_MESSAGE_MAP() LUAN VAN CHAT LUONG download : add luanvanchat@agmail.com // CChildView message handlers BOOL CChildView::PreCreateWindow(CREATESTRUCT& cs) { if (!CWnd::PreCreateWindow(cs)) return FALSE; cs.dwExStyle |= WS_EX_CLIENTEDGE; cs.style &= ~WS_BORDER; cs.lpszClass = AfxRegisterWndClass(CS_HREDRAW|CS_VREDRAW|CS_DBLCLKS, ::LoadCursor(NULL, IDC_ARROW), reinterpret_cast(COLOR_WINDOW+1), NULL); return TRUE; } void CChildView::OnPaint() { CPaintDC dc(this); // device context for painting // TODO: Add your message handler code here // Do not call CWnd::OnPaint() for painting messages } void CChildView::OnDeviceRefresh() { /* Get device menu */ CMenu *mDev = AfxGetMainWnd()->GetMenu()->GetSubMenu(3); MENUITEMINFO miInfo; { /* Find position of separator */ miInfo.cbSize = sizeof(MENUITEMINFO); miInfo.fMask = MIIM_TYPE; mDev->GetMenuItemInfo(0, &miInfo, TRUE); /* Delete all entries before separator */ if (miInfo.fType != MFT_SEPARATOR) { mDev->DeleteMenu(0, MF_BYPOSITION); } } while (miInfo.fType != MFT_SEPARATOR); LUAN VAN CHAT LUONG download : add luanvanchat@agmail.com /* Put device names before separator */ CString strDevName, strDevVer; for (DWORD i=0; iInsertMenu(0, MF_BYPOSITION, ID_DEVICE_NAME+i, strDevName); } } } void CChildView::OnDeviceName(UINT nID) { /* Get device index by subtracting the offset */ nID = nID - ID_DEVICE_NAME; CString strErr; /* Create the capture window if we haven't done */ if (m_theVideoCapWnd.m_hWnd == NULL) { m_theVideoCapWnd.CreateCaptureWindow(CString(""), WS_CHILD | WS_VISIBLE, CRect(0,0,0,0), this, 0); if (m_theVideoCapWnd.m_hWnd == NULL) { strErr.LoadString(IDS_ERR_CAPWND); MessageBox(strErr); return; } } /* Attempt to connect to driver */ if (m_theVideoCapWnd.DriverConnect(nID) == FALSE) { strErr.LoadString(IDS_ERR_CONNECT); MessageBox(strErr); return; } /* Retrieve device parameters */ CAPTUREPARMS capParms; if (m_theVideoCapWnd.CaptureGetSetup(&capParms, sizeof(CAPTUREPARMS)) == FALSE) { strErr.LoadString(IDS_ERR_GETSETUP); MessageBox(strErr); return; } /* Want separate thread */ LUAN VAN CHAT LUONG download : add luanvanchat@agmail.com capParms.fYield = TRUE; /* Do not abort when left mouse button is clicked */ capParms.fAbortLeftMouse = FALSE; /* Do not abort when right mouse button is clicked */ capParms.fAbortRightMouse = FALSE; /* Update device parameters */ if (m_theVideoCapWnd.CaptureSetSetup(&capParms, sizeof(CAPTUREPARMS)) == FALSE) { strErr.LoadString(IDS_ERR_SETSETUP); MessageBox(strErr); return; } /* Get current state of capture window */ CAPSTATUS capStat; if (m_theVideoCapWnd.GetStatus(&capStat, sizeof(CAPSTATUS)) == FALSE) { strErr.LoadString(IDS_ERR_GETSTAT); MessageBox(strErr); return; } m_theVideoCapWnd.SetWindowPos(NULL, 0, 0, capStat.uiImageWidth, capStat.uiImageHeight, SWP_NOMOVE | SWP_NOZORDER); GetParentFrame()->SetWindowPos(NULL, 0, 0, capStat.uiImageWidth, capStat.uiImageHeight, SWP_NOMOVE); /* Set preview rate */ if (m_theVideoCapWnd.PreviewRate(33) == FALSE) { strErr.LoadString(IDS_ERR_PREVRATE); MessageBox(strErr); return; } /* Turn on scaling */ if (m_theVideoCapWnd.PreviewScale(TRUE) == FALSE) { strErr.LoadString(IDS_ERR_PREVSCALE); MessageBox(strErr); return; } /* Start preview */ if (m_theVideoCapWnd.Preview(TRUE) == FALSE) { strErr.LoadString(IDS_ERR_PREV); MessageBox(strErr); return; LUAN VAN CHAT LUONG download : add luanvanchat@agmail.com } } void CChildView::OnCaptureSource() { CString strErr; /* Retrieve device capabilities */ CAPDRIVERCAPS capCap; if (m_theVideoCapWnd.DriverGetCaps(&capCap, sizeof(CAPDRIVERCAPS)) == FALSE) { strErr.LoadString(IDS_ERR_GETCAPS); MessageBox(strErr); return; } /* Check if device supports video source dialog */ if (capCap.fHasDlgVideoSource) { if (m_theVideoCapWnd.DlgVideoSource() == FALSE) { strErr.LoadString(IDS_ERR_SOURCE); MessageBox(strErr); } } else { strErr = "Device does not support video source dialog."; MessageBox(strErr); } } void CChildView::OnCaptureFormat() { CString strErr; /* Retrieve device capabilities */ CAPDRIVERCAPS capCap; if (m_theVideoCapWnd.DriverGetCaps(&capCap, sizeof(CAPDRIVERCAPS)) == FALSE) { strErr.LoadString(IDS_ERR_GETCAPS); MessageBox(strErr); return; } /* Check if device supports video format dialog */ if (capCap.fHasDlgVideoFormat) { if (m_theVideoCapWnd.DlgVideoFormat() == FALSE) { strErr.LoadString(IDS_ERR_FORMAT); LUAN VAN CHAT LUONG download : add luanvanchat@agmail.com MessageBox(strErr); } } else { strErr = "Device does not support video format dialog."; MessageBox(strErr); } } void CChildView::OnCaptureDisplay() { CString strErr; /* Retrieve device capabilities */ CAPDRIVERCAPS capCap; if (m_theVideoCapWnd.DriverGetCaps(&capCap, sizeof(CAPDRIVERCAPS)) == FALSE) { strErr.LoadString(IDS_ERR_GETCAPS); MessageBox(strErr); return; } /* Check if device supports video display dialog */ if (capCap.fHasDlgVideoDisplay) { if (m_theVideoCapWnd.DlgVideoDisplay() == FALSE) { strErr.LoadString(IDS_ERR_DISPLAY); MessageBox(strErr); } } else { strErr = "Device does not support video display dialog."; MessageBox(strErr); } } void CChildView::OnSize(UINT nType, int cx, int cy) { CWnd::OnSize(nType, cx, cy); // TODO: Add your message handler code here /* Centralize the video capture window */ if (m_theVideoCapWnd.m_hWnd != NULL) { CRect paRect, cpRect; GetClientRect(&paRect); m_theVideoCapWnd.GetClientRect(&cpRect); LUAN VAN CHAT LUONG download : add luanvanchat@agmail.com m_theVideoCapWnd.SetWindowPos(NULL, 0, 0, paRect.Width(), paRect.Height(), SWP_NOMOVE | SWP_NOZORDER); } else { /* Resize the child window */ GetParentFrame()->SetWindowPos(NULL, 0, 0, 200, 200, SWP_NOMOVE); } } void CChildView::OnCaptureZoom(UINT nID) { if (m_theVideoCapWnd.m_hWnd != NULL) { /* Get current state of capture window */ CAPSTATUS capStat; if (m_theVideoCapWnd.GetStatus(&capStat, sizeof(CAPSTATUS))) { UINT nZoom = nID - ID_CAPTURE_100 + 1; UINT nWidth = capStat.uiImageWidth * nZoom; UINT nHeight = capStat.uiImageHeight * nZoom; m_theVideoCapWnd.SetWindowPos(NULL, 0, 0, nWidth, nHeight, SWP_NOMOVE | SWP_NOZORDER); CMDIChildWnd *pChild = DYNAMIC_DOWNCAST(CMDIChildWnd, GetParentFrame()); pChild->MDIRestore(); GetParentFrame()->SetWindowPos(NULL, 0, 0, nWidth, nHeight, SWP_NOMOVE); } else { CString strErr; strErr.LoadString(IDS_ERR_GETSTAT); MessageBox(strErr); } } } LRESULT CChildView::FrameCallbackProc(HWND hWnd, LPVIDEOHDR lpVideoHdr) { CVideoCapWnd theVideoCapWnd; CAPSTATUS capStat; theVideoCapWnd.Attach(hWnd); if (theVideoCapWnd.GetStatus(&capStat, sizeof(CAPSTATUS))) { UINT nWidth = capStat.uiImageWidth; UINT nHeight = capStat.uiImageHeight; LUAN VAN CHAT LUONG download : add luanvanchat@agmail.com LPBYTE lpData = lpVideoHdr->lpData; ASSERT(lpVideoHdr->dwBytesUsed == nWidth * nHeight * 3); if (dwRectangle) { BYTE Y; int index; bool init = false; /* Variables used by simple tracking algorithm */ POINT pTop, pBottom, pLeft, pRight; for (int i=0; i j) { pLeft.x = j; pLeft.y = i; } if (pRight.x < j) { pRight.x = j; pRight.y = i; } pBottom.x = j; pBottom.y = i; } else { pTop.x = pBottom.x = pLeft.x = pRight.x = j; pTop.y = pBottom.y = pLeft.y = pRight.y = i; init = true; } } } } /* Data regarding object being tracked stored, something simple about it */ if (init) { for (int i=pLeft.x; i

Ngày đăng: 01/11/2022, 20:39

Xem thêm:

w