Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 58 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
58
Dung lượng
5,4 MB
Nội dung
BỘ CÔNG THƯƠNG TRƯỜNG ĐẠI HỌC CÔNG NGHIỆP THỰC PHẨM TP HCM KHOA CÔNG NGHỆ ĐIỆN – ĐIỆN TỬ 🙣🙣🙣 NH KHÓA LUẬN TỐT NGHIỆP VẼ TRANH TRÊN KHÔNG TRUNG DÙNG XỬ LÝ ẢNH GVHD: ThS SVTH : Lớp : MSSV : TP HỜ CHÍ MINH, THÁNG NĂM 2021 BỘ CÔNG THƯƠNG TRƯỜNG ĐẠI HỌC CÔNG NGHIỆP THỰC PHẨM TP HCM KHOA CÔNG NGHỆ ĐIỆN – ĐIỆN TỬ 🙣🙣🙣 H KHÓA LUẬN TỐT NGHIỆP VẼ TRANH TRÊN KHÔNG TRUNG DÙNG XỬ LÝ ẢNH GVHD: SVTH : Lớp : MSSV : TP HỜ CHÍ MINH, THÁNG NĂM 2021 NHẬN XÉT CỦA GIÁO VIÊN HƯỚNG DẪN TP Hồ Chí Minh, ngày… tháng… năm 2021 Giáo viên hướng dẫn NHẬN XÉT CỦA GIÁO VIÊN PHẢN BIỆN TP Hồ Chí Minh, ngày… tháng… năm 2021 Giáo viên phản biện LỜI CẢM ƠN Để hồn thành khóa luận tốt nghiệp, trước hết em xin gửi đến quý thầy, cô giáo Khoa Điện-Điện tử, trường Đại học Công nghiệp Thực phẩm TP Hồ Chí Minh lời cảm ơn chân thành Đặc biệt, em xin gửi đến thầy Trần Hồn, người tận tình hướng dẫn, giúp đỡ em hồn thành khóa luận tốt nghiệp lời cảm ơn sâu sắc Trong trình tìm hiểu đề tài, với kiến thức cịn hạn hẹp nên khơng tránh khỏi thiếu sót Em mong nhận đóng góp ý kiến q thầy khoa để em học thêm nhiều kinh nghiệm hoàn thành tốt Sau cùng, em kính chúc quý thầy cô thật dồi sức khỏe, tràn đầy nhiệt huyết thành công nghiệp cao quý TP Hồ Chí Minh, ngày tháng năm 2021 Sinh viên thực TĨM TẮT KHĨA LUẬN Trí tuệ nhân tạo phát triển mạnh mẽ giới Khi nhắc đến trí tuệ nhân tạo nghĩ đến người máy tiếng robot Sophia Sophia Robot mang hình dạng giống người thiết kế phát triển cơng ty cơng nghệ Mỹ Hanson Robotics có trụ sở đặt Hồng Kơng Sophia kích hoạt lần vào ngày 19 tháng năm 2015, xuất lần đầu Liên hoan South By Southwest - kiện thường niên tổ chức thành phố Austin thuộc tiểu bang Texas (quê nhà Hanson Robotics) vào trung tuần tháng năm với kiện lớn công nghệ cao, âm nhạc điện ảnh Sophia thiết kế để suy nghĩ cử động cho giống với người đồng thời trang bị trí tuệ thơng minh nhân tạo Mục đích chế tạo Sophia theo nhà sản xuất nhằm phát minh robot có ý thức, có sáng tạo có khả hoạt động người để giúp đỡ người vấn đề sống thường ngày như: phục vụ chăm sóc sức khỏe, hỗ trợ điều trị y tế, giáo dục nhiều dịch vụ khác Để nhận người học hỏi từ nhìn thấy, Sophi trang bị máy ảnh video cho phép thực giao tiếp mắt Và đơi mắt Sophia kết việc ứng dụng thị giác máy tính Hay nói thị giác máy tính phần nhỏ cơng nghệ trí tuệ nhân tạo Với đề tài “Vẽ tranh không trung dùng xử lý ảnh” , sinh viên thực có hội tìm hiểu thêm thị giác máy tính (computer vision) Sinh viên sử dụng phần mềm Visual studio ( 2013) opencv (bản 2.4.10) để thực đề tài Trong đề tài này, sinh viên dùng camera laptop để thu hình ảnh xử lý ảnh đầu vào qua nhiều bước để có ảnh mà bàn tay đối tượng nhắm đến Sau lập trình để xác định tọa độ ngón tay để nhận diện cử tay từ vẽ lại quỹ đạo di chuyển ngón tay tạo thành hình vẽ MỤC LỤ NHẬN XÉT CỦA GIÁO VIÊN HƯỚNG DẪN i NHẬN XÉT CỦA GIÁO VIÊN PHẢN BIỆN .ii LỜI CẢM ƠN iii TÓM TẮT KHÓA LUẬN iv MỤC LỤC v DANH MỤC BẢNG BIỂU vi DANH MỤC HÌNH ẢNH vii CHƯƠNG 1: TỔNG QUAN VỀ ĐỀ TÀI 1.1 Đặt vấn đề 1.2 Các cơng trình nghiên cứu liên quan 1.2.1 Trong nước 1.2.2 Ngoài nước 1.3 Mục tiêu đề tài CHƯƠNG 2: CƠ SỞ LÝ THUYẾT .4 2.1 Các loại ảnh số .4 2.1.1 Ảnh raster 2.1.2 Ảnh vector 2.2 Điểm ảnh (pixel) .5 2.2.1 Khái niệm 2.2.2 Xác định vị trí pixel ảnh 2.3 Các không gian màu biểu diễn ảnh 2.3.1 Không gian màu RGB 2.3.2 Không gian màu CMYK 2.3.3 Không gian màu HSV 2.3.4 Không gian màu YUV (YCbCr) 2.4 Ảnh xám ảnh nhị phân .8 2.4.1 Ảnh xám .8 2.4.2 Ảnh nhị phân 2.5 Lọc nhiễu ảnh nhị phân xử lý ảnh 2.5.1 Phương pháp xói mịn 2.5.2 Phương pháp giãn nở .10 2.6 khái niệm video 10 2.6.1 Khái niệm 10 2.6.2 Tốc độ khung hình 11 CHƯƠNG 3: CƠ SỞ THỰC HIỆN 12 3.1 Lưu đồ giải thuật 12 3.2 Phân đoạn vùng tay chuyển động 13 3.2.1 Quá trình tiền xử lý ảnh 13 3.2.2 Phương pháp trừ 16 3.2.3 Phương pháp màu da 19 3.2.4 Phép AND 21 3.3 Phân đoạn bàn tay 23 3.4 Số lượng ngón tay 27 3.4.1 Tóm tắt trình xác định số lượng ngón tay 27 3.4.2 Vùng lồi điểm lõm xử lý ảnh 28 3.4.3 Loại bỏ số điểm lõm không cần thiết phân biệt số ngón tay 29 3.5 Xác định tọa độ ngón tay vẽ .32 CHƯƠNG 4: KẾT QUẢ THỰC NGHIỆM .33 4.1 Thực nghiệm đánh giá độ xác đếm số ngón tay .33 4.2 Kết vẽ tranh không trung dùng xử lý ảnh 33 CHƯƠNG 5: KẾT LUẬN VÀ ĐỊNH HƯỚNG ĐỀ TÀI 34 5.1 Kết đạt 34 5.2 Hạn chế 34 5.3 Hướng phát triển đề tài 34 PHỤ LỤC 35 TÀI LIỆU THAM KHẢO 46 DANH MỤC BẢNG BIỂU Bảng đánh giá độ xác việc xác định số lượng ngón tay 33 DANH MỤC HÌNH ẢN Hình 1.1 Ứng dụng thị giác máy tính để giám sát an ninh giao thông Vũng Tàu (báo Người lao động) Hình 1.2 Robot Sophia Hình 2.1 Ảnh raster .4 Hình 2.2 Ảnh vector Hình 2.3 Pixel ảnh .5 Hình 2.4 Xác định vị trí pixel ảnh Hình 2.5 Khơng gian màu RGB Hình 2.6 Khơng gian màu CMYK Hình 2.7 Khơng gian màu HSV Hình 2.8 Khơng gian màu YUV Hình 2.9 Ảnh xám .9 Hình 2.10 Ảnh nhị phân Hình 2.11 Ảnh trước sau xói mịn 10 Hình 2.12 Ảnh trước sau giãn nở 10 Hình 2.13 Cấu trúc phân đoạn video 11 Hình 3.1 Lưu đồ giải thuật 12 Hình 3.2 Quá trình tiền xử lý ảnh .13 Hình 3.3 Bảng số liệu thời tiết qua tháng môi trường thực nghiệm tài liệu 14 Hình 3.3 Các phương pháp trừ khác xử lý khung cảnh 14 Hình 3.4 Ảnh kết tốt phát diện da người 15 Hình 3.5 Biểu đồ thống kê số pixel màu da mà mơ hình màu phát 15 Hình 3.6 Ảnh trái ( ảnh nền) trừ với ảnh đầu vào ( ảnh phải) 16 Hình 3.7 Biến đổi ảnh mơ hình màu RGB thành ảnh xám .17 Hình 3.8 Kết sau trừ ảnh xám 17 Hình 3.9 Ảnh nhị phân kết trừ .18 Hình 3.10 Ảnh nhị phân sau qua xói mịn 18 Hình 3.11 Ảnh sau qua giãn nở 19 Hình 3.12 Kết lọc nhiễu .19 Hình 3.13 Kết phương pháp trừ 19 KHÓA LUẬN TỐT NGHIỆP GVHD: ThS Trần Hồn Hình 3.41 ngón tay đưa 3.5 Xác định tọa độ ngón tay vẽ Ở bước số lượng ngón tay, sinh viên xác định tọa độ điểm ngón tay dài tọa độ dùng để vẽ Bước cần lấy tọa độ điểm dài ra, lưu giá trị tọa độ cũ nó, xét điều kiện ngón tay vẽ từ giá trị tọa độ điểm cũ tới giá trị tọa độ điểm hình thành nét vẽ Hình 3.42 Lưu đồ giải thuật phần xác định tọa độ đầu ngón tay vẽ 33 SVTH: … KHÓA LUẬN TỐT NGHIỆP GVHD: ThS Trần Hoàn CHƯƠNG 4: KẾT QUẢ THỰC NGHIỆM 4.1 Thực nghiệm đánh giá độ xác đếm số ngón tay Trạng thái Số lần Tỉ lệ xác 15 75% 16 80% 18 90% 18 90% 20 100% 20 100% Tổng số thử nghiệm : 20 lần Bảng đánh giá độ xác việc xác định số lượng ngón tay 4.2 Kết vẽ tranh khơng trung dùng xử lý ảnh Khi đếm số ngón tay, lúc sinh viên thực xét trạng thái ngón tay để vẽ: - Trường hợp ngón bắt đầu vẽ điểm đầu ngón tay dài - Trường hợp ngón tay xóa nét vẽ Hình 4.1 Kết ngón bắt đầu vẽ Điểm vẽ ngón (ngón dài nhất) Hình 4.2 Trường hợp ngón xóa nét vẽ 34 SVTH: … KHÓA LUẬN TỐT NGHIỆP GVHD: ThS Trần Hoàn CHƯƠNG 5: KẾT LUẬN VÀ ĐỊNH HƯỚNG ĐỀ TÀI 5.1 Kết đạt - Hoàn thành khóa luận mong muốn Kỹ viết code gọi chương trình tiến sau khóa luận 5.2 Hạn chế - Nét vẽ bị đứt nét giai đoạn tiền xử lý ảnh chưa tốt Đơi đếm số ngón tay sai 5.3 Hướng phát triển đề tài - Điều khiển cánh tay robot để vẽ giống y nét vẽ khung ảnh 35 SVTH: … KHÓA LUẬN TỐT NGHIỆP GVHD: ThS Trần Hồn PHỤ LỤC Code chương trình #include "opencv/cv.h" #include "opencv/highgui.h" #include "CblobLabeling.h" #include #include #include #include using namespace std; void background_subtraction(IplImage*src, IplImage*dst, IplImage*bg); void skin_detection(IplImage*src, IplImage*dst); void hand_detection(IplImage*src, IplImage*dst, IplImage*mask); void fingers_counting(IplImage* src, IplImage* dst_hand, IplImage* dst); unsigned char num_fingers; // pt is the center // pt1 is the top left of blob // pt2 is the farthest point CvPoint pt, pt1, pt2, pt2_f, pt2_l; #define no_fingers 65 #define threshold_fingers 25 //Đk sáng chói //int minY = 53, maxY = 196, minU = 106, maxU = 140, minV = 128, maxV = 160; //Đk video //int minY = 170, maxY = 255, minU = 0, maxU = 140, minV = 119, maxV = 160; //Đk nhà int minY = 190, maxY = 255, minU = 0, maxU = 140, minV = 119, maxV = 160; const char* window0 = "setupYUV"; void main() { CvCapture* capture = cvCaptureFromFile("C:\\Users\\Huynh Tan Cuong\\Pictures\\Camera Roll\\1.mp4"); //CvCapture* capture = cvCaptureFromCAM(0); IplImage* frm; 36 SVTH: … KHÓA LUẬN TỐT NGHIỆP GVHD: ThS Trần Hoàn IplImage* frm1; IplImage* frm_resize = cvCreateImage(cvSize(cvQueryFrame(capture)>width / 2, (cvQueryFrame(capture))->height / 2), 8, 3); IplImage* frm_bg_resize = cvCreateImage(cvGetSize(frm_resize), 8, 3); IplImage* frm_bg = cvCreateImage(cvGetSize(frm_resize), 8, 1); IplImage* frm_bg_subtraction = cvCreateImage(cvGetSize(frm_resize), 8, 1); IplImage* frm_skin_detection = cvCreateImage(cvGetSize(frm_resize), 8, 1); IplImage* frm_hand_detection = cvCreateImage(cvGetSize(frm_resize), 8, 1); IplImage* hand = cvCreateImage(cvGetSize(frm_resize), 8, 3); IplImage* frm_draw = cvCreateImage(cvGetSize(cvQueryFrame(capture)), 8, 3); IplImage* frm_draw_binary = cvCreateImage(cvGetSize(cvQueryFrame(capture)), 8, 1); frm1 = cvQueryFrame(capture); cvSetZero(frm_draw); cvSetZero(frm_draw_binary); cvResize(frm1, frm_bg_resize, 1); //cvFlip(frm_bg_resize, frm_bg_resize, 1); //cvShowImage("Nen", Old_frame); cvCvtColor(frm_bg_resize, frm_bg, CV_RGB2GRAY); cvSmooth(frm_bg, frm_bg, CV_GAUSSIAN, 5); //cvShowImage("Nen2", Old_frame_Gray); //save fps ofstream myfile; myfile.open("C:\\Users\\Huynh Tan Cuong\\Desktop\\fps.csv"); while (1) { int64 now, then; float ticks = cvGetTickFrequency()*1.0e6; then = cvGetTickCount(); // get frm from CAM frm = cvQueryFrame(capture); if (!frm) break; // flip frame //cvFlip(frm, frm, 1); cvShowImage("Webcam", frm); // resize 0.5 to increase speed cvResize(frm, frm_resize, 1); // Background Subtraction background_subtraction(frm_resize, frm_bg_subtraction, frm_bg); //cvShowImage("Background Subtraction", frm_bg_subtraction); // skin detection 37 SVTH: … KHÓA LUẬN TỐT NGHIỆP GVHD: ThS Trần Hoàn skin_detection(frm_resize, frm_skin_detection); //cvShowImage("Skin Detection", frm_skin_detection); // hand detection cvAnd(frm_skin_detection, frm_bg_subtraction, frm_hand_detection); cvShowImage("Hand Detection", frm_hand_detection); // HAND hand_detection(frm_resize, hand, frm_hand_detection); // //finger counting fingers_counting(frm_hand_detection, hand, frm); //cvShowImage("Webcam draw", frm); //cvShowImage("Draw hand", hand); //Draw if (num_fingers == 1) { cvLine(frm_draw, pt2_l, pt2_f, CV_RGB(255, 0, 0), 5); cvLine(frm_draw_binary, pt2_l, pt2_f, CV_RGB(255, 255, 255), 5); } if (num_fingers == 5) { cvSetZero(frm_draw); cvSetZero(frm_draw_binary); } cvCopy(frm_draw, frm, frm_draw_binary); pt2_l = pt2_f; //printf("pointpt2_l: %d\n", pt2_l); cvShowImage("End", frm); /*cvShowImage("End2", frm_draw); cvShowImage("End3", frm_draw_binary);*/ // now = cvGetTickCount(); float frame_time = (now - then) / ticks; float fps = / frame_time; myfile width, src->height), 8, 1); IplImage* tmp2 = cvCreateImage(cvSize(src->width, src->height), 8, 1); IplImage* tmp3 = cvCreateImage(cvSize(src->width, src->height), 8, 1); //Background Subtraction cvCvtColor(src, tmp1, CV_RGB2GRAY); //cvShowImage("Background Subtraction 1", tmp1); cvAbsDiff(tmp1, bg, tmp2); cvSmooth(tmp2, tmp2, CV_GAUSSIAN, 15); //cvShowImage("Background Subtraction 2", tmp2); cvThreshold(tmp2, tmp3, 30, 255, CV_THRESH_BINARY); //cvShowImage("Background Subtraction 3", tmp3); cvErode(tmp3, dst, cvCreateStructuringElementEx(3, 3, 0, 0, CV_SHAPE_ELLIPSE, 0)); //cvShowImage("Background Subtraction 4", dst); cvDilate(dst, dst, cvCreateStructuringElementEx(5, 5, 0, 0, CV_SHAPE_ELLIPSE, 0)); //cvShowImage("Background Subtraction 5", dst); } void skin_detection(IplImage*src, IplImage*dst) { // khai bao thong so trackbar dieu chinh nguong tmp1 cvNamedWindow(window0); cvCreateTrackbar("MinY", window0, &minY, 255); cvCreateTrackbar("MaxY", window0, &maxY, 255); cvCreateTrackbar("MinU", window0, &minU, 140); cvCreateTrackbar("MaxU", window0, &maxU, 140); cvCreateTrackbar("MinV", window0, &minV, 140); cvCreateTrackbar("MaxV", window0, &maxV, 160); // khai bao bien trung gian IplImage* tmp1 = cvCreateImage(cvSize(src->width, src->height), 8, 3); IplImage* tmp2 = cvCreateImage(cvSize(src->width, src->height), 8, 1); IplConvKernel* Element1; IplConvKernel* Element2; //SkinColor cvSmooth(src, src, CV_GAUSSIAN, 5); 39 SVTH: … KHÓA LUẬN TỐT NGHIỆP GVHD: ThS Trần Hoàn //cvShowImage("Skin Detection S0", src); cvCvtColor(src, tmp1, CV_RGB2YUV); //cvShowImage("Skin Detection S1", tmp1); cvInRangeS(tmp1, cvScalar(minY, minU, minV), cvScalar(maxY, maxU, maxV), tmp2); //cvShowImage("Skin Detection S2", tmp2); Element1 = cvCreateStructuringElementEx(5, 5, 0, 0, CV_SHAPE_ELLIPSE, 0); Element2 = cvCreateStructuringElementEx(7, 7, 0, 0, CV_SHAPE_ELLIPSE, 0); cvErode(tmp2, dst, Element1); //cvShowImage("Skin Detection S3", dst); cvDilate(dst, dst, Element2); //cvShowImage("Skin Detection S4", dst); } void hand_detection(IplImage*src, IplImage*dst, IplImage*mask) { cvErode(mask, mask, cvCreateStructuringElementEx(5, 5, 3, 3, CV_SHAPE_ELLIPSE, 0)); cvDilate(mask, mask, cvCreateStructuringElementEx(7, 7, 6, 6, CV_SHAPE_ELLIPSE, 0)); // BLOB LABELING CBlobLabeling blob; blob.SetParam(mask, 40); // area blob.DoLabeling(); time here blob.BlobSmallSizeConstraint(50, 50); // size blob.BlobBigSizeConstraint(200, 250); // size max int Hand_Blob_Index = 0; // much //only select right most blob for (int i = 0; i < blob.m_nBlobs; i++) { if ((blob.m_recBlobs[Hand_Blob_Index].x < blob.m_recBlobs[i].x) && (blob.m_recBlobs[Hand_Blob_Index].y > blob.m_recBlobs[i].y)) { Hand_Blob_Index = i; } } // cut image if (blob.m_nBlobs) { CvSize size_blob = cvSize(blob.m_recBlobs[Hand_Blob_Index].width, blob.m_recBlobs[Hand_Blob_Index].height); // pt1 is the top left of the blob, pt is the center of palm 40 SVTH: … KHÓA LUẬN TỐT NGHIỆP GVHD: ThS Trần Hoàn pt1 = cvPoint((blob.m_recBlobs[Hand_Blob_Index].x), (blob.m_recBlobs[Hand_Blob_Index].y)); int width_new = (blob.m_recBlobs[Hand_Blob_Index].width); int height_new = (blob.m_recBlobs[Hand_Blob_Index].height); IplImage* sub_skin_tmp = cvCreateImage(cvSize(width_new, height_new), 8, 1); IplImage* sub_skin = cvCreateImage(cvSize(width_new, height_new), 8, 1); sub_skin->origin = src->origin; cvSetImageROI(mask, cvRect(pt1.x, pt1.y, width_new, height_new)); cvCopy(mask, sub_skin, 0); cvResetImageROI(mask); cvZero(mask); // DISTANT TRANSFORM IplImage* sub_skin_temp = cvCreateImage(cvSize(width_new, height_new), IPL_DEPTH_32F, 1); cvDistTransform(sub_skin, sub_skin_temp, CV_DIST_L2, 3); pt.x = pt.y = 0; pt2.x = pt2.y = 0; float max_DT = 0.0; int radius = 40; float* data_sub_1 = (float*)sub_skin_temp->imageData; int sub_w = sub_skin_temp->width; int sub_h = sub_skin_temp->height; int sub_wh = sub_skin_temp->width; for (int j = 0; j < sub_h; j++) for (int i = 0; i max_DT) { max_DT = data_sub_1[j*sub_wh + i]; // hand center pt.x = i; pt.y = j; } } // REMOVE WRIST uchar* data_sub_2 = (uchar*)sub_skin->imageData; sub_wh = sub_skin->widthStep; 41 SVTH: … KHÓA LUẬN TỐT NGHIỆP GVHD: ThS Trần Hoàn for (int j = 0; j(pt.y + radius)) { data_sub_2[j*sub_wh + i] = 0; } } } cvSetImageROI(mask, cvRect(pt1.x, pt1.y, width_new, height_new)); cvCopy(sub_skin, mask, 0); cvResetImageROI(mask); // show Distant transform as a skeleton of hand cvNormalize(sub_skin_temp, sub_skin_temp, 0.0, 1.0, CV_MINMAX); cvShowImage("Skeleton", sub_skin_temp); // pt is the center // pt1 is the top left of blob // pt2 is the farthest point pt2.x = pt1.x + pt2.x; pt2.y = pt1.y + pt2.y; pt.x = pt1.x + pt.x; pt.y = pt1.y + pt.y; //cvCircle(src, pt, 5, CV_RGB(0, 255, 0), 5); } // CREATE HAND cvSetZero(dst); cvCopy(src, dst, mask); //cvShowImage("result", dst); //cvShowImage("mask", mask); } void fingers_counting(IplImage* src, IplImage* dst_hand, IplImage* dst) { CvMemStorage* storage = cvCreateMemStorage(); CvSeq* first_contour = NULL; 42 SVTH: … KHÓA LUẬN TỐT NGHIỆP GVHD: ThS Trần Hoàn CvSeq* maxitem = NULL; double area = 0, areamax = 0; CvPoint pt3; int maxn = 0; int Nc = cvFindContours(src, storage, &first_contour, sizeof(CvContour), CV_RETR_LIST); int n = 0; CvFont font; //printf("Total Contours Detected: %d\n", Nc); if (Nc>0) { for (CvSeq* c = first_contour; c != NULL; c = c->h_next) { area = cvContourArea(c, CV_WHOLE_SEQ); if (area>areamax) { areamax = area; maxitem = c; maxn = n; } n++; } CvMemStorage* storage3 = cvCreateMemStorage(0); // the area should be larger than a fixed value if (areamax>1000) { maxitem = cvApproxPoly(maxitem, sizeof(CvContour), storage3, CV_POLY_APPROX_DP, 10, 1); CvPoint pt0; CvPoint end_pt; CvMemStorage* storage1 = cvCreateMemStorage(0); CvMemStorage* storage2 = cvCreateMemStorage(0); CvSeq* ptseq = cvCreateSeq(CV_SEQ_KIND_GENERIC | CV_32SC2, sizeof(CvContour), sizeof(CvPoint), storage1); CvSeq* hull; CvSeq* defects; // for (int i = 0; i < maxitem->total; i++) { CvPoint* p = CV_GET_SEQ_ELEM(CvPoint, maxitem, i); pt0.x = p->x; pt0.y = p->y; cvSeqPush(ptseq, &pt0); } hull = cvConvexHull2(ptseq, 0, CV_CLOCKWISE, 0); 43 SVTH: … KHÓA LUẬN TỐT NGHIỆP GVHD: ThS Trần Hoàn pt3.x = 0; pt3.y = 0; // for (int x = 0; xtotal; x++) { CvPoint hull_pt = **CV_GET_SEQ_ELEM(CvPoint*, hull, x); if (pt3.x == && pt3.y == 0) { pt3 = hull_pt; end_pt = pt3; } // draw on mask cvLine(dst_hand, pt3, hull_pt, CV_RGB(255, 0, 0), 1); if (x == hull->total - 1) cvLine(dst_hand, hull_pt, end_pt, CV_RGB(255, 0, 0), 1); // draw on frame CvPoint pt3_f, hull_pt_f, end_pt_f; pt3_f.x = pt3.x * 2; pt3_f.y = pt3.y * 2; hull_pt_f.x = hull_pt.x * 2; hull_pt_f.y = hull_pt.y * 2; end_pt_f.x = end_pt.x * 2; end_pt_f.y = end_pt.y * 2; cvLine(dst, pt3_f, hull_pt_f, CV_RGB(255, 0, 0), 1); pt3 = hull_pt; // draw on frame if (x == hull->total - 1) cvLine(dst, hull_pt_f, end_pt_f, CV_RGB(255, 0, 0), 1); } int hullcount = hull->total; defects = cvConvexityDefects(ptseq, hull, storage2); //printf(" defect no %d \n", defects->total); CvConvexityDefect* defectArray; num_fingers = 1; // This cycle marks all defects of convexity of current contours for (; defects; defects = defects->h_next) { int nomdef = defects->total; // defect amount if (nomdef == 0) continue; // Alloc memory for defect set defectArray = (CvConvexityDefect*)malloc(sizeof(CvConvexityDefect)*nomdef); // Get defect set 44 SVTH: … KHÓA LUẬN TỐT NGHIỆP GVHD: ThS Trần Hoàn cvCvtSeqToArray(defects, defectArray, CV_WHOLE_SEQ); // Draw marks for all defects for (int i = 0; i threshold_fingers) { num_fingers++; //printf(" defect depth for defect %d %f \n",i,defectArray[i].depth); cvCircle(dst_hand, *(defectArray[i].start), 5, CV_RGB(255, 0, 0), 2, 8, 0); cvCircle(dst_hand, *(defectArray[i].depth_point), 5, CV_RGB(0, 0, 255), 2, 8, 0); cvLine(dst_hand, *(defectArray[i].start), *(defectArray[i].depth_point), CV_RGB(255, 255, 0), 1, CV_AA, 0); cvLine(dst_hand, *(defectArray[i].depth_point), *(defectArray[i].end), CV_RGB(255, 255, 0), 1, CV_AA, 0); } } // Free memory free(defectArray); } // In case Num = double fDist = sqrt((double)((pt.x - pt2.x)*(pt.x - pt2.x) + (pt.y pt2.y)*(pt.y - pt2.y))); if (num_fingers == && fDist < no_fingers) num_fingers = 0; // draw on hand cvLine(dst_hand, pt, pt2, CV_RGB(255, 255, 0), 2); cvCircle(dst_hand, cvPoint(pt.x, pt.y), 4, CV_RGB(0, 255, 0), 2); cvCircle(dst_hand, cvPoint(pt2.x, pt2.y), 4, CV_RGB(0, 0, 255), 2); // draw on frame CvPoint pt_f; pt_f.x = pt.x * 2; pt_f.y = pt.y * 2; pt2_f.x = pt2.x * 2; pt2_f.y = pt2.y * 2; cvLine(dst, pt_f, pt2_f, CV_RGB(255, 255, 0), 2); cvCircle(dst, cvPoint(pt_f.x, pt_f.y), 4, CV_RGB(0, 255, 0), 2); cvCircle(dst, cvPoint(pt2_f.x, pt2_f.y), 4, CV_RGB(0, 0, 255), 2); //printf("pointpt2: %d\n", pt2_f); // print num of finger on the screen char txt[] = "0"; 45 SVTH: … KHÓA LUẬN TỐT NGHIỆP GVHD: ThS Trần Hoàn txt[0] = '0' + num_fingers; cvInitFont(&font, CV_FONT_HERSHEY_DUPLEX, 1.0, 1.0, 0, 2, CV_AA); cvPutText(dst, txt, cvPoint(50, 50), &font, cvScalar(0, 0, 255, 0)); // release Storage cvReleaseMemStorage(&storage); cvReleaseMemStorage(&storage1); cvReleaseMemStorage(&storage2); cvReleaseMemStorage(&storage3); } } } 46 SVTH: … KHÓA LUẬN TỐT NGHIỆP GVHD: ThS Trần Hồn TÀI LIỆU THAM KHẢO Giáo trình [1] Trần Hồn, Trích “ LUẬN VĂN THẠC SĨ”, Trường Đại học Bách khoa TPHCM [2] Abdullah Hasan AlSaadi et al ,“Analysis of different background subtraction methods applied on Drone imagery under various weather conditions in the UAE region”, Tawazun Technology and Innovation (TTI), Khalifa University, Abu Dhabi, United Arab Emirates [3] S Kolkur et al ,” Human Skin Detection Using RGB, HSV and YCbCr Color Models”, Department of Computer Engineering, Sardar Patel Institute of Technology, Andheri,Mumbai, India Trang web [1] http://hano.cf/ (trang hướng dẫn cài đặt opencv + visual + tài liệu) [3] https://funvision.blogspot.com/ (Trang hướng dẫn xử lý ảnh) [4] https://docs.opencv.org/2.4/index.html (Trang web cấu trúc mẫu code C/C++) [5] https://abnerrjo.github.io/ (Trang web cấu trúc mẫu code C/C++) 47 SVTH: … ... Trần Hoàn xử lý ảnh (object detection), v v Những câu lệnh xử lý ảnh đa số dùng với ảnh nhị phân để xử lý Chính chương trình xử lý ảnh, việc chuyển đổi ảnh từ camera hay từ video sang ảnh nhị phân... 2.4 Ảnh xám ảnh nhị phân 2.4.1 Ảnh xám Ảnh xám (GrayScale) đơn giản hình ảnh màu sắc thái màu xám Lý cần phải phân biệt ảnh xám ảnh khác nằm việc ảnh xám cung cấp thơng tin cho pixel Với ảnh. .. tài ? ?Vẽ tranh không trung dùng xử lý ảnh? ?? 1.2 Các công trình nghiên cứu liên quan 1.2.1 Trong nước Ngày 21-12, TP Vũng Tàu (tỉnh Bà Rịa-Vũng Tàu), Trung tâm điều hành đô thị thông minh (trung