关注

OpenCV入门

掩码 图像分割

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()

原图
在这里插入图片描述
分割后的效果图
在这里插入图片描述

颜色检测

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)

轮廓检测

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)

目标跟踪

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()

车流统计

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()

转载自CSDN-专业IT技术社区

原文链接:https://blog.csdn.net/qq_41490873/article/details/161901813

评论

赞0

评论列表

微信小程序
QQ小程序

关于作者

点赞数:0
关注数:0
粉丝:0
文章:0
关注标签:0
加入于:--