Project OpenCV được bắt đầu từ Intel năm 1999 bởi Gary Bradsky. OpenCV viết tắt cho Open Source Computer Vision Library. OpenCV là thư viện nguồn mở hàng đầu cho Computer Vision và Machine Learning, và hiện có thêm tính năng tăng tốc GPU cho các hoạt động theo realtime. OpenCV được phát hành theo giấy phép BSD (), do đó nó miễn phí cho cả học tập và sử dụng với mục đích thương mại. Nó có trên các giao diện C++, C, Python và Java và hỗ trợ Windows, Linux, Mac OS, iOS và Android. OpenCV được thiết kế để hỗ trợ hiệu quả về tính toán và chuyên dùng cho các ứng dụng realtime (thời gian thực). Nếu được viết trên CC++ tối ưu, thư viện này có thể tận dụng được bộ xử lý đa lõi (multicore processing).
import cv2 import numpy as np //khai báo thư viện cv2 // khai báo thư viện numpy thay numpy np (gon) //thư viện numpy để tạo ảnh -Nhập ,xuất ảnh – Chuyển đổi không gian màu BGR/GRAY/HSV img = cv2.imread("meo.jpg") //nhập ảnh img = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY) //chuyển đổi không gian màu BGR -> GRAY img = img[200:400,200:400] //hiển thị vùng tương ứng cv2.imshow("Image",img) cv2.waitKey() //xuất ảnh //chờ ấn nút Tạo ảnh-Vẽ đối tượng lên ảnh img = np.empty((600,800,3)) //W:600 L:800 kênh màu BGR //empty lấy đến địa thường màu đen img = np.empty((600,800,3)) //giá trị kênh màu tương ứng > màu đen img[:,:,(0,1)]=255 img[:,:,2)]=255 for i in range(0,400,10): //định khỏang với giá trị màu tương ứng //lệnh for để vẽ nhiều line cv2.line(img,(300,400),(10,10),(0,0,0),3) //vẽ đường line với (x1,y1);(x2,y2);(B,G,R);(thickness) cv2.putText(img,str(i),(10,10),cv2.FONT_HERSHEY_COMPLEX_SMALL,1,(0,255,0)) //viết chữ với [bienanh],str(bien so)/"mau",vitri,font,size,màu, cv2.circle(img,(200,200),50,(255,0,0),3) //vẽ hình trịn với [bienanh],tam,bankinh,mau,thickness cv2.ellipse(img,(300,300),(100,50),45,0,180,(0,0,0),3) //vẽ hình ellipse với [bienanh],tam,chieu dai truc,do nghieng,goc dau,goc cuoi,mau,thickness pts = np.array(((10,10),(10,100),(100,100),(100,10)),np.int32) //tạo mảng đỉnh với điểm lưu vùng có nhớ 32bit pts = [pts.reshape((-1,1,2))] //chuyển từ mảng hai chiều sang chiều với -1 tự hiểu số điểm mảng cv2.polylines(img,pts,True,(255,255,255),3) //vẽ đa giác với [bienanh],tập hợp dinh,kin/k kin,mau,thickness -Tạo trượt-Trackbar - Thay đổi màu sắc -import cv2 import numpy as np blue = green = red = def blue_function(pos): global blue blue=pos def green_function(pos): global green green=pos //khai báo ba biến tương ứng ba kênh màu B-G-R //khai báo hàm //khai báo biến blue biến toàn cục //truyền giá trị pos vào blue def red_function(pos): global red red=pos cv2.namedWindow("Image") //tạo cửa sổ cv2.createTrackbar("Blue: ","Image",0,255,blue_function) //tạo trượt-Trackbar với [tenthanhtruot],[tencuaso],giá trị bắt đầu, giá trị lớn nhất, gọi hàm tương ứng cv2.createTrackbar("Green: ","Image",0,255,green_function) cv2.createTrackbar("Red: ","Image",0,255,red_function) while(True): img = np.empty((600,800,3),np.uint8) img[:,:,0] = blue img[:,:,1] = green img[:,:,2] = red cv2.imshow("Image",img) if cv2.waitKey(10) == ord('q'): break cv2.destroyAllWindows() //hàm while //mỗi điểm ảnh có kiểu liệu unsign int8 //gắn kênh màu cho biến blue tương ứng //trong cho 10ms phím q nhấn //tắt tất cửa sổ hành -Phân ngưỡng ảnh-Threshold – Các loại phân ngưỡng import cv2 def get_value(pos): get_value.value=pos //khai báo hàm get_value.value = //khai báo biến cục cv2.namedWindow("Control") //tạo cửa sổ cv2.createTrackbar("Value","Control",0,255,get_value) //tạo trượt while True: img = cv2.imread("meomeo.png") cv2.imshow("Control",img) ret, img = cv2.threshold(img,get_value.value,255,cv2.THRESH_TRUNC) //phân ngưỡng với [bienanh], giá trị cài đặt lại từ trượt,max,mode phân ngưỡng print(ret) //phân ngưỡng trả hai giá trị 0-gia tri so, 1-gia tri anh cv2.imshow("Image",img) if cv2.waitKey(10) == ord('q'): break cv2.destroyAllWindows() -Phát VIDEO dùng tốc độ quay - Play VIDEO import cv2 import time // khai báo thư viện thời gian cap = cv2.VideoCapture("KUKA.mpg") fps = cap.get(cv2.CAP_PROP_FPS) wait_time = 1000/fps print(fps) while True: pre_time = time.time() ret,img = cap.read() img = cv2.medianBlur(img,19) cv2.imshow("Video",img) xl_time = (time.time() - pre_time)*1000 print(xl_time) //lưu video vào biến cap //đọc giá trị số khung hình giây //tình thời gian chờ hai khung hình ms //đọc thời gian //đọc video //làm mờ video //xuất video //tính thời gian xử lí dòng lệnh if xl_time > wait_time: delay_time = else: delay_time = wait_time - xl_time if cv2.waitKey(int (delay_time)) == ord('q'): break cv2.destroyAllWindows() //delay thời gian tương ứng với tốc độ khung hình -Bám theo vật thể - Tracking object BGR import cv2 import time import numpy as np def Min_Blue(pos): Min_Blue.value = pos Min_Blue.value = def Min_Green(pos): Min_Green.value = pos Min_Green.value = def Min_Red(pos): Min_Red.value = pos Min_Red.value = def Max_Blue(pos): Max_Blue.value = pos Max_Blue.value = 255 def Max_Green(pos): Max_Green.value = pos Max_Green.value = 255 def Max_Red(pos): Max_Red.value = pos Max_Red.value = 255 //khai báo hàm max ba kênh màu BGR cv2.namedWindow("Control") cv2.createTrackbar("Min blue","Control",0,255,Min_Blue) cv2.createTrackbar("Min green","Control",0,255,Min_Green) cv2.createTrackbar("Min red","Control",0,255,Min_Green) //tạo trượt cv2.createTrackbar("Max blue","Control",255,255,Max_Blue,) cv2.createTrackbar("Max green","Control",255,255,Max_Green) cv2.createTrackbar("Max red","Control",255,255,Max_Red) cap = cv2.VideoCapture("KUKA.mpg") fps = cap.get(cv2.CAP_PROP_FPS) wait_time = 1000/fps print(fps) play = True while True: pre_time = time.time() if play: ret,img = cap.read() if ret == False: break cv2.imshow("Control",img) lower = np.array([Min_Blue.value,Min_Green.value,Min_Red.value]) upper = np.array([Max_Blue.value,Max_Green.value,Max_Red.value]) mask_sub = cv2.inRange(img,lower,upper) mask = cv2.merge((mask_sub,mask_sub,mask_sub)) res = cv2.bitwise_and(img,mask) //tải video //fps //nếu play = true đọc video //nếu hết video tắt //tạo mảng giới hạn ba kênh màu BGR // tạo mảng giới hạn ba kênh màu BGR //tạo mặt nạ phụ: nằm giới hạn trắng, ngồi đen //tạo mặt nạ chính: phối ba kênh màu lại //so sánh với hình mẫu để màu cv2.imshow("Mask",mask) cv2.imshow("Res", res) xl_time = (time.time() - pre_time)*1000 if xl_time > wait_time: delay_time = else: delay_time = wait_time - xl_time key = cv2.waitKey(int (delay_time)) if key == ord('q'): break if key == ord(' '): play = not play cv2.destroyAllWindows() // gán hành động chờ cho Key //nhấn nút cách play = Fals Khử nhiễu - Ăn mòn, giãn nở-erode,dilate mask_sub = cv2.inRange(img,lower,upper) kernel = np.ones((4,4)) mask_sub = cv2.erode(mask_sub,kernel) kernel = np.ones((7,7)) mask_sub = cv2.dilate(mask_sub,kernel) //tạo ma trận kích thước 4x4 //khử nhiễu: qt ảnh ma trận có kích thước bé 4x4 xóa // phịng to: qt ảnh ma trận có kích thước bé 7x7 thi phóng to Định vị vật thể - Vẽ đường bao -HSV import cv2 import time import numpy as np def Min_H(pos): Min_H.value = pos Min_H.value = 33 def Min_S(pos): Min_S.value = pos Min_S.value = 50 def Min_V(pos): Min_V.value = pos Min_V.value = 62 def Max_H(pos): Max_H.value = pos Max_H.value = 102 def Max_S(pos): Max_S.value = pos Max_S.value = 255 def Max_V(pos): Max_V.value = pos Max_V.value = 248 cv2.namedWindow("Control") cv2.createTrackbar("Min H", "Control", 33, 255, Min_H) cv2.createTrackbar("Min S", "Control", 50, 255, Min_S) cv2.createTrackbar("Min V", "Control", 62, 255, Min_V) cv2.createTrackbar("Max H", "Control", 102, 255, Max_H) cv2.createTrackbar("Max S", "Control", 255, 255, Max_S) cv2.createTrackbar("Max V", "Control", 248, 255, Max_V) cap = cv2.VideoCapture("tracking.mp4") fps = cap.get(cv2.CAP_PROP_FPS) wait_time = 1000 / fps #nhập video #đọc fps video print(fps) play = True delta_time = while True: pre_time = time.time() if play: ret, img = cap.read() if img is None: img = temp_img else: temp_img = img img_clone = img.copy() #nếu hết video dừng khung hình cuối #copy khác cv2.imshow("Control", cv2.putText(img_clone.copy(),"%.2f (ms)" %delta_time,(10,30),cv2.FONT_HERSHEY_SIMPLEX,1,(0,0,255),3)) img_hsv = cv2.cvtColor(img_clone, cv2.COLOR_BGR2HSV) #chuyển đổi hệ màu BGR -> HSV lower = np.array([Min_H.value, Min_S.value, Min_V.value]) upper = np.array([Max_H.value, Max_S.value, Max_V.value]) mask = cv2.inRange(img_hsv, lower, upper) kernel = np.ones((5, 5)) mask = cv2.erode(mask, kernel) mask = cv2.dilate(mask, kernel, iterations=2) #khử nhiễu giãn hình #iterations=2 : so lan lap contours,hierarchy = cv2.findContours(mask, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE) if len(contours) > 0: tmp_c = contours [0] res = cv2.drawContours(img_clone,contours,-1,(255,0,0),2) M = cv2.moments(tmp_c) x = int(M['m10'] / (M['m00'] +1)) y = int (M['m01'] / (M['m00'] +1)) cv2.putText(res,"Tr.Banh",(x,y),cv2.FONT_HERSHEY_COMPLEX,1,(0,0,255),2) else: res = img_clone cv2.imshow("Result", res) #in xuli_time #xác định đường biên #nếu có đường biên #vẽ đường biên #thông số đường biên #tọa độ đường biên #xuất chữ #nếu khơng phát đường biên xuất hình bình thường delta_time = (time.time() - pre_time) * 1000 if delta_time > wait_time: delay_time = else: delay_time = wait_time - delta_time key = cv2.waitKey(int(delay_time)) if key == ord('q'): break if key == ord(' '): play = not play cv2.destroyAllWindows() -Qũy đạo vật thể - Vẽ đường bao tương đương -arr_point = np.array((),np.int32) #tạo mảnh (cx,cy),cr = cv2.minEnclosingCircle(tmp_c) #vẽ đường tròn bao tương đương res = cv2.circle(img_clone,(int (cx),int (cy)),int(cr/1.5),(255,0,0),2) #vẽ đường tròn tương ứng với R phù hợp arr_point = np.append(arr_point,(int(cx),int(cy))) #thêm tọa độ x,y vào mảng if len(arr_point) > 150: #nếu mảng có 150 phần tử xóa phần tử (x,y) từ đầu arr_point = np.delete(arr_point,(0,1)) arr_point = np.reshape(arr_point,(-1,1,2)) cv2.polylines(res,[arr_point],False,(0,255,0),2) #2ch -> 3ch #vẽ quỹ đạo cách nối điểm mảng Chọn vật thể - Xử lí chuột import cv2 import time def Mouse_event(event, x, y, f, img): if event == cv2.EVENT_LBUTTONDOWN: Mouse_event.x0 = x Mouse_event.y0 = y Mouse_event.draw = True if event == cv2.EVENT_LBUTTONUP: Mouse_event.x1 = x Mouse_event.y1 = y #nếu chuột nhấn #tọa độ đầu #bắt đầu vẽ #nếu chuột nhả #tọa độ cuối Mouse_event.draw = False miny = min(Mouse_event.y0,Mouse_event.y1) maxy = max(Mouse_event.y0, Mouse_event.y1) minx = min(Mouse_event.x0, Mouse_event.x1) maxx = max(Mouse_event.x0, Mouse_event.x1) Mouse_event.img = img[miny:maxy,minx:maxx] if event == cv2.EVENT_MOUSEMOVE: Mouse_event.x = x Mouse_event.y = y Mouse_event.img = None Mouse_event.x0 =0 Mouse_event.y0 =0 Mouse_event.x1 =0 Mouse_event.y1 =0 Mouse_event.x =0 Mouse_event.y =0 Mouse_event.draw = False cap = cv2.VideoCapture(0) #kết thúc vẽ #cắt hình tương ứng với vùng chọn #nếu di chuyển chuột #tọa độ lúc di chuyển #khởi tạo biến cục #ghi cam laptop vao Capture0 while True: pre_time = time.time() ret,img = cap.read() img_lone = img.copy() if Mouse_event.draw: img_lone = cv2.rectangle(img_lone,(Mouse_event.x0,Mouse_event.y0),(Mouse_event.x,Mouse_event.y),(0,0,255),2) if Mouse_event.img is not None: #nếu có vùng chọn xuất cửa sổ Sample cv2.imshow("Sample", Mouse_event.img) cv2.imshow("Video", img_lone) cv2.setMouseCallback("Video",Mouse_event,img) #đọc kiện từ chuột với hàm Mouse_event #vẽ hình vuông if cv2.waitKey(int (1)) == ord('q'): break cv2.destroyAllWindows() Bám theo vật thể định tùy ý if Mouse_event.img is not None: tpt = cv2.matchTemplate(img_clone,Mouse_event.img,cv2.TM_CCOEFF_NORMED) min_val, max_val,min_loc,max_loc = cv2.minMaxLoc(tpt) if max_val > 6: #so sánh vùng chọn với ảnh, giống sáng #trả giá trị: giống nhất, giống nhiều nhất, tọa độ giống nhất, tọa độ giống nhiều #nếu giống >60% thì: cv2.putText(img_clone, "%.2f" % max_val, max_loc, cv2.FONT_HERSHEY_SIMPLEX, 2, (0, 255, 0), 2) #in giá trị giống nhiều h, w, d = Mouse_event.img.shape #lấy kích thước vùng chọn cv2.rectangle(img_clone, max_loc, (max_loc[0] + w, max_loc[1] + h), (255, 0, 0), 2) #vẽ vùng chọn chạy theo tọa độ giống cv2.imshow("Sample", Mouse_event.img) cv2.imshow("Compare",tpt) cv2.imshow("Video", img_clone) cv2.setMouseCallback("Video",Mouse_event,img) ... //gắn kênh màu cho biến blue tương ứng / /trong cho 10ms phím q nhấn //tắt tất cửa sổ hành -Phân ngưỡng ảnh-Threshold – Các loại phân ngưỡng ... khung hình ms //đọc thời gian //đọc video //làm mờ video //xuất video //tính thời gian xử lí dịng lệnh if xl_time > wait_time: delay_time = else: delay_time = wait_time - xl_time if cv2.waitKey(int... key == ord('' ''): play = not play cv2.destroyAllWindows() // gán hành động chờ cho Key //nhấn nút cách play = Fals Khử nhiễu - Ăn mòn, giãn nở-erode,dilate