OpenCV入门

掩码 图像分割

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()
相关推荐
ShallWeL几秒前
Orin 上 USB / CSI 相机采集踩坑
人工智能·嵌入式硬件·智能硬件·agi
武子康1 分钟前
Pi vs Claude Code vs Codex 正确读法:6 组同模型匹配 + 2.08×/1.46×/1.20×/1.54×/1.22×/1.44× 成
人工智能·ai编程·claude
renhongxia11 分钟前
AI安全保卫战:我们如何防止“失控”的智能体?
人工智能·深度学习·安全·机器学习·架构·机器人
江边风声3 分钟前
PCB自动化收放板机 在薄板制程中的特殊取放策略——0.05mm芯板怎么稳抓不掉
人工智能·科技·自动化·制造·pcb工艺
lupai7 分钟前
汽车维保记录精准版 API 快速接入指南
大数据·人工智能·汽车
橙臣程19 分钟前
深度学习4——损失计算
人工智能
王同学的AI学习日记26 分钟前
Qwen-Image-3.0技术实测:文字渲染、长上下文与多场景能力深度评测
大数据·人工智能·ai·开源
wuhanzhanhui27 分钟前
质变的枢纽:2026 武汉国际储能产业博览会开启绿色能源的新周期
人工智能
后端小肥肠30 分钟前
Doubao-Seed-Evolving实测:我做了个情绪价值拉满的星座记账 Skill
人工智能·aigc·agent
Molesidy32 分钟前
【AI】【OpenCode】基于AI-Agent的工作方式的初步测试
人工智能