OpenCV:09车辆统计项目

2023-05-16

车辆统计项目

  • 涉及到的内容
  • 大体流程
  • 知识补充
    • 背景减除
  • 具体流程
    • 视频加载
    • 去除背景
    • 形态学识别车辆
    • 对车辆进行统计
    • 显示车辆统计信息

效果图:
在这里插入图片描述


涉及到的内容

  • 窗口的展示
  • 图像/视频的加载
  • 基本图像的绘制
  • *车辆识别
    • 基本图像运算与处理
    • 形态学
    • 轮廓查找

大体流程

1. 加载视频
2. 通过形态学识别车辆
3. 对车辆进行统计
4. 显示车辆统计信息


知识补充

背景减除

背景减除(Background Subtraction 是许多基于计算机视觉的任务中主要的预处理步骤。如果我们有完整的静止的背景帧,那么我们可以通过帧差法来计算像素差从而获取到前景对象。

但是在大多数情况下,我们可能没有这样的图像,所以我们需要从我们拥有的任何图像中提取背景。当运动物体有阴影时,由于阴影也在移动,情况会变得更加复杂,为此引入背景减除算法

通过这一方法我们能够从视频中分离出运动的物体前景,从而达到目标检测的目的

  • BackgroundSubtractorMOG
    • 这是一个以混合高斯模型为基础的前景/背景分割算法
    • 它使用K(K = 3 或 5)个高斯分布混合对背景图像进行建模。使用这些颜色(在整个视频中)存在时间的长短作为混合的权重,背景的颜色一般持续时间最长,而且更加静止
    • 在编写代码时,我们需要使用函数cv2.createBackgroundSubtractorMOG2()创建一个背景对象。这个函数有些可选参数,比如要进行建模场景的时间长度,高斯混合成分的数量,阈值等。将它们全部设置为默认值,然后在整个视频中我们是需要使用backgroundsubtractor.apply()就可以得到前景的掩膜
    • 移动的物体会被标记为白色,背景会被标记为黑色的

具体流程

视频加载

关键API:打开摄像头cap = cv2.VideoCapture('./video.mp4');读取数据 ret,frame = cap.read()

# 先进行视频加载 ——> 将视频中的每一帧加载进来
import cv2
import numpy as np

# cap = cv2.VideoCapture(0) # 0表示调用摄像头
cap = cv2.VideoCapture('./video.mp4')

# 循环读取视频帧
while True :
    ret,frame = cap.read()
    
    #如果成功读取到一帧数据
    if ret == True:
        cv2.imshow('video',frame) # 展示这一帧数据到窗口
        
    # 退出
    key = cv2.waitKey(1) # 每隔1ms接受用户按下的按键
    # 用户按‘ESC’即可退出
    if key == 27:
        break
        
# 最后别忘了释放资源
cap.release()
cv2.destroyAllWindows()

去除背景

OpenCV会把不会动的东西(蓝天白云…)分辨出背景;把会动的东西(车辆、行人…)叫做前景

由于我们要检测会动的车辆(前景),所以要把不会动的背景去除掉,用到了背景减除(Background Subtraction ——>效果是: 动的东西(前景)会变成白色 ;不动的东西(背景)会变成黑色

关键API:cv2.createBackgroundSubtractorMOG2() # 直接用 不用写参数

# 去背景 ——> opencv把不会动的东西(蓝天白云...)叫做背景,把会动的(车辆,行人...)叫做前景
# 示例

import cv2
import numpy as np

# cap = cv2.VideoCapture(0) # 0表示调用摄像头
cap = cv2.VideoCapture('./video.mp4') # 调用视频


# 创建一个MOG对象
mog = cv2.createBackgroundSubtractorMOG2() # 直接用 不用写参数

while True:
    ret,frame = cap.read()
    
    if ret == True :
        fgmask = mog.apply(frame) # 将前景掩码 "fgmask" 运用到这一帧图像上
        cv2.imshow('video',fgmask) # 显示识别到的前景fgmask(不是写frame!)
           
    # 退出
    key = cv2.waitKey(100) # 每隔1ms接受用户按下的按键
    # 用户按‘ESC’即可退出
    if key == 27:
        break
        
# 最后别忘了释放资源
cap.release()
cv2.destroyAllWindows()

# 结果:动的东西(前景)会变成白色 ;不动的东西(背景)会变成黑色

结果:
在这里插入图片描述


形态学识别车辆

从去背景例程中,我们可以发现有很多白点(噪声),因此我们需要降噪

我们可以发现噪声比较均匀,不适合用中值滤波去除,而是用高斯滤波

关键API:cv2.GaussianBlur(gray,(7,7),5)

降噪:

# 从去背景例程中,我们可以发现有很多白点(噪声),因此我们需要降噪

import cv2
import numpy as np

# cap = cv2.VideoCapture(0) # 0表示调用摄像头
# cap = cv2.VideoCapture('./video.mp4') # 调用视频
cap = cv2.VideoCapture('./car.mp4') # 调用视频


# 创建一个MOG对象
mog = cv2.createBackgroundSubtractorMOG2() # 直接用 不用写参数

# 使用opencv获取卷积核
kernel = cv2.getStructuringElement(cv2.MORPH_RECT,(5,5))

# 取阈值,当图形轮廓小于阈值时排除掉(认为它不是车) ——> 只有长宽均大于阈值,才认为是一部车
min_w = 90
min_h = 90


while True:
    ret,frame = cap.read()
    
    if ret == True :
        # 把原始帧进行灰度化,然后去噪
        gray = cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY)
        # 去噪(我们可以发现噪声比较均匀,不适合用中值滤波去除,而是用高斯滤波)
        blur = cv2.GaussianBlur(gray,(7,7),5)
#         blur = cv2.blur(gray,(3,3))
        
       
        # 去除背景
        fgmask = mog.apply(blur) # 将前景掩码 "fgmask" 运用到这一帧图像上
        
        # 腐蚀做进一步去噪
        erode = cv2.erode(fgmask,kernel)
        
        # 经过腐蚀后车也有些被腐蚀了!再膨胀回来
        dilate = cv2.dilate(erode,kernel,iterations = 2) # 做两次迭代,膨胀效果更明显(因为我们要求去噪,并不需要和原图一模一样,因此迭代次数可以不一样)
        
        # 我们发现有很多内部的小方块 ——> 怎么消除?
        # 闭运算
        close = cv2.morphologyEx(dilate,cv2.MORPH_CLOSE,kernel)
        

        # 展示
        cv2.imshow('video',close) # 显示识别到的前景fgmask(不是写frame!)
        
            
    # 退出
    key = cv2.waitKey(1) # 每隔1ms接受用户按下的按键
    # 用户按‘ESC’即可退出
    if key == 27:
        break
        
# 最后别忘了释放资源
cap.release()
cv2.destroyAllWindows()

# 结果:动的东西(前景)会变成白色 ;不动的东西(背景)会变成黑色

结果:
在这里插入图片描述

识别车辆轮廓:

关键API: cv2.findContours(close,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)

我们设置一个阈值,如果某一像素面积大于这个阈值,那么就说明这是🚗

降噪后的黑白图中得到轮廓的对应(x,y,w,h)坐标,再用cv2.rectangle(frame,(int(x),int(y)),(int(x+w),int(y+h)),(0,255,255),2)原图中画出

# 从去背景例程中,我们可以发现有很多白点(噪声),因此我们需要降噪

import cv2
import numpy as np

# cap = cv2.VideoCapture(0) # 0表示调用摄像头
# cap = cv2.VideoCapture('./video.mp4') # 调用视频
cap = cv2.VideoCapture('./car.mp4') # 调用视频


# 创建一个MOG对象
mog = cv2.createBackgroundSubtractorMOG2() # 直接用 不用写参数

# 使用opencv获取卷积核
kernel = cv2.getStructuringElement(cv2.MORPH_RECT,(5,5))

# 取阈值,当图形轮廓小于阈值时排除掉(认为它不是车) ——> 只有长宽均大于阈值,才认为是一部车
min_w = 90
min_h = 90


while True:
    ret,frame = cap.read()
    
    if ret == True :
        # 把原始帧进行灰度化,然后去噪
        gray = cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY)
        # 去噪(我们可以发现噪声比较均匀,不适合用中值滤波去除,而是用高斯滤波)
        blur = cv2.GaussianBlur(gray,(7,7),5)
#         blur = cv2.blur(gray,(3,3))
        
       
        
        # 去除背景
        fgmask = mog.apply(blur) # 将前景掩码 "fgmask" 运用到这一帧图像上
        
        # 腐蚀做进一步去噪
        erode = cv2.erode(fgmask,kernel)
        
        # 经过腐蚀后车也有些被腐蚀了!再膨胀回来
        dilate = cv2.dilate(erode,kernel,iterations = 2) # 做两次迭代,膨胀效果更明显(因为我们要求去噪,并不需要和原图一模一样,因此迭代次数可以不一样)
        
        # 我们发现有很多内部的小方块 ——> 怎么消除?
        # 闭运算
        close = cv2.morphologyEx(dilate,cv2.MORPH_CLOSE,kernel)
        
        # 识别车辆(对上次形态学操作的结果进行查找轮廓)
        # 查找轮廓
        contours,h  = cv2.findContours(close,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)
        
        # 画出所有检测到的轮廓
        for contour in contours: # contours是返回的一个列表,列表中放的是一个个ndarray,也就是轮廓的数据
            # 画最大外界矩形 (要求坐标点都是整数)
            (x,y,w,h) = cv2.boundingRect(contour) # 返回一个值,这一个值包含了最大外接矩形的x,y,w,h四个变量
            # 通过外接矩形的宽高大小来过滤掉小的矩形
#             if w * h < 5000: # 用面积的话误差较大
            if (w < min_w) and (h < min_h) :
                continue
            cv2.rectangle(frame,(int(x),int(y)),(int(x+w),int(y+h)),(0,255,255),2)
        
        # 展示
#         cv2.imshow('video',close) # 显示识别到的前景fgmask(不是写frame!)
        cv2.imshow('frame',frame) # 显示识别到的前景fgmask(不是写frame!)
        
            
    # 退出
    key = cv2.waitKey(1) # 每隔1ms接受用户按下的按键
    # 用户按‘ESC’即可退出
    if key == 27:
        break
        
# 最后别忘了释放资源
cap.release()
cv2.destroyAllWindows()

# 结果:动的东西(前景)会变成白色 ;不动的东西(背景)会变成黑色

对车辆进行统计

我们不可能对整幅图进行统计,那样太乱了,也有很多噪声—— 我们应该画一条线,对经过这条线的车辆进行统计

这就有两个难点了:

1.如何画线,在哪画线

  • 关键API: 画线 cv2.line(frame,(10,line_high),(1200,line_high),(255,255,0),3) # 参数:画在那、起始点、结束点、颜色

2.如何统计

  • 把车抽象为一个点 ——> 即外接矩形的中心点,记录下当前的点,并且用中心点的y坐标和检测线加上偏移量进行对比,如果坐标在区间内,则检测到车辆,否则不算
  • 设置一个空列表cars[ ],以追加cars.append()的方式把每一个点都追加到列表中,后用for循环遍历这些点,对于满足的点剔除掉 cars.remove((x,y)),避免重复
# 我们不可能对整幅图进行统计,那样太乱了,也有很多噪声—— 我们应该画一条线
# 这就有两个难点了:1.如何画线,在哪画线  2.如何统计

import cv2
import numpy as np

# cap = cv2.VideoCapture(0) # 0表示调用摄像头
# cap = cv2.VideoCapture('./video.mp4') # 调用视频
cap = cv2.VideoCapture('./car.mp4') # 调用视频


# 创建一个MOG对象
mog = cv2.createBackgroundSubtractorMOG2() # 直接用 不用写参数

# 使用opencv获取卷积核
kernel = cv2.getStructuringElement(cv2.MORPH_RECT,(5,5))

# 取阈值,当图形轮廓小于阈值时排除掉(认为它不是车) ——> 只有长宽均大于阈值,才认为是一部车
min_w = 90
min_h = 90

# 车辆检测线的高度
line_high = 450

# 车辆检测线的偏移量
offset = 6 # 车辆检测线比检测线高offset个像素点或低offset个像素点——都算是被检测到

# 设置一个空列表,用于保存汽车外接矩形的中心点
cars = []

# 当前检测到的车辆数
car_num = 0

# 计算外接矩形的中心点
def center(x,y,w,h):
    x1 = int(w / 2)
    y1 = int(h / 2)
    cx = int(x) + x1
    cy = int(y) + y1
    return cx,cy

while True:
    ret,frame = cap.read()
    
    if ret == True :
        # 把原始帧进行灰度化,然后去噪
        gray = cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY)
        # 去噪(我们可以发现噪声比较均匀,不适合用中值滤波去除,而是用高斯滤波)
        blur = cv2.GaussianBlur(gray,(7,7),5)
#         blur = cv2.blur(gray,(3,3))
        
       
        
        # 去除背景
        fgmask = mog.apply(blur) # 将前景掩码 "fgmask" 运用到这一帧图像上
        
        # 腐蚀做进一步去噪
        erode = cv2.erode(fgmask,kernel)
        
        # 经过腐蚀后车也有些被腐蚀了!再膨胀回来
        dilate = cv2.dilate(erode,kernel,iterations = 2) # 做两次迭代,膨胀效果更明显(因为我们要求去噪,并不需要和原图一模一样,因此迭代次数可以不一样)
        
        # 我们发现有很多内部的小方块 ——> 怎么消除?
        # 闭运算
        close = cv2.morphologyEx(dilate,cv2.MORPH_CLOSE,kernel)
        
        # 识别车辆(对上次形态学操作的结果进行查找轮廓)
        # 查找轮廓
        contours,h  = cv2.findContours(close,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)
        
        # 画出车辆检测线(在for循环前就可以去计算了,不然每次循环都要画一次线,内存严重消耗)
        cv2.line(frame,(10,line_high),(1200,line_high),(255,255,0),3) # 参数:画在那、起始点、结束点、颜色
        
        # 画出所有检测到的轮廓
        for contour in contours: # contours是返回的一个列表,列表中放的是一个个ndarray,也就是轮廓的数据
            # 画最大外界矩形 (要求坐标点都是整数)
            (x,y,w,h) = cv2.boundingRect(contour) # 返回一个值,这一个值包含了最大外接矩形的x,y,w,h四个变量
            # 通过外接矩形的宽高大小来过滤掉小的矩形
#             if w * h < 5000: # 用面积的话误差较大
            if (w < min_w) and (h < min_h) :
                continue
            cv2.rectangle(frame,(int(x),int(y)),(int(x+w),int(y+h)),(0,255,255),2)
        
            # 把车抽象为一个点 ——> 即外接矩形的中心点
            # 要通过外界矩形计算矩形中心点 ——> 我们把这段代码独立出来,写成函数
            my_center = center(x,y,w,h)
            cv2.circle(frame,(my_center),5,(0,255,255),-1) # 画出中心点
            
            # 记录下当前的点,并且用中心点的y坐标和检测线加上偏移量进行对比,如果坐标在区间内,则检测到车辆,否则不算
            cars.append(my_center) # 将中心点追加到列表中
            
            # 遍历cars中的点,与检测线的要求进行对比
            for (x , y) in cars:
                if (y > line_high - offset) and (y < line_high + offset): # 落入了有效区间
                    # 计数加1
                    car_num += 1
                    # 统计过的车就remove掉 (如果remove,会出现一部车辆多次计数的情况)
                    cars.remove((x,y))
#                     print(car_num) # 统计结果正常
        
        
        # 展示
#         cv2.imshow('video',close) # 显示识别到的前景fgmask(不是写frame!)
        cv2.imshow('frame',frame) # 显示识别到的前景fgmask(不是写frame!)
        
            
    # 退出
    key = cv2.waitKey(100) # 每隔1ms接受用户按下的按键
    # 用户按‘ESC’即可退出
    if key == 27:
        break
        
# 最后别忘了释放资源
cap.release()
cv2.destroyAllWindows()

结果:
在这里插入图片描述

显示车辆统计信息

关键API:cv2.putText(frame,'Vehicle Count:' + str(car_num) ,(200,60),cv2.FONT_HERSHEY_SIMPLEX,2,(0,0,255),3)

总体代码:

# 显示车辆统计信息

import cv2
import numpy as np

# cap = cv2.VideoCapture(0) # 0表示调用摄像头
# cap = cv2.VideoCapture('./video.mp4') # 调用视频
cap = cv2.VideoCapture('./car.mp4') # 调用视频


# 创建一个MOG对象
mog = cv2.createBackgroundSubtractorMOG2() # 直接用 不用写参数

# 使用opencv获取卷积核
kernel = cv2.getStructuringElement(cv2.MORPH_RECT,(5,5))

# 取阈值,当图形轮廓小于阈值时排除掉(认为它不是车) ——> 只有长宽均大于阈值,才认为是一部车
min_w = 85
min_h = 80

# 车辆检测线的高度
line_high = 465

# 车辆检测线的偏移量
offset = 6 # 车辆检测线比检测线高offset个像素点或低offset个像素点——都算是被检测到

# 设置一个空列表,用于保存汽车外接矩形的中心点
cars = []

# 当前检测到的车辆数
car_num = 0

# 计算外接矩形的中心点
def center(x,y,w,h):
    x1 = int(w / 2)
    y1 = int(h / 2)
    cx = int(x) + x1
    cy = int(y) + y1
    return cx,cy

while True:
    ret,frame = cap.read()
    
    if ret == True :
        # 把原始帧进行灰度化,然后去噪
        gray = cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY)
        # 去噪(我们可以发现噪声比较均匀,不适合用中值滤波去除,而是用高斯滤波)
        blur = cv2.GaussianBlur(gray,(7,7),5)
#         blur = cv2.blur(gray,(3,3))
        
    
##---------------------------------------------------------------------------------------
# 降噪
        # 去除背景
        fgmask = mog.apply(blur) # 将前景掩码 "fgmask" 运用到这一帧图像上
        
        # 腐蚀做进一步去噪
#         erode = cv2.erode(fgmask,kernel)
        erode = cv2.erode(fgmask,kernel,iterations = 2)
        
        # 经过腐蚀后车也有些被腐蚀了!再膨胀回来
        dilate = cv2.dilate(erode,kernel,iterations = 3) # 做两次迭代,膨胀效果更明显(因为我们要求去噪,并不需要和原图一模一样,因此迭代次数可以不一样)
        
        # 我们发现有很多内部的小方块 ——> 怎么消除?
        # 闭运算
        close = cv2.morphologyEx(dilate,cv2.MORPH_CLOSE,kernel)
#      
##---------------------------------------------------------------------------------------
    
        # 识别车辆(对上次形态学操作的结果进行查找轮廓)
        # 查找轮廓
        contours,h  = cv2.findContours(close,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)
        
        # 画出车辆检测线(在for循环前就可以去计算了,不然每次循环都要画一次线,内存严重消耗)
        cv2.line(frame,(10,line_high),(1200,line_high),(255,255,0),3) # 参数:画在那、起始点、结束点、颜色
        
        # 画出所有检测到的轮廓
        for contour in contours: # contours是返回的一个列表,列表中放的是一个个ndarray,也就是轮廓的数据
            # 画最大外界矩形 (要求坐标点都是整数)
            (x,y,w,h) = cv2.boundingRect(contour) # 返回一个值,这一个值包含了最大外接矩形的x,y,w,h四个变量
            # 通过外接矩形的宽高大小来过滤掉小的矩形
#             if w * h < 5000: # 用面积的话误差较大
            if (w < min_w) and (h < min_h) :
                continue
            cv2.rectangle(frame,(int(x),int(y)),(int(x+w),int(y+h)),(0,255,255),2)
        
            # 把车抽象为一个点 ——> 即外接矩形的中心点
            # 要通过外界矩形计算矩形中心点 ——> 我们把这段代码独立出来,写成函数
            my_center = center(x,y,w,h)
            cv2.circle(frame,(my_center),5,(0,255,255),-1) # 画出中心点
            
            # 记录下当前的点,并且用中心点的y坐标和检测线加上偏移量进行对比,如果坐标在区间内,则检测到车辆,否则不算
            cars.append(my_center) # 将中心点追加到列表中
            
            # 遍历cars中的点,与检测线的要求进行对比
            for (x , y) in cars:
                if (y >= line_high - offset) and (y <= line_high + offset): # 落入了有效区间
                    # 计数加1
                    car_num += 1
                    # 统计过的车就remove掉 (如果remove,会出现一部车辆多次计数的情况)
                    cars.remove((x,y))
#                     print(car_num) # 统计结果正常
        
        # 显示车辆统计信息
        cv2.putText(frame,'Vehicle Count:' + str(car_num) ,(200,60),cv2.FONT_HERSHEY_SIMPLEX,2,(0,0,255),3)
        
        # 展示
#         cv2.imshow('video',close) # 显示识别到的前景fgmask(不是写frame!)
        cv2.imshow('frame',frame) 
        
            
    # 退出
    key = cv2.waitKey(10) # 每隔1ms接受用户按下的按键
    # 用户按‘ESC’即可退出
    if key == 27:
        break
        
# 最后别忘了释放资源
cap.release()
cv2.destroyAllWindows()

# 左右两车道分别计数效果会好一点:左边线往下一点 右边线往上一点
# 我们需要不停地挑检测线和检测轮廓的参数

结果:
在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

OpenCV:09车辆统计项目 的相关文章

  • opencv如何使用compareHist函数

    img cv2 imread mandrill png histg cv2 calcHist img 0 None 256 0 256 if len sys argv lt 2 print gt gt sys stderr Usage sy
  • 如何使图像呈现出陈旧、布满灰尘、颜色褪色的外观?

    我有旧画的图像 这些画很旧 布满灰尘 颜色褪色 如图所示here https i stack imgur com xuoEF jpg 如何赋予任何图像这种 旧 外观 我找不到任何过滤器或 openCV 函数来实现这种类型的外观 EDIT 我
  • opencv 视频上的颜色阈值

    I am thresholding for a color range in an opencv video The goal is to seperate the B mode black and white information on
  • OpenCV findContours 破坏源图像

    我编写了一个在单通道空白图像中绘制圆形 直线和矩形的代码 之后 我只需找出图像中的轮廓 就可以正确获取所有轮廓 但找到轮廓后 我的源图像变得扭曲 为什么会出现这种情况 任何人都可以帮我解决这个问题 我的代码如下所示 using namesp
  • 使用 openCV 和 python 检测物体

    我正在尝试使用 OpenCV 和 Python 检测下图中的白点 我尝试使用函数 cv2 HoughCircles 但没有成功 我需要使用不同的方法吗 这是我的代码 import cv2 cv import numpy as np impo
  • 如何在Python中使用tcp套接字发送和接收网络摄像头流?

    我正在尝试重新创建这个项目 https github com hamuchiwa AutoRCCar 我拥有的是服务器 我的电脑 和客户端 我的树莓派 我所做的与原始项目不同的是我尝试使用一个简单的网络摄像头而不是树莓派摄像头将图像从我的
  • 如何设置K-means openCV c++的初始中心

    我正在尝试使用 OpenCv 和 Kmeans 对图像进行分割 我刚刚实现的代码如下 include opencv2 objdetect objdetect hpp include opencv2 highgui highgui hpp i
  • 使用opencv计算深度视差图

    我无法使用 opencv 从视差图计算深度 我知道两个立体图像中的距离是用以下公式计算的z baseline focal disparity p 但我不知道如何使用地图计算视差 我使用的代码如下 为我提供了两个图像的视差图 import n
  • 使用Python的工业视觉相机[关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 来自连接到远程机器的相机的 Opencv 流

    我正在用 python 开发一个 wx 应用程序 用于流式传输和显示来自两个不同网络摄像头的视频 这工作正常 但现在我需要在不同的场景中执行此操作 其中两个摄像头连接在通过网络连接的 Windows 上运行的单独计算机中 我的应用程序将在机
  • 检查图像中是否有太薄的区域

    我正在尝试验证雕刻机的黑白图像 更多的是剪贴画图像 不是照片 我需要考虑的主要事情之一是区域的大小 或线条的宽度 因为机器无法处理太细的线条 所以我需要找到比给定阈值更细的区域 以此图为例 竖琴的琴弦可能太细而无法雕刻 我正在阅读有关 Ma
  • 从图像坐标获取对象的世界坐标

    I have been following this http docs opencv org modules calib3d doc camera calibration and 3d reconstruction html docume
  • 如何使用 python、openCV 计算图像中的行数

    我想数纸张 所以我正在考虑使用线条检测 我尝试过一些方法 例如Canny HoughLines and FLD 但我只得到处理过的照片 我不知道如何计算 有一些小线段就是我们想要的线 我用过len lines or len contours
  • OpenCV IP 相机应用程序崩溃 [h264 @ 0xxxxx] 访问单元中缺少图片

    我在 cpp 中有一个 opencv 应用程序 它使用 opencv 的简单结构捕获视频流并将其保存到视频文件中 它与我的网络摄像头完美配合 但是 当我运行它从 IP 摄像机捕获流时 它可能会在大约十秒后崩溃 我的编译命令是 g O3 IP
  • uri 警告中缺少端口:使用 Python OpenCV cv2.VideoCapture() 打开文件时出错

    当我尝试流式传输 ipcam 时 出现了如下所示的错误 tcp 000000000048c640 uri 中缺少端口 警告 打开文件时出错 build opencv modules videoio src cap ffmpeg impl h
  • 使用 OpenCV 改进特征点匹配

    我想匹配立体图像中的特征点 我已经用不同的算法找到并提取了特征点 现在我需要一个良好的匹配 在本例中 我使用 FAST 算法进行检测和提取 BruteForceMatcher用于匹配特征点 匹配代码 vector lt vector
  • 2d 图像点和 3d 网格之间的交点

    Given 网格 源相机 我有内在和外在参数 图像坐标 2d Output 3D 点 是从相机中心发出的光线穿过图像平面上的 2d 点与网格的交点 我试图找到网格上的 3d 点 This is the process From Multip
  • 二值图像中骨架上两点之间的最短路径

    我有一个二进制图像 其中包含图像的一个像素宽度骨架 您可能基本上知道 在这个二值图像中 我在骨架上有 1 在其他地方有 0 如何找到骨架上两个非零元素之间的最短距离 路径也应该在骨架本身上 我想使用 A star 算法的 C 实现 我找到了
  • Opencv Mat内存管理

    内存管理对于图像类至关重要 在opencv中 图像类是cv Mat 它有一个微妙的内存管理方案 假设我已经有了自己的图像类SelfImage class SelfImage public int width int height unsig
  • YOLOv8获取预测边界框

    我想将 OpenCV 与 YOLOv8 集成ultralytics 所以我想从模型预测中获取边界框坐标 我该怎么做呢 from ultralytics import YOLO import cv2 model YOLO yolov8n pt

随机推荐

  • 解决ERROR 2003 (HY000): Can’t connect to MySQL server on ‘localhost’ (10061)

    如何解决ERROR 2003 HY000 Can t connect to MySQL server on localhost 10061 1 登录到安装Mysql的主机 xff0c 打开cmd命令行工具 xff0c 执行命令mysql u
  • vscode中converting to execution character set: Illegal byte sequence

    我的这个问题是由于之前跟博主安装的时候在tasks json文件中添加了 34 fexec charset 61 GBK 34 删除后便可以正常运行了 当时即使我没添加这个代码控制台也没出现乱码的情况 xff0c 但还是加上了 xff0c
  • 工作日志day04

    再次安装虚拟机时常见的不确定点 软件选择 安装位置 点击完成 设置用户名的时候可能与数字 xff0c 以及强度有关 注销以管理员身份登录填写root用户名和自己设的密码 网络设置之后可以ping通 sudo yum y install tr
  • linux

    目录 基本命令 文件和用户管理 用户 创建用户 删除用户 修改用户属性 用户组 创建组 组的类型 提权 用户的权限 基本权限UGO 权限的三类对象 权限的三种类型 设置权限 编写程序 增加执行权限 更改属主 xff0c 属组 基本权限ACL
  • 机器学习.

    目录 一 机器学习概述 1 1人工智能概述 1 2什么是机器学习 1 2 1定义 1 2 2解释 1 2 3数据集的构成 1 3机器学习算法分类 1 3 1总结 1 3 2机器学习算法分类 1 4机器学习开发流程 1 5学习框架和资料介绍
  • NMEA-0813协议报文解析(QT/C++)

    文章目录 一 协议说明 二 具体实现 1 GNRMC 2 GNGGA 总结 一 协议说明 34 GN 34 联合模式协议头 xff1b 34 GP 34 GPS模式协议头 xff1b 34 GL 34 GLONASS模式协议头 xff1b
  • 寄存器位设置

    作为嵌入式工程师 xff0c 一定要掌握寄存器的控制 xff0c 想要了解基本的寄存器控制 xff0c 最简单的方法就是使用单片机练手 xff0c 51 xff0c stm0 xff0c stm8 xff0c MSP430等 xff0c 与
  • STM32 —— STM32 的串口通信

    STM32 STM32 的串口通信 STM32的串口通信接口有两种 xff0c 分别是 xff1a UART 通用异步收发器 USART 通用同步异步收发器 而对于大容量 STM32F10x 系列芯片 xff0c 分别有 3 个 USART
  • STM32 —— 串口数据接收

    STM32 串口接收数据 我们已经在前面的博客中讲过了串口通信中发送数据和中断的一些基本原理 xff0c 这里主要介绍串口接收数据的相关内容 定长字符串的接收 当接收单字节时 xff0c 我们就可以使用最简单的接收方式即可 xff0c 这种
  • 远距离WiFi模块,无人机传输技术,无线通信视频传输技术

    随着科技的发展 xff0c 无人机应用范围的不断扩展且愈加广泛 无人机的起飞 xff0c 航行 xff0c 悬停 xff0c 返回的任何一个阶段 xff0c 都需要进行无线遥控 xff0c 这就需要很高的灵敏度了 同时在无人机飞行的过程中
  • OpenMV:14巡线小车

    文章目录 追小球的小车巡线小车 这个例子展示了在OpenMV Cam上使用get regression xff08 xff09 方法获得ROI的线性回归 使用这种方法 xff0c 可以轻松让机器人跟踪所有指向相同大致方向的线 本例程可以用于
  • OpenMV:16神经网络

    文章目录 导论利用神经网络进行特征识别 已停用 神经网络检测函数检测函数 96 tf classify 96 返回值加载神经网络函数 96 tf load 返回值 96 例程1 图像中央人检测例程2 整幅图像人脸检测 导论 OpenMV内置
  • OpenMV:19OpenMV4 Plus训练神经网络进行口罩识别

    文章目录 1 采集2 连接3 训练复制API KEY上传照片模型创建生成神经网络训练神经网络测试神经网络备份保存 4 下载代码分析 注意 xff1a 只有 OpenMV4 Plus可以自己训练神经网络 xff0c 其他版本的性能不够 本节讲
  • OpenMV:21控制多个舵机(需要模块PCA9685)

    文章目录 连接代码控制单个舵机的旋转pc8596 pyservo pymain py利用两个舵机拓展板控制16个舵机 今天我们来学习下 OpenMV的舵机拓展板来控制多个舵机同时使用 如果我们想控制三个以上的舵机 xff0c 就需要用到舵机
  • OpenMV:22电机扩展板控制直流电机

    文章目录 电机拓展板产品介绍代码 今天为大家讲解下 OpenMV配套的电机扩展板 我们需要自己焊接插针 在使用电机扩展板时 xff0c 我们的电机扩展板需要外接一个6V 12V的电源 xff0c 来为电机供电 xff1b 电机扩展板同时会使
  • OpenMV:23串口发送数据

    文章目录 产品Hello World简单的数据发送 本节讲解 如何使用OpenMV通过串口来发送数据 OpenMV 是可以直接通过串口发送字符串的 为什么要用串口呢 xff1f 因为要时候需要把信息传给其他MCU xff08 单片机 xff
  • HTTP AUTH验证

    何为http auth http auth是一种基础的用户验证 xff0c 原理是将用户名 密码base64加密后放在http的请求头部Authorization 发给服务器 浏览器的做法 当你访问一个需要http auth验证的资源时 x
  • OpenMV与Arduino通信—串口

    文章目录 96 Arduino 96 的串口函数接收函数 96 Serial read 96 检测串口 96 Serial available 96 串口通信例程 96 OpenMV 96 代码 96 Arduino 96 代码 所有要进行
  • OpenCV:08图像金字塔

    目录 图像金字塔图像金字塔介绍高斯金字塔 xff08 Gaussian pyramid xff09 向下采样向上采样 拉普拉斯金字塔 图像直方图图像直方图的基本概念直方图术语使用 96 OpenCV 96 统计直方图使用 96 OpenCV
  • OpenCV:09车辆统计项目

    车辆统计项目 涉及到的内容大体流程知识补充背景减除 具体流程视频加载去除背景形态学识别车辆对车辆进行统计显示车辆统计信息 效果图 xff1a 涉及到的内容 窗口的展示图像 视频的加载基本图像的绘制 车辆识别 基本图像运算与处理形态学轮廓查找