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).
Trang 1import cv2 //khai báo thư viện cv2
import numpy as np // khai báo thư viện numpy nhưng thay numpy bằng 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) //xuất ảnh
-Tạo ảnh-Vẽ các đối tượng lên
ảnh -img = np.empty((600,800,3)) //W:600 L:800 3 kênh màu BGR
//empty sẽ lấy đến địa chỉ bất kì thường là màu đen img = np.empty((600,800,3)) //giá trị 3 kênh màu tương ứng là 0 > màu đen
img[:,:,(0,1)]=255 //định một khỏang với giá trị màu tương ứng
img[:,:,2)]=255
for i in range(0,400,10): //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 các đỉnh với mỗi điểm lưu ở vùng có bộ nhớ 32bit
pts = [pts.reshape((-1,1,2))] //chuyển từ mảng hai chiều sang 3 chiều với -1 tự hiểu là số điểm trong 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 thanh trượt-Trackbar - Thay đổi màu
sắc -import cv2
import numpy as np
blue = 0 //khai báo ba biến tương ứng ba kênh màu B-G-R
green = 0
red = 0
def blue_function(pos): //khai báo hàm
global blue //khai báo biến blue là biến toàn cục
blue=pos //truyền giá trị của pos vào blue
def green_function(pos):
global green
green=pos
Trang 2def red_function(pos):
global red
red=pos
cv2.createTrackbar("Blue: ","Image",0,255,blue_function) //tạo thanh 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)
img = np.empty((600,800,3),np.uint8) //mỗi điểm ảnh có kiểu dữ liệu unsign int8
img[:,:,1] = green
img[:,:,2] = red
cv2.imshow("Image",img)
if cv2.waitKey(10) == ord('q'): //trong khi cho 10ms nếu phím q được nhấn
break
-Phân ngưỡng ảnh-Threshold – Các loại phân
ngưỡng -import cv2
get_value.value=pos
cv2.namedWindow("Control") //tạo cửa sổ mới
cv2.createTrackbar("Value","Control",0,255,get_value) //tạo thanh 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ừ thanh trượt,max,mode phân ngưỡng
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
Trang 3cap = cv2.VideoCapture("KUKA.mpg") //lưu video vào biến cap
fps = cap.get(cv2.CAP_PROP_FPS) //đọc giá trị số khung hình trên giây
print(fps)
while True:
pre_time = time.time() //đọc thời gian hiện tại
img = cv2.medianBlur(img,19) //làm mờ video
cv2.imshow("Video",img) //xuất video
xl_time = (time.time() - pre_time)*1000 //tính thời gian xử lí các dòng lệnh
print(xl_time)
if xl_time > wait_time:
delay_time = 1
else:
delay_time = wait_time - xl_time
if cv2.waitKey(int (delay_time)) == ord('q'): //delay thời gian tương ứng với tốc độ khung hình
break
cv2.destroyAllWindows()
-Bám theo vật thể - Tracking object -BGR
import cv2
import time
import numpy as np
Min_Blue.value = pos
Min_Blue.value = 0
def Min_Green(pos):
Min_Green.value = pos
Min_Green.value = 0
def Min_Red(pos):
Min_Red.value = pos
Min_Red.value = 0
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
Trang 4cv2.createTrackbar("Min blue","Control",0,255,Min_Blue) //tạo 6 thanh trượt
cv2.createTrackbar("Min green","Control",0,255,Min_Green)
cv2.createTrackbar("Min red","Control",0,255,Min_Green)
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)
wait_time = 1000/fps
print(fps)
play = True
while True:
pre_time = time.time()
ret,img = cap.read()
break
cv2.imshow("Control",img)
lower = np.array([Min_Blue.value,Min_Green.value,Min_Red.value]) //tạo mảng giới hạn dưới của ba kênh màu BGR
upper = np.array([Max_Blue.value,Max_Green.value,Max_Red.value]) // tạo mảng giới hạn trên của ba kênh màu BGR
mask_sub = cv2.inRange(img,lower,upper) //tạo mặt nạ phụ: nằm trong giới hạn thì trắng, ngoài thì đen
mask = cv2.merge((mask_sub,mask_sub,mask_sub)) //tạo mặt nạ chính: phối ba kênh màu lại
cv2.imshow("Mask",mask)
cv2.imshow("Res", res)
xl_time = (time.time() - pre_time)*1000
if xl_time > wait_time:
delay_time = 1
else:
delay_time = wait_time - xl_time
if key == ord('q'):
break
play = not play
cv2.destroyAllWindows()
Trang 5-Khử nhiễu - Ăn mòn, giãn mask_sub = cv2.inRange(img,lower,upper)
mask_sub = cv2.erode(mask_sub,kernel) //khử nhiễu: quét ảnh ma trận nào có kích thước bé hơn 4x4 thì xóa
kernel = np.ones((7,7))
mask_sub = cv2.dilate(mask_sub,kernel) // phòng to: quét ảnh ma trận nào có kích thước bé hơn 7x7 thi phóng to ra
-Đị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)
Trang 6cv2.createTrackbar("Max S", "Control", 255, 255, Max_S)
cv2.createTrackbar("Max V", "Control", 248, 255, Max_V)
cap = cv2.VideoCapture("tracking.mp4") #nhập video
fps = cap.get(cv2.CAP_PROP_FPS) #đọc fps của video
wait_time = 1000 / fps
print(fps)
play = True
delta_time = 0
while True:
pre_time = time.time()
if play:
ret, img = cap.read()
if img is None: #nếu hết video thì dừng ở khung hình cuối
img = temp_img
else:
temp_img = img
img_clone = img.copy() #copy một bản 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)) #in ra xuli_time
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))
contours,hierarchy = cv2.findContours(mask, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE) #xác định đường biên
tmp_c = contours [0]
y = int (M['m01'] / (M['m00'] +1))
cv2.putText(res,"Tr.Banh",(x,y),cv2.FONT_HERSHEY_COMPLEX,1,(0,0,255),2) #xuất chữ
else:
cv2.imshow("Result", res)
Trang 7delta_time = (time.time() - pre_time) * 1000
if delta_time > wait_time:
delay_time = 1
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
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 hiện tại vào mảng
arr_point = np.delete(arr_point,(0,1))
cv2.polylines(res,[arr_point],False,(0,255,0),2) #vẽ quỹ đạo bằng cách nối các điểm trong mảng
-Chọn vật thể - Xử lí
chuột -import cv2
import time
def Mouse_event(event, x, y, f, img):
Mouse_event.y0 = y
Mouse_event.y1 = y
Trang 8Mouse_event.draw = False #kết thúc vẽ
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] #cắt hình tương ứng với vùng chọn
Mouse_event.y = y
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
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) #vẽ hình vuông
cv2.imshow("Sample", Mouse_event.img)
cv2.imshow("Video", img_lone)
cv2.setMouseCallback("Video",Mouse_event,img) #đọc sự kiện từ chuột với hàm Mouse_event
if cv2.waitKey(int (1)) == ord('q'):
break
cv2.destroyAllWindows()
-Bám theo vật thể chỉ định tùy
if Mouse_event.img is not None:
tpt = cv2.matchTemplate(img_clone,Mouse_event.img,cv2.TM_CCOEFF_NORMED) #so sánh vùng chọn với ảnh, càng giống càng sáng
min_val, max_val,min_loc,max_loc = cv2.minMaxLoc(tpt) #trả về các giá trị: giống ít nhất, giống nhiều nhất, tọa độ giống ít nhất, tọa độ giống nhiều nhất
Trang 9cv2.putText(img_clone, "%.2f" % max_val, max_loc, cv2.FONT_HERSHEY_SIMPLEX, 2, (0, 255, 0), 2) #in giá trị giống nhiều nhất
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 nhất cv2.imshow("Sample", Mouse_event.img)
cv2.imshow("Compare",tpt)
cv2.imshow("Video", img_clone)
cv2.setMouseCallback("Video",Mouse_event,img)