【第四章:OpenCv阈值分割/二值化(单通道、多通道图片)总结】

2023-11-01

0.前言

  • 对一些算法的基本概念以及原理,本文不做过多的阐述,本文将一些相关基础知识以超链接的形式放在文章开头,大家根据需要进行挑选阅读,有基础的朋友可以直接跳过。

1.基础知识

1.1 什么是算子

  • 什么是算子: 高等数学上册P2中有这样的描述,算子即映射。可理解为从图像中的离散像素点集合通过某种关系,映射到另一个集合即可。

图1.1.1 算子即映射


1.2 图像处理中的图像分割技术

  • 对于图像处理中常见的分割,我这里做了个人的总结,同时,第三章主要以阈值分割为主,以及一些技巧的分享。在后面章节,会分享粘连物体的分割。

图1.2.1 图像处理中的分割

1.3 单通道图片的阈值分割

  • 注意:只要是单通道图片,就能进行二值化。 这里的单通道图片主要以Gray灰度图为主,但是在一些检测当中,需要用到其他色彩空间某些单通道的图片进行分割(因为某通道特征可能更为明显,更好分割)。后文会贴上程序,如何分离一张图片所有色彩空间下所有单通道图片。

  • 下面展示的是常用在单通道图片阈值分割的二值化算法
    在这里插入图片描述

图1.3.1 单通道图片二值化常用方法

1.4 推荐文章链接

1.多种色彩空间RGB、BGR、HSV /HSB、HSL、YUV的基本简介
2.多种边缘检测算法(Sobel算子、Isotropic Sobel算子、Roberts算子、Prewitt算子、Laplacian算子、Canny算子)介绍及比较
3.图像二值化方法汇总
4.图像二值化
5.多阈值 OTSU 处理方法
6.大津二值化
7.《opencv算法精解》全书笔记
8.opencv手册4.0中文文档



2. 灰度图分割

  • 个人比较常用的二值化算法是:简单二值化、大津二值化算法(图片亮度不均匀也能比较好分割)。其中简单二值化选取的阈值有时候可以借助灰度直方图,可以使阈值选取更为恰当,
  • 当图片有以下特点时可以考虑用灰度图分割: 检测物体对色彩特征没有要求,同时物体与背景像素值相差比较大。

2.1 灰度直方图

# 作者:OpenCv机器视觉
# 时间:2023/1/5
# 功能:灰度、BGR像素直方图
import cv2 as cv
import numpy as np
from matplotlib import pyplot as plt


# 绘制灰度直方图
def plot_demo(image):
    """
    画灰度图直方图:
    绘图都可以调用matplotlib.pyplot库来进行,其中的hist函数可以直接绘制直方图。
    plt.hist(arr, bins=50, normed=1, facecolor='green', alpha=0.75)
    hist的参数非常多,但常用的就这五个,只有第一个是必须的,后面四个可选
    arr: 需要计算直方图的一维数组
    bins: 直方图的柱数,可选项,默认为10
    normed: 是否将得到的直方图向量归一化。默认为0
    range参数表示箱子的下限和上限。即横坐标显示的范围,范围之外的将被舍弃
    """
    plt.hist(image.ravel(), 256, [0, 256],color="black")  # image.ravel()#ravel函数功能是将多维数组降为一维数组,统计各个bin的频次,256:bin的个数,[0, 256]:范围
    plt.show()  # 和OpenCV中的想要的直方图不同




def image_hist(image):
    """
    calcHist(images, channels, mask, histSize, ranges[, hist[, accumulate]])
    images参数表示输入图像,传入时应该用中括号[ ]括起来
    channels参数表示传入图像的通道,如果是灰度图像,那就不用说了,只有一个通道,值为0,
    如果是彩色图像(有3个通道),那么值为0,1,2,中选择一个,对应着BGR各个通道。这个值也得用[ ]传入。
    mask参数表示掩膜图像。如果统计整幅图,那么为None。
    主要是如果要统计部分图的直方图,就得构造相应的掩膜来计算。
    histSize参数表示灰度级的个数,需要中括号,比如[256]
    ranges参数表示像素值的范围,通常[0,256]。此外,假如channels为[0,1],ranges为[0,256,0,180],
    则代表0通道范围是0-256,1通道范围0-180。
    hist参数表示计算出来的直方图。
    """
    color = ('blue', 'green', 'red')  # 图像三通道
    for i, color in enumerate(color):
        hist = cv.calcHist([image], [i], None, [256], [0, 256])  # 绘制各个通道的直方图
        plt.plot(hist, color=color)  # 定义线的颜色
        plt.xlim([0, 256])  # x轴的范围
    plt.show()




src = cv.imread("img/1.png")
cv.namedWindow("input image",0)
cv.imshow("input image", src)

gray = cv.cvtColor(src,cv.COLOR_BGR2GRAY)
# 灰度直方图
plot_demo(gray)
# BGR像素直方图
image_hist(src)

cv.waitKey(0)
cv.destroyAllWindows()

  • 图片特征分析:不需要颜色特征,所以直接对其灰度图分割即可。根据灰度像素直方图可得我们得阈值设置在40-125左右即可。

    图2.1 灰度像素直方图


2.2 简单阈值分割与大津二值化分割

  • 代码,这里包含了简单阈值分割,自适应阈值分割、大津分割算法代码(代码涉及到python面向对象的知识点)。
# 作者:OpenCv机器视觉
# 时间:2023/1/5
# 功能:简单阈值分割,自适应阈值分割、大津分割算法代码
import cv2 as cv



class GetBinary(object):
    def __init__(self,img):
        self.img = img

    def threshed_fixed(self):
        """
        :function:利用固定阈值进行二值化
        :return:
        """

        blurred = cv.blur(self.img, (5,5))  # 这里进行5x5卷积核的均值滤波处理
        gray = cv.cvtColor(blurred,cv.COLOR_BGR2GRAY)

        ret,bin = cv.threshold(gray,100,255,cv.THRESH_BINARY)
        return bin
    def adaptive_threshold(self):
        """
        :function:利用自适应局部二值化方法进行二值化
        :return:
        """
        blurred = cv.blur(self.img, (5,5))  # 这里进行5x5卷积核的均值滤波处理
        gray = cv.cvtColor(blurred, cv.COLOR_BGR2GRAY)
        bin = cv.adaptiveThreshold(src=gray,maxValue=255,adaptiveMethod=cv.ADAPTIVE_THRESH_MEAN_C,thresholdType=cv.THRESH_BINARY,blockSize=31,C=1)
        return bin


    def threshed_otsus(self):
        """
        :function:利用OTSU's二值化算法阈值进行二值化
        :return:
        """
        blurred = cv.blur(self.img, (5, 5))  # 这里进行5x5卷积核的均值滤波处理
        gray = cv.cvtColor(blurred,cv.COLOR_BGR2GRAY)
        ret,bin=  cv.threshold(gray,0,255,cv.THRESH_BINARY+cv.THRESH_OTSU)
        return bin


img = cv.imread(".\\img\\1.png")
# 定义一个对象
get_binary = GetBinary(img)
# 调用对象中的方法
bin1 = get_binary.threshed_fixed()      # 简单阈值分割
bin2 = get_binary.adaptive_threshold()  # 自适应阈值分割
bin3 = get_binary.threshed_otsus()      # 大津算法分割




cv.namedWindow("img",0)
cv.imshow("img",img)

cv.namedWindow("threshed_fixed",0)
cv.imshow("threshed_fixed",bin1)
cv.namedWindow("adaptive_threshold",0)
cv.imshow("adaptive_threshold",bin2)
cv.namedWindow("threshed_otsus",0)
cv.imshow("threshed_otsus",bin3)


cv.waitKey(0)
cv.destroyAllWindows()

图2.2 简单阈值分割与大津二值化分割分割效果

  • 参考链接

1.灰度直方图、BGR像素直方图

2.matplotlib画图基本操作



3.分离常见色彩空间下的单通道图片

  • 背景意义:当彩色图片下的目标与背景区分度不是很高,这时候我们可以考虑分离各通道下的图片,观察在哪个通道下的特征比较明显,便于后期的阈值分割。这里举例子的是某课题细胞分割图片。

图3.1 某细胞图片


  • 代码
# 作者:OpenCv机器视觉
# 时间:2023/1/6
# 功能:获取HSV 、LAB、HIS、LUV、YUV色彩空间下各单通道图片
import cv2 as cv
import os




def split_all_chancel(img):

    # 色彩空间转换
    gray = cv.cvtColor(img,cv.COLOR_BGR2GRAY)
    HSV = cv.cvtColor(img, cv.COLOR_BGR2HSV)
    LAB = cv.cvtColor(img, cv.COLOR_BGR2LAB)
    HIS = cv.cvtColor(img, cv.COLOR_BGR2HLS)
    LUV = cv.cvtColor(img, cv.COLOR_BGR2LUV)
    YUV = cv.cvtColor(img, cv.COLOR_BGR2YCrCb)

    # 对各图片通道进行拆分
    bgr_b, bgr_g, bgr_r = cv.split(img)
    hsv_h, hsv_s, hsv_v = cv.split(HSV)
    lab_l, lab_a, lab_b = cv.split(LAB)
    his_h, his_i, his_s = cv.split(HIS)
    luv_l, luv_u, luv_v = cv.split(LUV)
    yuv_y, yuv_u, yuv_v = cv.split(YUV)
    return  ([hsv_h, hsv_s, hsv_v,lab_l, lab_a, lab_b,  his_h, his_i, his_s,luv_l, luv_u, luv_v,yuv_y, yuv_u, yuv_v,bgr_b, bgr_g, bgr_r,gray],
            ["hsv_h"," hsv_s", "hsv_v","lab_l", "lab_a", "lab_b",  "his_h", "his_i", "his_s","luv_l", "luv_u", "luv_v","yuv_y", "yuv_u", "yuv_v","bgr_b","bgr_g","bgr_r","gray"])


# 原图片路径
img_path = ".\\img\\2.jpg"

img = cv.imread(img_path)                       # 读取图片
name = os.path.splitext(img_path)[0]            # 图片文件名
extend_name = os.path.splitext(img_path)[-1]    # 图片扩展名
if not os.path.exists(name):                    # 判断以图片名 为命名的文件夹是否存在
    os.makedirs(name)                           # 不存在就创建文件夹,用于存放图片

# 调用分离通道函数
channels_imgs,channel_str = split_all_chancel(img)
for i, channels_img in enumerate(channels_imgs):
    out_name = os.path.join(name,channel_str[i]+".png")   # 保存路径,为图片相同路径下
    print(out_name)
    cv.imwrite(out_name, channels_img)



  • 通道分离效果如下,从分离的单通道图片中,不难看出,HSV色彩空间下的V通道特征比较明显(BGR_G,LAB_L通道也比较明显,都可以采用此通道进行阈值分割,但是常用的还是HSV色彩空间),因此下文通过HSV色彩空间转换,对细胞进行分割识别。

图3.2  常见色彩空间下的单通道图

4. HSV分割

4.1 常见分割代码

  • HSV的上下阈值根据 HSV颜色分量范围表 来确定

图4.1.1 HSV颜色分量范围表

  • 因为细胞是偏绿色,所以这里根据颜色分量范围表进行设置高低阈值
lower = np.array([35, 43, 46])
upper = np.array([77, 255, 255])
  • 代码:
# 作者:OpenCv机器视觉
# 时间:2023/1/6
# 功能:根据HSV颜色分量表进行阈值分割识别

import cv2 as cv
import numpy as np


path = ".\\img\\2.jpg"      # 图片位置
img = cv.imread(path)                                   #读取图像
imgHsv = cv.cvtColor(img, cv.COLOR_BGR2HSV)              #转换为HSV色彩空间
lower = np.array([35, 43, 46])                          #定义低阈值
upper = np.array([77, 255, 255])                        #定义高阈值
mask = cv.inRange(imgHsv,lower,upper)                   #获取分割掩膜图
imgResult = cv.bitwise_and(img,img,mask,mask=mask)       # 将掩膜图与原图进行运算,白色区域目标显示为彩色效果



contours = cv.findContours(mask.copy(), cv.RETR_EXTERNAL, cv.CHAIN_APPROX_SIMPLE)[0]  # 获取图片的轮廓
for c in contours:                    # 获取每个轮廓
        x, y, w, h = cv.boundingRect(c)
        cv.rectangle(img, (x, y), (x + w, y + h), (0, 0, 255), 2 )  # 画外接矩形


cv.namedWindow("mask",0)
cv.imshow("mask",mask)
cv.namedWindow("img", 0)
cv.imshow("img", img)
cv.namedWindow("imghsv",0)
cv.imshow("imghsv", imgHsv)

cv.waitKey(0)

  • 分割效果:对颜色较为明显的细胞能识别到,但是对于染色不为明显的细胞,漏识别。难道阈值我们就要根据这个表去一个个尝试吗?这样效率太低了,下面会介绍一款非常好用的滑动条工具。

图4.1.2 通过HSV颜色分量表定义阈值范围 识别效果


4.2 技巧1,通过鼠标感应,获取某个像素的的HSV像素值

  • 该操作主要了解以下鼠标感应,获取图像某位置的信息。要更好地进行目标识别,还是需要利用技巧2中的滑动条。
# 作者:OpenCv机器视觉
# 时间:2023/1/6
# 功能:通过鼠标感应,点击鼠标左键,获取该坐标的相关信息,可以是BGR值,可以是坐标,也可以是灰度值,这里是以HSV值为例,大家可以根据想法更改程序

import cv2 as cv

# 图片路径
img = cv.imread("img\\2.jpg")

def on_EVENT_LBUTTONDOWN(event, x, y, flags, param):
    if event == cv.EVENT_LBUTTONDOWN:
        hsv = cv.cvtColor(img, cv.COLOR_BGR2HSV)  # 图片重新加载,用于刷新,保证上一步的显示内容不被显示
        xy = "%d,%d" % (x, y)
        print("坐标:",(x,y),"HSV值",hsv[y][x]) # hsv[y][x]因为图片第一个参数是高,第二个参数是宽
        cv.putText(hsv, xy, (x, y), cv.FONT_HERSHEY_PLAIN,2, (0, 0, 255), thickness=2)
        cv.imshow("HSV", hsv)


hsv = cv.cvtColor(img,cv.COLOR_BGR2HSV)     # 色彩空间转换
cv.namedWindow("HSV",0)
cv.setMouseCallback("HSV", on_EVENT_LBUTTONDOWN)
cv.imshow("HSV", hsv)

cv.waitKey(0)

图4.2 鼠标感应获取图片像素点信息


4.2 最佳技巧性工具:借助滑动条,快速实现基于颜色的目标识别

  • 代码
# 作者:OpenCv机器视觉
# 时间:2023/1/6
# 功能:借助滑动条进行颜色识别
import cv2 as cv
import numpy as np



path = ".\\img\\2.jpg"      # 图片位置

def empty():
    pass


cv.namedWindow("TrackBars",0)
cv.createTrackbar("Hue Min","TrackBars",0,179,empty)
cv.createTrackbar("Hue Max","TrackBars",179,179,empty)
cv.createTrackbar("Sat Min","TrackBars",0,255,empty)
cv.createTrackbar("Sat Max","TrackBars",255,255,empty)
cv.createTrackbar("Val Min","TrackBars",0,255,empty)
cv.createTrackbar("Val Max","TrackBars",255,255,empty)


while True:

    # 获取滑动条参数值
    h_min = cv.getTrackbarPos("Hue Min","TrackBars")
    h_max = cv.getTrackbarPos("Hue Max", "TrackBars")
    s_min = cv.getTrackbarPos("Sat Min", "TrackBars")
    s_max = cv.getTrackbarPos("Sat Max", "TrackBars")
    v_min = cv.getTrackbarPos("Val Min", "TrackBars")
    v_max = cv.getTrackbarPos("Val Max", "TrackBars")



    img = cv.imread(path)                                   #读取图像
    print("lower = np.array("+str([h_min,s_min,v_min])+")")
    print("upper = np.array("+str([h_max,s_max,v_max])+")")
    imgHsv = cv.cvtColor(img, cv.COLOR_BGR2HSV)              #转换为HSV色彩空间
    lower = np.array([h_min,s_min,v_min])                    #定义低阈值
    upper = np.array([h_max,s_max,v_max])                    #定义高阈值
    mask = cv.inRange(imgHsv,lower,upper)                   #获取灰度图
    imgResult = cv.bitwise_and(img,img,mask,mask=mask)       #目标显示RGB



    # 对识别后的图像进行框选
    area = []  # 定义一个列表来图片的面积
    contours = cv.findContours(mask.copy(), cv.RETR_EXTERNAL, cv.CHAIN_APPROX_SIMPLE)[0]  # 获取图片的轮廓 ,不同python有的索引值是0,有的是1
    if  h_min>0  or v_min>0 or s_min>0 or h_max<180 or s_max<255 or v_max<255:       # 当检测到有拖动的时候再开始轮廓的面积计算,因为有的图片初始化没有发现轮廓,计算面积就会报错,
        for c in contours:                    # 获取每个轮廓
            if cv.contourArea(c)>10:    # 进行滤波,将一些太小的噪点过滤掉
                x, y, w, h = cv.boundingRect(c)
                cv.rectangle(img, (x, y), (x + w, y + h), (0, 255, 255), 2 )  # 画外接矩形






    cv.namedWindow("mask",cv.WINDOW_NORMAL)
    cv.imshow("mask",mask)
    cv.namedWindow("img", cv.WINDOW_NORMAL)
    cv.imshow("img", img)

    cv.waitKey(1)

  • 识别效果

视频4.2 滑动条识别效果


5 总结

  • 本章节主要内容为阈值分割
    1)提到了图像分割方法;
    2)常用的二值化方法、如何根据需求进行通道分类,进行阈值分割
    3)推荐了颜色识别当中最好用的滑动条工具。
    4)以及个人整理的源代码

  • 本文没有详细介绍原理,多为个人学习总结,底层原理内容多以超链接形式供大家选择阅读。因个人总结可能有点漏缺,如有错误地方欢迎大家批评指正。原创不易,如果大家觉得文章不错,欢迎点赞收藏!!!

6. 其他章节链接


1.理论系列:

第一章:pycharm、anaconda、opencv、pytorch、tensorflow、paddlex等环境配置大全总结【图像处理py版本】

第二章:OpenCv算法的基本介绍与应用

第三章:OpenCv图片、视频读写操作与基本应用

==》第四章:OpenCv阈值分割/二值化(单通道、多通道图片)总结


2.项目系列:

项目一:四六级改卷系统
项目二:实战篇:粘连物体分割——利用几何分割实现瓶盖分割检测
项目三:实战篇:粘连物体分割——利用几何分割实现硬币分割检测
项目四:实战篇:粘连物体分割——利用几何分割实现细胞分割检测
项目五:实战篇:粘连物体分割——利用分水岭算法实现糖豆分割检测

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

【第四章:OpenCv阈值分割/二值化(单通道、多通道图片)总结】 的相关文章

  • 未加载库:@rpath/libopenblasp-r0.2.19.dylib

    我应该如何解决这个问题 Monas MacBook Pro 02 02 mona python Python 3 6 1 Anaconda custom x86 64 default May 11 2017 13 04 09 GCC 4 2
  • Opencv 对象检测:ORB GPU 检测器和 SURF GPU 描述符提取器

    我只是做了一个小实验来尝试不同的检测器 描述符组合 我的代码使用 ORB GPU 检测器来检测特征 并使用 SURF GPU 描述符来计算描述符 我使用 BruteForceMatcher GPU 来匹配描述符 并使用 knnMatch 方
  • 将 CvSeq 保存到数组

    我对 OpenCV 文档有点迷失 我想将 cvFindContours 返回的 CvSeq 保存到一个数组中 据我了解它将返回 CvContour 的 seq 但我找不到它包含的内容 我应该保存其中的哪些部分 稍后我可以迭代它并说调用 cv
  • 在Spyder(Python 3.6)中导入cv2时出现导入错误

    我已经在Windows操作系统中安装了opencv 3 0 0 我已运行该应用程序并已成功将其安装在C 驱动器并还复制了cv2 pyd文件输入C Python27 Lib site packages正如我在几个教程视频中看到的那样 在我的
  • 使用 Racket FFI 进行快速阵列访问

    我正在尝试在 Racket 中编写 OpenCV FFI 并达到了需要有效操作数组的地步 然而 我所有使用 Racket FFI 访问数组的尝试都会导致代码效率非常低 有没有办法使用 FFI 快速访问 C 数组 在 Racket 中 这种类
  • 从基本矩阵中查找单应矩阵

    我正在尝试计算单应性矩阵H给定一组对应关系和基本矩阵F 根据对极几何原理 我知道这可以通过对极线和对极线的叉积来完成F from 极点几何 http www cs unc edu marc tutorial node44 html e ij
  • OpenCV InRange 参数

    我在 Android 上使用 OpenCV 来实时查找特定颜色的圆圈 我的第一步是仅保留与我正在寻找的定义颜色相对应的像素 在本例中为红色或绿色 示例图像 https i stack imgur com CIozU jpg 为此 我正在使用
  • 安装 gstreamer 对 opencv python 包的支持

    我已经从源代码构建了自己的 opencv python 包 import cv2 print cv2 version 打印 3 4 5 现在我面临的问题是关于 opencv 的 VideoCapture 类中的 gstreamer 的使用
  • OpenCV 中更新窗口的 waitKey() 的替代方法

    到目前为止我见过的所有示例和书籍都建议使用 waitKey 1 来强制重新绘制 OpenCV 窗口 这看起来很奇怪而且太老套了 不必要的时候为什么还要等待 1 毫秒呢 还有其他选择吗 我尝试了 cv updateWindow 但它似乎需要
  • OpenCV:处理每一帧

    我想使用 OpenCV 编写一个跨平台应用程序进行视频捕获 在所有示例中 我发现来自相机的帧是使用抓取功能进行处理并等待一段时间 我想处理序列中的每一帧 我想定义自己的回调函数 每次当一个新帧准备好处理时都会执行该函数 例如直播对于 Win
  • 如何使用 python cv2 api 将 xy 点格式化为 unactorPoints?

    我在格式化要传递给 unactorPoints 的 x y 点列表时遇到问题 opencv 2 4 1 该错误消息是 C 特定的 并抱怨点数组不是 CV 32FC2 类型 我不应该能够传入 Nx2 numpy 数组吗 import cv2
  • 从一个 Mat 复制到另一个 Mat 仅接近黑色像素

    I have Mat difference其中有一些黑色像素 或者几乎是黑色像素 gt 如果发生地震 建筑物会移动等 并且Mat current它由具有自然色彩的真实图像组成 我想替换中的像素Mat current这些黑色像素Mat dif
  • OpenCV Python 删除图像中的某些对象

    我正在使用带有 opencv 和 numpy 的 python 来检测天文中的星星 例如这个1 https i stack imgur com AKwEJ jpg图片 使用模板匹配 我可以用阈值检测星星 单击 2 2 https i sta
  • 使用 K 均值聚类 OpenCV 进行交通标志分割

    I used K Means Clustering to perform segmentation on this traffic sign as shown below 这些是我的代码 读取图像并模糊 img cv imread 000
  • 针对不同相机(RGB 和红外)的 StereoCalibrate

    我在校准两个摄像头时遇到问题 第一个是 RGB 第二个是红外 它们有不同的分辨率 我调整了大小并裁剪了更大的图像 焦距等等 例子 RGB 1920x1080 Infrared 512x424 如何相互校准它们 我应该在stereoCalib
  • 使用 cvcreateimage 使用 opencv 创建简单的黑色图像

    来自 OpenCV 新手的非常基本的问题 我只想创建一个图像 每个像素设置为0 黑色的 我在 main 函数中使用了以下代码 IplImage imgScribble cvCreateImage cvSize 320 240 8 3 我得到
  • 使用 Azure 机器学习检测图像中的符号

    4年前我发帖这个问题 https stackoverflow com q 6999920 411094不幸的是 得到的一些答案超出了我的技能水平 我刚刚参加了一次构建巡演会议 他们在会上谈论了机器学习 这让我想到了使用 ML 来解决我的问题
  • 附加信息:OpenCV:使用 c# 的不同大小的对象

    目前 我的 EmguCV c 代码面临问题 我试图从数据库中识别我的图像 但它不起作用 一旦检测到我的脸 它就会崩溃 然后会出现此错误 附加信息 OpenCV 不同大小的对象 我尝试寻找这个错误 但我一无所知 这是我的代码 Action f
  • 从索贝尔确定图像梯度方向?

    我正在尝试使用 openCV 的 Sobel 方法的结果来确定图像梯度方向 我知道这应该是一个非常简单的任务 我从此处复制了许多资源和答案中的方法 但无论我做什么 所得方向始终在 0 57 度之间 我希望范围为 0 360 我相信所有的深度
  • 从视频/图像中提取元数据

    我从 IP 摄像机获取 MJPEG 流 我正在查看该流并将其保存在计算机上 可以找到我的操作代码here https stackoverflow com questions 21702477 how to parse mjpeg http

随机推荐

  • 本地cdn缓存:解决Mathjax不稳定加载不出来公式

    本地cdn缓存 解决Mathjax不稳定加载不出来公式 如果网站用mathjax来显示公式 例如 这个Confluence 那么我们会发现 有的时候 公式加载慢半拍或者干脆加载不出来 这是因为 每次使用mathjax 浏览器都会从遥远的cd
  • 033_webpack打包ES6模块化工程

    1 新建项目 1 1 新建一个ES6Model文件夹 1 2 打开VSCode 1 3 使用VSCode打开文件夹 1 4 选择要打开的文件夹 1 5 资源管理器中显示打开的文件夹 1 6 在终端中运行 npm init y命令 初始化包管
  • Android开发实战讲解!五年Android开发者小米、阿里面经,醍醐灌顶!

    近两年 程序员职业发展 话题 受到越来越多关注 做技术还是转管理 如何保持竞争力 是否要转换新的技术栈 每个工作三五年的程序员 都正面临着类似的焦虑 工作三五年 不能像刚入职场凭着一股子冲劲和能吃苦耐劳的精神赢得升职加薪 而转型管理 是很多
  • 头歌平台educoder解除不能复制粘贴限制

    平台是平常上课的上机和作业很麻烦 后来知道可以cv就很简单了 希望大家顺利毕业 不挂科
  • 介绍几种给你的Python代码加上酷炫的进度条的方式

    前言 本文的文字及图片来源于网络 仅供学习 交流使用 不具有任何商业用途 版权归原作者所有 如有问题请及时联系我们以作处理 大家好 在下载某些文件的时候你一定会不时盯着进度条 在写代码的时候使用进度条可以便捷的观察任务处理情况 除了使用pr
  • sqli-labs-master第25、25a关

    第25关 http 192 168 89 139 sqli labs master Less 25 我们看到提示 过滤 or 和 and 为了进一步确认看下源代码 确实是这样 我们想一下还有哪些逻辑运算符 那就直接改为 利用 http 19
  • File chooser dialog can only be shown with a user activation.

    File chooser dialog can only be shown with a user activation vue项目中直接写this refs fileInput click 点击之后报警告 File chooser dia
  • mysql数据库逻辑模型图,MySQL逻辑架构

    上图 图是百度找的 msql en jpg msql en jpg mysql逻辑架构 连接层 服务层 引擎层 存储层 四层 Connectors 连接 指不同语言与数据库的交互 比如 java里的JDBC Management Serve
  • Java 对象序列化 JSON时,数据出现引用结构 $ref

    对Java对象序列化操作时 发现JSON 使用阿里巴巴的FastJSON组件 数据中 包含 ref 结构数据 这是为了避免触发 StackOverflowError 错误而做的处理 第一种解决方法是 关闭FastJSON的引用检测 不建议
  • OpenSSH 输入验证错误漏洞(CVE-2020-12062)漏洞修复(本人亲测)

    目录 一 漏洞描述 二 修复方式 三 修复流程 1 查找sshd和ssh位置 2 备份sshd 3 搜索版本信息 4 替换版本信息 最重要的一步 5 测试 一 漏洞描述 OpenSSH 输入验证错误漏洞 CVE 2020 12062 二 修
  • Java数组的定义与使用

    目录 一 一维数组的定义 1 创建数组 2 初始化数组 二 数组的使用 1 访问数组 2 遍历数组 3 修改数据内容 三 有关数组方法的使用 1 toString 2 copyOf 四 查找数组中的元素 1 顺序查找 2 二分查找binar
  • STM32 的中断解析

    中断定义及其执行过程 中断是指在主程序运行过程中 出现了特定的中断触发条件 中断源 使得CPU暂停当前正在运行的程序 转而去处理中断程序 处理完成后又返回原来被暂停的位置继续运行 STM32微控制器有68个可屏蔽中断通道 包含EXTI TI
  • 如何设置PCB过孔盖油 AD、 Protel 99 SE、 PADS Layout

    关于 过孔盖油 和 过孔开窗 此点 许多客户下单时经常会问这是什么意思 就此问题点 说明如下 过孔盖油 1 下单上传的是pcb文件 并在下单时勾选过孔盖油 做板工艺就是过孔盖油 2 下单上传的是gerber文件 按gerber文件生产 忽略
  • Code::Blocks +mingw64 编译64位程序配置方法

    一 准备工作 说明 本人新手一个 最近在用code blocks编程 用的C 由于默认编译器是编译32位的 程序占用系统内存最大只能2g 便考虑编译成64位程序来增大可用内存 于是就上网找方法 可惜网上我搜到的方法试了统统不管用 在破罐子破
  • 百度X福州新区 “数字时代 智领未来”智能网联汽车道路测试正式启动

    9月19日 由福州新区管委会指导 福州市电子信息集团与百度承办的福州新区智能网联汽车道路测试启动仪式暨智能汽车产业科创基地揭牌仪式正式启动 标志着福州新区成为全国首批无人化 商业化政策落地的先行区 成为福建省首个规模化智能网联道路建成区和自
  • OpenCV-图像梯度与边缘提取

    文章目录 图像梯度与边缘提取 Sobel和Scharr算子 cv2 Sobel cv2 convertScaleAbs cv2 Scharr 示例 Laplacian算子 cv2 Laplacian 示例 canny边缘提取 cv2 can
  • “互联网从此没有 BAT”

    燃财经 ID rancaijing 原创 作者 黎明 编辑 魏佳 长期被唱衰的百度 终于到了正式告别BAT的关键时刻 过去30天 受业绩下滑和高管离职等因素影响 百度的股价跌去30 市值蒸发200亿美金 美团趁势赶上 市值一举超越百度 正式
  • 华为OD机试 - 报文回路(Java & JS & Python)

    题目描述IGMP 协议中响应报文和查询报文 是维系组播通路的两个重要报文 在一条已经建立的组播通路中两个相邻的 HOST 和 ROUTER ROUTER 会给 HOST 发送查询报文 HOST 收到查询报文后给 ROUTER 回复一个响应报
  • Incorrect string value: ‘\xE7\x94\x9F\xE4\xBA\xA7...‘ for column ‘ylname‘ at row 1

    1 修改数据库字符集 alter database db new 数据库名 charset utf8mb4 2 修改表字符集 alter table tb 表名 charset utf8mb4 3 修改表字符集和校验规则 alter tab
  • 【第四章:OpenCv阈值分割/二值化(单通道、多通道图片)总结】

    第四章 OpenCv阈值分割 二值化 单通道 多通道图片 总结 0 前言 1 基础知识 1 1 什么是算子 1 2 图像处理中的图像分割技术 1 3 单通道图片的阈值分割 1 4 推荐文章链接 2 灰度图分割 2 1 灰度直方图 2 2 简