Tải bản đầy đủ (.docx) (9 trang)

Các lệnh OpenCV cơ bản trong python

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (43.38 KB, 9 trang )

import cv2
import numpy as np

//khai báo thư viện cv2
// 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)
cv2.waitKey()

//xuất ảnh
//chờ cho đến khi ấn nút bất kì

------------------------------------------------------------------------------------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
img[:,:,2)]=255
for i in range(0,400,10):

//định một 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 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
green = 0
red = 0
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 là biến toàn cục
//truyền giá trị của pos vào blue



def red_function(pos):
global red
red=pos
cv2.namedWindow("Image")
//tạo cửa sổ mới
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)
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 dữ liệu unsign int8
//gắn kênh màu cho biến blue tương ứng

//trong khi cho 10ms nếu phím q được nhấn
//tắt tất cả các cửa sổ hiện 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 = 0

//khai báo biến cục bộ

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
print(ret)
//phân ngưỡng trả về 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 trên giây
//tình thời gian chờ giữa hai khung hình ms

//đọc thời gian hiện tại
//đọc video
//làm mờ video
//xuất video
//tính thời gian xử lí các dòng lệnh

if xl_time > wait_time:
delay_time = 1
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 = 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

//khai báo hàm min 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 6 thanh 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 thì đọc video
//nếu hết video thì tắt

//tạo mảng giới hạn dưới của ba kênh màu BGR
// tạo mảng giới hạn trên của ba kênh màu BGR
//tạo mặt nạ phụ: nằm trong giới hạn thì trắng, ngồi thì đ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 để hiện màu

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
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 thì 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 1 kích thước 4x4
//khử nhiễu: qt ảnh ma trận nào có kích thước bé hơn 4x4 thì xóa
// phịng to: qt ả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)


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 của video

print(fps)
play = True
delta_time = 0
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 thì dừng ở khung hình cuối

#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))
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 và 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 ra 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 hiện đường biên thì vẫn xuất hình bình thường


delta_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 đương-----------------------------------------------------------------------arr_point = np.array((),np.int32)

#tạo mảnh trong

(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 hiện tại vào mảng
if len(arr_point) > 150:
#nếu mảng có trên 150 phần tử thì 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 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):
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 được nhấn
#tọa độ đầu
#bắt đầu vẽ
#nếu chuột được 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 các biến cục bộ

#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 được chọn thì xuất ra cửa sổ Sample
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

#vẽ hình vng

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)
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, càng giống càng sáng
#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

#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 nhất
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 nhất
cv2.imshow("Sample", Mouse_event.img)
cv2.imshow("Compare",tpt)
cv2.imshow("Video", img_clone)
cv2.setMouseCallback("Video",Mouse_event,img)



×