掩码 图像分割
python
img = cv2.imread("test.png")
mask = np.zeros(img.shape,dtype= np.uint8)
cv2.circle(
mask,
(200,300), #圆心坐标
150, #半径
(255,255,255), #填充的颜色
-1) #线条大小 -1 代表实心
seg_img = cv2.bitwise_and(
img, #原图
mask #掩码图像
)
cv2.imshow('seg',seg_img)
cv2.waitKey()
原图

分割后的效果图

颜色检测
python
import cv2
import numpy as np
def MoveTrackbarProc(pos):
print(pos)
img = cv2.imread("33.png")
#转换为RGB模式转换为HSV模式 HSV模式更容易实现颜色的过滤
hsvimg = cv2.cvtColor(img,cv2.COLOR_BGR2HSV)
windowname = 'trawindow'
cv2.namedWindow(windowname)
cv2.resizeWindow(windowname,300,300)
cv2.createTrackbar(
'h_min', #创建的滑动条名字
windowname,
0, # 色调最小值
179, #Hue 色调的最大值179
MoveTrackbarProc
) #滑动条所属窗口
cv2.createTrackbar('h_max' , windowname,179,179,MoveTrackbarProc)
#饱和度
cv2.createTrackbar('sat_min',windowname,0,255,MoveTrackbarProc)
cv2.createTrackbar('sat_max',windowname,255,255,MoveTrackbarProc)
#亮度
cv2.createTrackbar('val_min',windowname,0,255,MoveTrackbarProc)
cv2.createTrackbar('val_max',windowname,255,255,MoveTrackbarProc)
while True:
h_min = cv2.getTrackbarPos('h_min', windowname)
h_max = cv2.getTrackbarPos('h_max', windowname)
sat_min = cv2.getTrackbarPos('sat_min',windowname)
sat_max = cv2.getTrackbarPos('sat_max',windowname)
val_min = cv2.getTrackbarPos('val_min',windowname)
val_max = cv2.getTrackbarPos('val_max',windowname)
#对颜色进行过滤 颜色值在设置的范围内 值设置白色 没有在范围内的设置为黑色 得到一个掩码图像
mask = cv2.inRange(
hsvimg, #过滤的图像
np.array([h_min,sat_min,val_min]),
np.array([h_max,sat_max,val_max]))
seg_img = cv2.bitwise_and(img,img,mask=mask)
cv2.imshow('mask',mask)
cv2.imshow('set_img',seg_img)
cv2.imshow('img',img)
cv2.waitKey(20)
轮廓检测
python
import cv2
import numpy as np
img = cv2.imread("txjc.png")
#彩色图像转换为灰度图像 轮廓识别的时候不需要彩色 减少数据运算量
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
#边缘检测 threshold1(低阈值)→ 控制"灵敏度"
# 值越小 → 检测到越多边缘(包括噪点)
# 值越大 → 只保留明显的边缘
# threshold2(高阈值)→ 控制"筛选强度"
# 值越小 → 保留更多弱边缘
# 值越大 → 只保留强边缘
canny = cv2.Canny(gray,100,200)
#轮廓检测 返回值1 检测到的轮廓 返回值2 轮廓的层级
Contours,_=cv2.findContours(
canny,
cv2.RETR_EXTERNAL, #返回最外面的边框
cv2.CHAIN_APPROX_NONE #保存返回的所有轮廓点
)
for contour in Contours:
cv2.drawContours(img,
contour,
-1, #轮廓id -1代表这个图形所有的轮廓
(100,100,100), #轮廓颜色
4 #线条宽度
)
#图形面积
area = cv2.contourArea(contour)
#周长 参数2 图形是否闭合
arclen = cv2.arcLength(contour,True)
#坐标
x,y,w,h = cv2.boundingRect(contour)
cv2.rectangle(img,(x,y),(x+w,y+h),(0,255,0),2)
#顶点坐标
points = cv2.approxPolyDP(contour,arclen * 0.03, True)
if len(points) == 3:
cv2.putText(img,'sanjiaoxing',(x,y-10),cv2.FONT_HERSHEY_PLAIN,1,(0,255,0),2)
elif len(points) == 4:
cv2.putText(img,'sibianxing',(x,y-10),cv2.FONT_HERSHEY_PLAIN,1,(0,180,0),2)
elif len(points) == 5:
cv2.putText(img,'wubianxing',(x,y-10),cv2.FONT_HERSHEY_PLAIN,1,(0,120,0),2)
else:
cv2.putText(img,'duobianxing',(x,y-10),cv2.FONT_HERSHEY_PLAIN,1,(100,120,0),2)
print(len(Contours))
cv2.imshow('canny',canny)
cv2.imshow('img',img)
cv2.waitKey(0)
目标跟踪
python
import cv2
import numpy as np
cap = cv2.VideoCapture('resource/person_1.mp4')
#创建跟踪器
tracker = cv2.TrackerCSRT_create()
flag = False
while True:
ret,frame = cap.read()
if not ret:
break
code = cv2.waitKey(25)
if code == ord('a'):
#选择跟踪目标
roi = cv2.selectROI('track',frame ,showCrosshair=False)
#初始化跟踪目标
tracker.init(frame,roi)
flag = True
if flag:
#更新这一帧画面
success,box = tracker.update(frame)
if success:
x,y,w,h = box
cv2.rectangle(frame,(x,y),(x+w,y+h),(0,255,0),2)
cv2.imshow('track',frame)
cap.release()
cv2.destroyAllWindows()
车流统计
python
import cv2
import numpy as np
#背景解除器
subtract = cv2.bgsegm.createBackgroundSubtractorMOG()
cap = cv2.VideoCapture('resource/car.mp4')
while cap.isOpened():
ret,frame = cap.read()
if not ret:
break
#画分割线
cv2.line(frame,(0,500),(1280,500),(0,0,255),2)
#转换成灰度图像
gray = cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY)
#高斯模糊 清除图像上的噪点 排除干扰
clearimg = cv2.GaussianBlur(gray,(5,5),0)
#移动的车是前景 马路和静止的山是背景 先去除掉背景
#得到移动的车图像
mask = subtract.apply(clearimg)
kernel = np.ones((5,5),np.uint8)
#膨胀 增强特征
newmask = cv2.dilate(mask,kernel,iterations=2)
#查找轮廓
controus ,_= cv2.findContours(newmask,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_NONE)
for c in controus:
#去除面积小的噪点
if cv2.contourArea(c) < 800:
continue
x,y,w,h = cv2.boundingRect(c)
cv2.rectangle(frame,(x,y),(x+w,y+h),(0,255,0),2)
cv2.imshow('frame',frame)
cv2.waitKey(25)
cap.release()
cv2.destroyAllWindows()