MÔ PHỎNG NHẬN DIỆN mầu sắc dùng visual studio 2013 (có code) ....... MÔ PHỎNG NHẬN DIỆN mầu sắc dùng visual studio 2013 (có code) ....... MÔ PHỎNG NHẬN DIỆN mầu sắc dùng visual studio 2013 (có code) ....... MÔ PHỎNG NHẬN DIỆN mầu sắc dùng visual studio 2013 (có code) .......
MÔ PHỎNG NHẬN DIỆN MẦU SẮC MỤC LỤC DANH MỤC CÁC HÌNH VẼ IV DANH MỤC CÁC TỪ VIẾT TẮT V DANH MỤC CÁC BẢNG BIỂU .VI LỜI MỞ ĐẦU VII CHƯƠNG TỔNG QUAN VỀ ĐỀ TÀI 1.1 GIỚI THIỆU 1.2 YÊU CẦU CHƯƠNG GIỚI THIỆU VỀ THƯ VIỆN OPENCV 2.1 GIỚI THIỆU 2.2 SƠ LƯỢC VỀ CẤU TRÚC CỦA THƯ VIỆN OPENCV .3 2.3 CÀI ĐẶT OPENCV CHO VISUAL STUDIO 2013 CHƯƠNG GIỚI THIỆU VỀ XỬ LÝ ẢNH 3.1 ẢNH SỐ .7 3.1.1 Điểm ảnh (Picture Element) .7 3.1.2 Độ phân giải ảnh 3.1.3 Mức xám ảnh 3.2 PHÂN LOẠI ẢNH 3.2.1 Ảnh đen trắng 3.2.2 Ảnh nhị phân .8 3.2.3 Ảnh màu 3.3 CÁC GIAI ĐOẠN XỬ LÝ ẢNH 11 3.3.1 Phần thu nhận ảnh (Image Acquisition) 12 3.3.2 Tiền xử lý (Image Processing) 12 3.3.3 Phân đoạn (Segmentation) hay phân vùng ảnh 12 3.3.4 Biểu diễn ảnh (Image Representation) 12 3.3.5 Nhận dạng nội suy ảnh (Image Recognition and Interpretation) 12 3.3.6 Cơ sở tri thức (Knowledge Base) 13 3.3.7 Mô tả .13 CHƯƠNG CHƯƠNG TRÌNH MƠ PHỎNG NHẬN DIỆN MÀU SẮC .14 4.1 CHƯƠNG TRÌNH GIẢI THUẬT 14 4.2 CÁC PHÉP TỐN HÌNH THÁI HỌC 15 4.3 KẾT QUẢ MÔ PHỎNG .16 CHƯƠNG NHẬN XÉT 18 5.1 ƯU ĐIỂM 18 5.2 NHƯỢC ĐIỂM 18 5.3 HƯỚNG PHÁT TRIỂN .18 TÀI LIỆU THAM KHẢO 19 PHỤ LỤC 20 DANH MỤC CÁC HÌNH VẼ HÌNH 2-1: LỊCH SỬ PHÁT TRIỂN CỦA OPENCV [1] .2 HÌNH 2-2: CẤU TRÚC CỦA OPENCV [2] .3 HÌNH 2-3: CỬA SỔ THƠNG TIN VỀ HỆ THỐNG CỦA WINDOWS HÌNH 2-4: CỬA SỔ THUỘC TÍNH CỦA HỆ THỐNG HÌNH 3-1: KHƠNG GIAN MÀU RGB [3] HÌNH 3-2: KHƠNG GIAN MÀU HSV [4] 10 HÌNH 3-3: HÌNH ẢNH KHI CHUYỂN ĐỔI CÁC KHƠNG GIAN MÀU [5] 11 HÌNH 3-4: CÁC BƯỚC CƠ BẢN TRONG XỬ LÝ ẢNH [6] .11 HÌNH 3-5: SƠ ĐỒ PHÂN TÍCH VÀ XỬ LÝ ẢNH [7] 13 HÌNH 4-1: CHƯƠNG TRÌNH GIẢI THUẬT .14 HÌNH 4-2: TẠO CÁC THANH TRƯỢT TRÊN CỬA SỔ TRACBARS 16 HÌNH 4-3: HÌNH ẢNH VẬT THỂ SAU KHI CO GIÃN 16 HÌNH 4-4: HÌNH ẢNH CHUYỂN SANG KHƠNG GIAN MÀU HSV 17 HÌNH 4-5: KẾT QUẢ XÁC ĐỊNH MÀU CỦA VẬT THỂ 17 DANH MỤC CÁC TỪ VIẾT TẮT OpenCV Open Source Computer Vision R Red G Green B Blue H Hue S Saturation V Value IEEE Institute of Electrical and Electronics Engineers PEL Picture Element DANH MỤC CÁC BẢNG BIỂU No table of contents entries found LỜI MỞ ĐẦU Trong năm gần đây, nói xử lý ảnh số thị giác máy tính ngày phát triển Việc kết hợp xử lý ảnh 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í…đãtạo nhiều sản phẩm ứng dụng đời sống hàng ngày khoa học, an ninh, y học, quân Trang 1/26 CHƯƠNG TỔNG QUAN VỀ ĐỀ TÀI 1.1 Giới thiệu Trong sản xuất công nghiệp nông nghiệp, việc kiểm tra ngoại quan (Visual Check) sản phẩm vô cần thiết Công việc giúp cho sản phẩm trước tung thị trường có chất lượng đồng đều, loại bỏ sản phẩm khơng phù hợp q trình sản xuất phân loại sản phẩm thành nhóm khác Ví dụ: phân loại rau thành chín xanh, phân loại gạch thành loại 1, 2, Hiện việc kiểm tra chủ yếu người đảm nhiệm để tránh sai sót yếu tố người để đạt suất cao, việc tự động hóa khâu kiểm tra ngoại quan vô cần thiết Xuất phát từ nhu câu thực tiễn ứng dụng công nghệ xử lý ảnh để thay cho khâu kiểm tra ngoại quan người thực Có nhiều phương pháp kiểm tra đề tài giới thiệu phương pháp theo hướng nhận diện màu sắc đối tượng, sử dụng phần mềm Visual Studio 2013 kết hợp với thư viện OpenCV 1.2 Yêu cầu Để thực đề tài cần: - Tìm hiểu vấn đề ảnh số, xử lý ảnh số - Tìm hiểu thư viện xử lý ảnh OpenCV C++ - Tìm hiểu giải thuật nhận diện màu sắc - Viết phần mềm mô nhận diện màu sắc vật thể từ camera C++ Mô Phỏng Nhận Diện Mầu Sắc Trang 2/26 CHƯƠNG GIỚI THIỆU VỀ THƯ VIỆN OPENCV 1.3 Giới thiệu OpenCV (Open Source Computer Vision) thư viện mã nguồn mở thị giác máy tính với 500 hàm 2500 thuật toán đư ợc tối ưu xử lý ảnh, vấn đề liên quan tới thị giác máy OpenCV thiết kế cách tối ưu, sử dụng tối đa sức mạnh dòng chip đa lõi… để thực phép tính tốn thời gian thực, nghĩa tốc độ đáp ứng đủ nhanh cho ứng dụng thơng thường OpenCV hoạt động nhiều tảng khác Window, Linux, Mac, iOS Hình 2-1: Lịch sử phát triển OpenCV [1] OpenCV năm 1999, đến năm 2000 giới thiệu hội nghị IEEE vấn đề thị giác máy nhận dạng, năm 2006 OpenCV version 1.0 thức cơng bố OpenCV version 1.1 vào năm 2008 đời Tháng 10 năm 2009, OpenCV version 2.0 đời Thư viện OpenCV ban đầu hỗ trợ từ Intel, sau hỗ trợ bở Willow Garage, phòng thí nghiệm chuyên nghiên cứu công nghệ Robot Cho đến nay, OpenCV thư viện mở, phát triển nguồn quỹ không lợi nhuận hưởng ứng lớn cộng đồng Mô Phỏng Nhận Diện Mầu Sắc Trang 3/26 1.4 Sơ lược cấu trúc thư viện OpenCV Cấu trúc OpenCV chia làm phần chính: Hình 2-2: Cấu trúc OpenCV [2] CXCORE chứa định nghĩa kiểu liệu sở, đại số tuyến tính, phương pháp thống kê, chức trì, điều khiển chuỗi số chức đồ họa dùng để vẽ ảnh CV chứa thuật tốn xử lý ảnh, định kích cỡ camera chức hình họa máy tính CVAUX chứa mã cũ thử nghiệm Ngoài có giao diện đơn cho nhận diện ảnh HIGHGUI chứa giao diện vào bản, chứa khả cửa sổ mở rộng vào video CVCAM chứa giao diện cho video truy cập Windows 32 bits Các chức OpenCV tập trung vào thu thập ảnh, xử lí ảnh thuật tốn phân tích liệu ảnh, bao gồm: - Truy xuất ảnh phim: Đọc ảnh số từ camera, từ file, ghi ảnh phim - Cấu trúc liệu ảnh số liệu hỗ trợ cần thiết: Ma trận, vector, chuỗi - Xử lí ảnh bản: Các lọc có sẵn, tìm chi tiết cạnh, góc, chỉnh đổi màu, phóng to thu nhỏ hiệu chỉnh histograms Mô Phỏng Nhận Diện Mầu Sắc Trang 12/26 Nhận dạng ảnh trình so sánh ảnh với mẫu chuẩn lưu từ trước Nội suy phán đoán theo ý nghĩa sở nhận dạng Có hai loại nhận dạng ảnh bản: - Nhận dạng theo tham số - Nhận dạng theo cấu trúc 1.1.12 Cơ sở tri thức (Knowledge Base) Trong nhiều khâu xử lý phân tích ảnh ngồi nhiều khâu xử lý theo phương pháp trí tuệ người Đó kết việc áp dụng cơ sở tri thức 1.1.13 Mô tả Ảnh sau số hoá lưu vào nhớ, chuyển sang khâu để phân tích Ảnh lưu trữ mơ tả lại theo đặc trưng như: biên ảnh (Boundary), vùng ảnh (Region) Một số phương pháp biểu diễn thường dùng: - Biểu diễn mã chạy (Run-Length Code) - Biểu diễn mã xích (Chaine -Code) - Biểu diễn mã tứ phân (Quad-Tree Code) Hình 3-5: Sơ đồ phân tích xử lý ảnh [7] Trong thực tế, trình sử dụng ảnh số không thiết phải qua hết khâu tùy theo đặc điểm ứng dụng Ở hình ảnh sau số hóa nén, lưu lai để truyền cho hệ thống khác sử dụng để xử lý Mặt khác, ảnh Mô Phỏng Nhận Diện Mầu Sắc Trang 13/26 sau số hóa bỏ qua cơng đoạn nâng cao chất lượng chuyển tới khâu phân đoạn bỏ tiếp khâu phân đoạn chuyển trực tiếp tới khâu trích chọn đặc trưng CHƯƠNG CHƯƠNG TRÌNH MƠ PHỎNG NHẬN DIỆN MÀU SẮC 1.9 Chương trình giải thuật Hình 4-1: Chương trình giải thuật Dựa vào chương trình giải thuật hiểu chương trình mơ nhận diện màu sắc hoạt động sau: Mô Phỏng Nhận Diện Mầu Sắc Trang 14/26 - Bắt đầu chương trình camera hoạt động - Các khung ảnh theo dõi bật lên - Sau khung ảnh khơng gian màu RGB chuyển thành khơng gian màu HSV - Chương trình bắt đầu tìm kiếm vật thể - Nếu vật thể tìm thấy gán giá trị màu HSV nhỏ HSV lớn nhất, giá trị vẽ lên vật thể màu với màu vật thể Đồng thời vật thể gán tên màu - Nếu có q nhiều vật thể, số vật thể tối đa 50 vượt múc khơng xac định vật thể, khung hình gán chữ TOO MUCH NOISE! 1.10 Các phép tốn hình thái học Các phép tốn hình thái học phép toán liên quan tới cấu trúc hình học đối tượng ảnh Các phép tốn hình thái học tiêu biểu bao gồm phép giãn nở (dialation) phép co (erosion), phép mở (opening) phép đóng (closing) Trong đề tài ta xét phép giãn nở phép co Trong OpenCV, phép toán hình thái học ảnh cài đặt hàm cv::morphologyEx, riêng phép giãn nở phép co gọi trực tiếp từ hàm cv::dilate cv::erode: morphologyEx(const Mat& src, Mat& dst, int op, const Mat& element, Point anchor, int iterations, int borderType, const Scalar& borderValue) với src, dst ảnh đầu vào ảnh sau phép xử lý hình thái học, op kiểu lựa chọn phép hình thái học, element cấu trúc phần tử ảnh Cấu trúc phần tử ảnh gán hàm: getStructuringElement(int shape, Size ksize, Point anchor) Với shape kiểu hình khối, ksize kích thước hình khối khích thước hai số nguyên lẻ, anchor điểm neo Xử lý video Mô Phỏng Nhận Diện Mầu Sắc Trang 15/26 Để đọc video từ file video thiết bị webcam, camera ta dùng hàm cv::VideoCapture Để lấy frame ảnh video, ta dùng hàm read(cv::Mat& img) 1.11 Kết mơ Hình 4-2: Tạo trượt cửa sổ Tracbars Hình 4-3: Hình ảnh vật thể sau co giãn Mô Phỏng Nhận Diện Mầu Sắc Trang 16/26 Hình 4-4: Hình ảnh chuyển sang không gian màu HSV Mô Phỏng Nhận Diện Mầu Sắc Trang 17/26 Hình 4-5: Kết xác định màu vật thể Mô Phỏng Nhận Diện Mầu Sắc Trang 18/26 CHƯƠNG NHẬN XÉT 1.12 Ưu điểm Khả đọc màu, quan sát phát tối tượng nhanh, thơng số tính tốn hinể thị rõ ràng phát triển sở phân biệt màu sắc, hình dạng đối tượng qua camera 1.13 Nhược điểm Nhược điểm đề tài sử dụng máy tính nên tốn khoảng không gian cần thiết Do vùng màu xanh đặt giá trị chưa xác nên xảy tình trạng nhiễu màu Màu đỏ vàng xác định xác màu xanh xanh lục Đề tài mang tính minh họa cho hướng ứng dụng xử lý ảnh số sản xuất đời sống 1.14 Hướng phát triển Đề tài cần cải tiến cho quét vật thể diện tích rộng hơn, xây dựng mơ hình thực, phân tích loại bỏ nhiễu ánh sáng bên ngoài, xử dụng chip công nghệ ASIC, FPGA, vi xử lý, vi điều khiển thay cho máy vi tính để phù hợp với yêu cầu thực tế dây chuyền sản xuất nhà máy xí nghiệp Ví dụ như: phân loại gạch chính, phế phẩm kiểm tra lỗi Ngồi chương trình ứng dụng dây chuyền khác như: Phân loại gạo, cà chua, tiêu, lò nướng bánh mì, tơm…Hệ thống dễ vận hành sửa chữa dễ dàng mà khơng cần đến trình độ chuyên gia Với công nghệ tự động, khả giám sát giải tốn thủ cơng TÀI LIỆU THAM KHẢO Tiếng Việt: Mô Phỏng Nhận Diện Mầu Sắc Trang 19/26 [1] Đề tài xử lý ảnh bám đối tượng (2011), Hà Tiến Thanh [2] Đề tài xử lý ảnh bám đối tượng (2011), Hà Tiến Thanh [3] Không gian màu, < http://www.comvisap.com/2012/01/ktcb6.html> [4] Không gian màu, < http://www.comvisap.com/2012/01/ktcb6.html> [5] Ứng dụng xử lý ảnh thực tế với thư viện OpenCV, Nguyễn Văn Long [6] Giáo trình xử lý ảnh (2006), PGS.TS Nguyễn Quang Hoan [7] Giáo trình xử lý ảnh (2006), PGS.TS Nguyễn Quang Hoan Nhập môn xử lý ảnh số, ĐH Bách Khoa Hà Nội Nguyễn Văn Ngọ (2001), xử lý ảnh (dịch từ Two Dimensional Signal and Image Processing tác giả Jae S.Lim) Nguyễn Kim Sách (1997), xử lý ảnh video số, NXB Khoa học kỹ thuật, Hà Nội Ngô Diên Tập (1997) , xử lý ảnh máy tính, NXB Khoa học kỹ thuật Hà Nội Tạp chí khoa học ứng dụng Mô Phỏng Nhận Diện Mầu Sắc Trang 20/26 PHỤ LỤC Chương trình mơ nhận diện màu sắc #include #include #include #include #include #include #include "OpenCV2/highgui/highgui.hpp" #include "OpenCV2/imgproc/imgproc.hpp" #include "Object.h" using namespace cv; using namespace std; int H_MIN = 0; int H_MAX = 256; int S_MIN = 0; int S_MAX = 256; int V_MIN = 0; int V_MAX = 256; const int FRAME_WIDTH = 640; const int FRAME_HEIGHT = 480; const int MAX_NUM_OBJECTS=50; const int MIN_OBJECT_AREA = 20*20; const int MAX_OBJECT_AREA = FRAME_HEIGHT*FRAME_WIDTH/1.5; const string windowName = "Original Image"; const string windowName1 = "HSV Image"; const string windowName2 = "Thresholded Image"; const string trackbarWindowName = "Trackbars"; Mô Phỏng Nhận Diện Mầu Sắc Trang 21/26 void on_trackbar( int, void* ) {} string intToString(int number){ std::stringstream ss; ss contours, vector hierarchy){ Mô Phỏng Nhận Diện Mầu Sắc Trang 22/26 for(int i =0; i < theObject.size(); i++){ cv::drawContours(frame, contours, i, theObject.at(i).getColor(), 3, 8, hierarchy); cv::circle(frame,cv::Point(theObject.at(i).getXPos(),theObject.at(i).getYPos()),5, theObject.at(i).getColor()); cv::putText(frame,intToString(theObject.at(i).getXPos()) +","+intToString(theObject.at(i).getYPos()),cv::Point(theObject.at(i).getXPos(),t heObject.at(i).getYPos()+20),1,1,theObject.at(i).getColor()); cv::putText(frame,theObject.at(i).getType(),cv::Point(theObject.at(i).getXPos(),t heObject.at(i).getYPos()-20),1,2,theObject.at(i).getColor());}} void drawObject(vector theObject,Mat &frame){ for(int i =0; i < theObject.size(); i++){ cv::circle(frame,cv::Point(theObject.at(i).getXPos(),theObject.at(i).getYPos()),1 0,cv::Scalar(0,0,255)); cv::putText(frame,intToString(theObject.at(i).getXPos()) +","+intToString(theObject.at(i).getYPos()),cv::Point(theObject.at(i).getXPos(),t heObject.at(i).getYPos()+20),1,1,Scalar(0,255,0)); cv::putText(frame,theObject.at(i).getType(),cv::Point(theObject.at(i).getXPos(),t heObject.at(i).getYPos()-30),1,2,theObject.at(i).getColor());}} void morphOps(Mat &thresh){ Mat erodeElement = getStructuringElement( MORPH_RECT,Size(3,3)); Mat dilateElement = getStructuringElement( MORPH_RECT,Size(8,8)); erode(thresh,thresh,erodeElement); erode(thresh,thresh,erodeElement); dilate(thresh,thresh,dilateElement); dilate(thresh,thresh,dilateElement);} void trackFilteredObject(Mat threshold,Mat HSV, Mat &cameraFeed) { vector objects; Mat temp; threshold.copyTo(temp); Mô Phỏng Nhận Diện Mầu Sắc Trang 23/26 vector< vector > contours; vector hierarchy; findContours(temp,contours,hierarchy,CV_RETR_CCOMP,CV_CHAIN_APPR OX_SIMPLE); double refArea = 0; bool objectFound = false; if (hierarchy.size() > 0) { int numObjects = hierarchy.size(); if(numObjects= 0; index = hierarchy[index][0]) { Moments moment = moments((cv::Mat)contours[index]); double area = moment.m00; if(area>MIN_OBJECT_AREA) { Object object; object.setXPos(moment.m10/area); object.setYPos(moment.m01/area); objects.push_back(object); objectFound = true;} else objectFound = false;} if(objectFound ==true) { drawObject(objects,cameraFeed);}} Else putText(cameraFeed,"TOO MUCH NOISE! ADJUST FILTER", Point(0,50), 1, 2, Scalar(0,0,255),2);}} void trackFilteredObject(Object theObject,Mat &cameraFeed){ vector objects; Mat temp; threshold.copyTo(temp); vector< vector > contours; Mô Phỏng Nhận Diện Mầu Sắc threshold,Mat HSV, Mat Trang 24/26 vector hierarchy; findContours(temp, contours, hierarchy, CV_RETR_CCOMP, CV_CHAIN_APPROX_SIMPLE, Point(0, 0)); double refArea = 0; bool objectFound = false; if (hierarchy.size() > 0) { int numObjects = hierarchy.size(); if(numObjects= 0; index = hierarchy[index][0]) { Moments moment = moments((cv::Mat)contours[index]); double area = moment.m00; if(area>MIN_OBJECT_AREA){ Object object; object.setXPos(moment.m10/area); object.setYPos(moment.m01/area); object.setType(theObject.getType()); object.setColor(theObject.getColor()); objects.push_back(object); objectFound = true; }else objectFound = false;} if(objectFound ==true){ drawObject(objects,cameraFeed,temp,contours,hierarchy);}} else putText(cameraFeed,"TOO MUCH NOISE! ADJUST FILTER", Point(0,50),1,2,Scalar(0,0,255),2);}} int main(int argc, char* argv[]) { bool calibrationMode = true; Mat cameraFeed; Mat threshold; Mat HSV; Mô Phỏng Nhận Diện Mầu Sắc Trang 25/26 if(calibrationMode){ createTrackbars();} VideoCapture capture; capture.open(0); capture.set(CV_CAP_PROP_FRAME_WIDTH,FRAME_WIDTH); capture.set(CV_CAP_PROP_FRAME_HEIGHT,FRAME_HEIGHT); waitKey(1000); while(1){ capture.read(cameraFeed); if( !cameraFeed.data ) { return -1; } cvtColor(cameraFeed,HSV,COLOR_BGR2HSV); cvtColor(cameraFeed,HSV,COLOR_BGR2HSV); inRange(HSV,Scalar(H_MIN,S_MIN,V_MIN),Scalar(H_MAX,S_MAX,V_MA X),threshold); morphOps(threshold); imshow(windowName2,threshold); trackFilteredObject(threshold,HSV,cameraFeed); Object blue("blue"), yellow("yellow"), red("red"), green("green"); cvtColor(cameraFeed,HSV,COLOR_BGR2HSV); inRange(HSV,blue.getHSVmin(),blue.getHSVmax(),threshold); morphOps(threshold); trackFilteredObject(blue,threshold,HSV,cameraFeed); cvtColor(cameraFeed,HSV,COLOR_BGR2HSV); inRange(HSV,yellow.getHSVmin(),yellow.getHSVmax(),threshold); morphOps(threshold); trackFilteredObject(yellow,threshold,HSV,cameraFeed); cvtColor(cameraFeed,HSV,COLOR_BGR2HSV); inRange(HSV,red.getHSVmin(),red.getHSVmax(),threshold); Mô Phỏng Nhận Diện Mầu Sắc Trang 26/26 morphOps(threshold); trackFilteredObject(red,threshold,HSV,cameraFeed); cvtColor(cameraFeed,HSV,COLOR_BGR2HSV); inRange(HSV,green.getHSVmin(),green.getHSVmax(),threshold); morphOps(threshold); trackFilteredObject(green,threshold,HSV,cameraFeed); imshow(windowName,cameraFeed); imshow("windowName1", HSV); waitKey(30); } return 0; } Mô Phỏng Nhận Diện Mầu Sắc ... giãn Mô Phỏng Nhận Diện Mầu Sắc Trang 16/26 Hình 4-4: Hình ảnh chuyển sang không gian màu HSV Mô Phỏng Nhận Diện Mầu Sắc Trang 17/26 Hình 4-5: Kết xác định màu vật thể Mô Phỏng Nhận Diện Mầu Sắc. .. viện xử lý ảnh OpenCV C++ - Tìm hiểu giải thuật nhận diện màu sắc - Viết phần mềm mô nhận diện màu sắc vật thể từ camera C++ Mô Phỏng Nhận Diện Mầu Sắc Trang 2/26 CHƯƠNG GIỚI THIỆU VỀ THƯ VIỆN OPENCV... MƠ PHỎNG NHẬN DIỆN MÀU SẮC 1.9 Chương trình giải thuật Hình 4-1: Chương trình giải thuật Dựa vào chương trình giải thuật hiểu chương trình mơ nhận diện màu sắc hoạt động sau: Mô Phỏng Nhận Diện