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()
相关推荐
HyperAI超神经1 小时前
在线教程丨最高4倍生成速度提升,DiffusionGemma可同时生成整块文本,基于多轮并行去噪持续优化结果
人工智能·google·长上下文
名不经传的养虾人1 小时前
从0到1:企业级AI项目迭代日记 Vol.46|三个检索源、缓存限流、深度整合——联网检索一日冲刺
数据库·人工智能·agent·ai编程·ai工作流·企业ai
w3296362711 小时前
一、什么是 OpenCode?
人工智能·ai编程·开发工具·opencode
寰宇视讯1 小时前
镓未来GaN助力荣耀WIN 360W氮化镓适配器,高效充电触手可及!
人工智能·神经网络·生成对抗网络
MartinYeung51 小时前
[论文学习]LoRA-Leak:针对 LoRA 微调语言模型的成员推断攻击深度分析与隐私风险评估
人工智能·学习·语言模型
deepdata_cn1 小时前
AI大模型通用上下文标准(MCP)
人工智能·mcp
邵宇然1 小时前
用 Rust 重写 Python AI 服务:从 GIL 瓶颈到零成本抽象的性能跃迁
人工智能
KIO no way1 小时前
AI内容分发策略正在重写规则_CSDN_AI数字营销的大模型辅助发布体验
人工智能
oort1231 小时前
AI+基层治理·智慧政务解决方案——AI 民意速办智能助手深度方案
人工智能·政务