基于YOLOv5&opencv的交通道路三角锥检测系统(部署教程&源码)

2023-10-27

1.研究背景与意义

随着城市化进程的加快和交通流量的不断增加,交通安全问题成为了一个日益突出的社会问题。其中,交通道路上的三角锥是一种常见的交通安全设施,用于标记道路施工、交通事故现场、道路封闭等情况。然而,由于道路规模庞大、人力资源有限,对于三角锥的监测和管理往往存在一定的困难。

传统的三角锥监测方法主要依赖于人工巡查,这种方法效率低下、成本高昂且易出错。因此,研发一种基于计算机视觉技术的交通道路三角锥检测系统具有重要的现实意义。

近年来,深度学习技术在计算机视觉领域取得了巨大的突破。其中,YOLOv5是一种基于深度学习的目标检测算法,具有高效、准确的特点。而OpenCV是一个广泛应用于计算机视觉领域的开源库,提供了丰富的图像处理和计算机视觉算法。

2.图片演示

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3.视频演示

基于YOLOv5&opencv的交通道路三角锥检测系统(部署教程&源码)_哔哩哔哩_bilibili

4.系统优势

基于YOLOv5和OpenCV的交通道路三角锥检测系统可以通过分析道路监控摄像头拍摄的图像,自动识别并定位道路上的三角锥。相比传统的人工巡查方法,该系统具有以下优势:

  1. 高效性:基于YOLOv5的目标检测算法可以实现实时的三角锥检测,大大提高了监测效率。

  2. 准确性:YOLOv5算法在目标检测任务上具有较高的准确率,可以有效地识别道路上的三角锥。

  3. 自动化:该系统可以自动地进行三角锥的检测和定位,减少了人工巡查的工作量。

  4. 成本效益:相比人工巡查,基于计算机视觉技术的三角锥检测系统可以大大降低成本,提高资源利用效率。

  5. 实时性:该系统可以实时监测道路上的三角锥,及时发现异常情况并采取相应的措施,提高了交通安全性。

因此,基于YOLOv5和OpenCV的交通道路三角锥检测系统具有重要的研究意义和实际应用价值。通过该系统的研发和应用,可以提高交通安全管理的效率和水平,减少交通事故的发生,保障交通参与者的生命财产安全。同时,该系统的研究也为基于计算机视觉技术的交通安全监测系统的发展提供了有益的借鉴和参考。

5.交通锥定位流程图

在这里插入图片描述
首先需要对交通锥的特征进行分析:交通锥可提取出哪些特征以及这些特征在不同光照条件下的区别,然后对提取出的特征进行处理。交通锥呈锥形,红白黑三种颜色相间,其中最明显的就是两个相对位置固定的红色区域,此红色区域特征容易分辨,直视图是上下两个梯形。紧挨着两个梯形红色区域的是两个梯形白色区域。经过分析本文决定对交通锥最明显的两块红色区域和两块白色区域进行提取来判断交通锥存在与否[30],可以依据交通锥的红色区域和白色区域的特点和位置关系来判断视野中是否存在交通锥。
设第一红色区域为A,第二红色区域为B,第一白色区域为C,第二白色区域为D,则交通锥的示意图可以表示为下图所示。
在这里插入图片描述

6.YOLOv5算法改进

参考该博客的改进方案,Ghost 瓶颈结构使用 Ghost 模块,并引入类似 MobileNet v2 的瓶颈结构构建了全新的基础模块。Ghost 瓶颈结构采用小维度、大维度、小维度的形式,能让信息在不同维度之间转换时避免压缩带来的信息损失。
Ghost 瓶颈结构中的第一个Ghost 模块用于升维,第二个Ghost 模块用于降维,使其能够和经过捷径连接的通道数相一致,如下图(a)。当 Stride=2 时,在 Ghost模块升维后添加深度卷积,而且在捷径连接中加入深度卷积和点卷积,如下图(b)所示。
在这里插入图片描述
该博客的作者发现在传统的深度学习网络中存在着大量冗余,但是对模型的精度至关重要的特征图。这些特征图是由卷积操作得到,又输入到下一个卷积层进行运算,这个过程包含大量的网络参数,消耗了大量的计算资源。
作者考虑到这些feature map层中的冗余信息可能是一个成功模型的重要组成部分,正是因为这些冗余信息才能保证输入数据的全面理解,所以作者在设计轻量化模型的时候并没有试图去除这些冗余feature map,而是尝试使用更低成本的计算量来获取这些冗余feature map。
在这里插入图片描述
Ghost卷积部分将传统卷积操作分为两部分:

第一步,使用少量卷积核进行卷积操作(比如正常用64个,这里就用32个,从而减少一半计算量)
第二步,使用3×3或5×5的卷积核进行逐通道卷积操作(Cheap operations)
最终将第一部分作为一份恒等映射(Identity),与第二步的结果进行Concat操作

7.核心代码讲解

7.1 code\Interface.py

class YOLOv5Detector:
    def __init__(self, weights, data, device='', half=False, dnn=False):
        self.weights = weights
        self.data = data
        self.device = device
        self.half = half
        self.dnn = dnn
        self.model = None
        self.stride = None
        self.names = None
        self.pt = None
        self.jit = None
        self.onnx = None
        self.engine = None

    def load_model(self):
        # Load model
        device = select_device(self.device)
        self.model = DetectMultiBackend(self.weights, device=device, dnn=self.dnn, data=self.data)
        self.stride, self.names, self.pt, self.jit, self.onnx, self.engine = (
            self.model.stride, self.model.names, self.model.pt, self.model.jit, self.model.onnx, self.model.engine
        )

        # Half
        half = self.half and (self.pt or self.jit or self.onnx or self.engine) and device.type != 'cpu'
        if self.pt or self.jit:
            self.model.model.half() if half else self.model.model.float()

    def run(self, img, imgsz=(640, 640), conf_thres=0.25, iou_thres=0.45, max_det=1000, classes=None,
            agnostic_nms=False, augment=False):
        cal_detect = []

        device = select_device(self.device)
        names = self.model.module.names if hasattr(self.model, 'module') else self.model.names  # get class names

        # Set Dataloader
        im = letterbox(img, imgsz, self.stride, self.pt)[0]

        # Convert
        im = im.transpose((2, 0, 1))[::-1]  # HWC to CHW, BGR to RGB
        im = np.ascontiguousarray(im)

        im = torch.from_numpy(im).to(device)
        im = im.half() if self.half else im.float()  # uint8 to fp16/32
        im /= 255  # 0 - 255 to 0.0 - 1.0
        if len(im.shape) == 3:
            im = im[None]  # expand for batch dim

        pred = self.model(im, augment=augment)

        pred = non_max_suppression(pred, conf_thres, iou_thres, classes, agnostic_nms, max_det=max_det)
        # Process detections
        for i, det in enumerate(pred):  # detections per image
            if len(det):
                # Rescale boxes from img_size to im0 size
                det[:, :4] = scale_coords(im.shape[2:], det[:, :4], img.shape).round()

                # Write results
                for *xyxy, conf, cls in reversed(det):
                    c = int(cls)  # integer class
                    label = f'{names[c]}'
                    cal_detect.append([label, xyxy])
        return cal_detect


def detect():
    weights = ROOT / 'best.pt'
    data = ROOT / 'data/coco128.yaml'
    device = ''
    half = False
    dnn = False

    detector = YOLOv5Detector(weights, data, device, half, dnn)
    detector.load_model()

    image = cv2.imread("./images/1.jpg")
    results = detector.run(image)
    for i in results:
        box = i[1]
        p1, p2 = (int(box[0]), int(box[1])), (int(box[2]), int(box[3]))
        print(i[0])
        cv2.rectangle(image, p1, p2, (0, 255, 0), thickness=3, lineType=cv2.LINE_AA)
    cv2.imshow('image', image)
    cv2.waitKey(0)


detect()

这个程序文件是一个用于目标检测的接口。它导入了一些必要的库和模块,并定义了一些函数和变量。

程序首先加载模型和数据集,然后定义了一个运行函数run(),用于执行目标检测。接着定义了一个加载模型的函数load_model(),用于加载训练好的模型。然后定义了一个detect()函数,用于读取图像并进行目标检测,并将检测结果在图像上进行标注显示。

在主函数中,调用了detect()函数来执行目标检测,并将检测结果显示在图像上。

整个程序的流程是:加载模型和数据集 -> 读取图像 -> 执行目标检测 -> 标注显示检测结果。

注意:程序中的路径和参数可以根据实际情况进行修改。

7.2 code\torch_utils.py

@contextmanager
def torch_distributed_zero_first(local_rank: int):
    """
    Decorator to make all processes in distributed training wait for each local_master to do something.
    """
    if local_rank not in [-1, 0]:
        dist.barrier(device_ids=[local_rank])
    yield
    if local_rank == 0:
        dist.barrier(device_ids=[0])


def date_modified(path=__file__):
    # return human-readable file modification date, i.e. '2021-3-26'
    t = datetime.datetime.fromtimestamp(Path(path).stat().st_mtime)
    return f'{t.year}-{t.month}-{t.day}'

这个程序文件是一个用于PyTorch的工具文件,主要包含了一些常用的函数和类。以下是该文件的主要内容:

  1. 导入了一些必要的库和模块,如torch、torchvision、datetime等。
  2. 定义了一些辅助函数和装饰器,如torch_distributed_zero_first、date_modified、git_describe等。
  3. 定义了一些模型相关的函数和类,如select_device、time_sync、profile、is_parallel等。
  4. 定义了一些模型操作相关的函数和类,如initialize_weights、find_modules、sparsity、prune等。
  5. 定义了一些模型评估和加载相关的函数和类,如model_info、load_classifier等。
  6. 定义了一些图像处理相关的函数和类,如scale_img、copy_attr等。
7.3 code\models\experimental.py

class CrossConv(nn.Module):
    # Cross Convolution Downsample
    def __init__(self, c1, c2, k=3, s=1, g=1, e=1.0, shortcut=False):
        # ch_in, ch_out, kernel, stride, groups, expansion, shortcut
        super().__init__()
        c_ = int(c2 * e)  # hidden channels
        self.cv1 = Conv(c1, c_, (1, k), (1, s))
        self.cv2 = Conv(c_, c2, (k, 1), (s, 1), g=g)
        self.add = shortcut and c1 == c2

    def forward(self, x):
        return x + self.cv2(self.cv1(x)) if self.add else self.cv2(self.cv1(x))


class Sum(nn.Module):
    # Weighted sum of 2 or more layers https://arxiv.org/abs/1911.09070
    def __init__(self, n, weight=False):  # n: number of inputs
        super().__init__()
        self.weight = weight  # apply weights boolean
        self.iter = range(n - 1)  # iter object
        if weight:
            self.w = nn.Parameter(-torch.arange(1.0, n) / 2, requires_grad=True)  # layer weights

    def forward(self, x):
        y = x[0]  # no weight
        if self.weight:
            w = torch.sigmoid(self.w) * 2
            for i in self.iter:
                y = y + x[i + 1] * w[i]
        else:
            for i in self.iter:
                y = y + x[i + 1]
        return y


class MixConv2d(nn.Module):
    # Mixed Depth-wise Conv https://arxiv.org/abs/1907.09595
    def __init__(self, c1, c2, k=(1, 3), s=1, equal_ch=True):  # ch_in, ch_out, kernel, stride, ch_strategy
        super().__init__()
        n = len(k)  # number of convolutions
        if equal_ch:  # equal c_ per group
            i = torch.linspace(0, n - 1E-6, c2).floor()  # c2 indices
            c_ = [(i == g).sum() for g in range(n)]  # intermediate channels
        else:  # equal weight.numel() per group
            b = [c2] + [0] * n
            a = np.eye(n + 1, n, k=-1)
            a -= np.roll(a, 1, axis=1)
            a *= np.array(k) ** 2
            a[0] = 1
            c_ = np.linalg.lstsq(a, b, rcond=None)[0].round()  # solve for equal weight indices, ax = b

        self.m = nn.ModuleList(
            [nn.Conv2d(c1, int(c_), k, s, k // 2, groups=math.gcd(c1, int(c_)), bias=False) for k, c_ in zip(k, c_)])
        self.bn = nn.BatchNorm2d(c2)
        self.act = nn.SiLU()

    def forward(self, x):
        return self.act(self.bn(torch.cat([m(x) for m in self.m], 1)))


class Ensemble(nn.ModuleList):
    # Ensemble of models
    def __init__(self):
        super().__init__()

    def forward(self, x, augment=False, profile=False, visualize=False):
        y = []
        for module in self:
            y.append(module(x, augment, profile, visualize)[0])
        # y = torch.stack(y).max(0)[0]  # max ensemble
        # y = torch.stack(y).mean(0)  # mean ensemble
        y = torch.cat(y, 1)  # nms ensemble
        return y, None  # inference, train output


def attempt_load(weights, map_location=None, inplace=True, fuse=True):
    from models.yolo import Detect, Model

    # Loads an ensemble of models weights=[a,b,c] or a single model weights=[a] or weights=a
    model = Ensemble()
    for w in weights if isinstance(weights, list) else [weights]:
        ckpt = torch.load(attempt_download(w), map_location=map_location)  # load
        if fuse:
            model.append(ckpt['ema' if ckpt.get('ema') else 'model'].float().fuse().eval())  # FP32 model
        else:
            model.append(ckpt['ema' if ckpt.get('ema') else 'model'].float().eval())  # without layer fuse

    # Compatibility updates
    for m in model.modules():
        if type(m) in [nn.Hardswish, nn.LeakyReLU, nn.ReLU, nn.ReLU6, nn.SiLU, Detect, Model]:
            m.inplace = inplace  # pytorch 1.7.0 compatibility
            if type(m) is Detect:
                if not isinstance(m.anchor_grid, list):  # new Detect Layer compatibility
                    delattr(m, 'anchor_grid')
                    setattr(m, 'anchor_grid', [torch.zeros(1)] * m.nl)
        elif type(m) is Conv:
            m._non_persistent_buffers_set = set()  # pytorch 1.6.0 compatibility

    if len(model) == 1:
        return model[-1]  # return model
    else:
        print(f'Ensemble created with {weights}\n')
        for k in ['names']:
            setattr(model, k, getattr(model[-1], k))
        model.stride = model[torch.argmax(torch.tensor([m.stride.max() for m in model])).int()].stride  # max stride
        return model  # return ensemble

这个程序文件是一个实验性模块的代码。它包含了一些用于实验的模型和函数。

该文件定义了以下几个类和函数:

  1. CrossConv类:交叉卷积下采样。它接受输入通道数和输出通道数,并通过两个卷积层实现下采样操作。

  2. Sum类:多个层的加权和。它接受多个输入,并可以选择是否对输入进行加权求和。

  3. MixConv2d类:混合深度卷积。它接受输入通道数和输出通道数,并通过多个卷积层实现混合深度卷积操作。

  4. Ensemble类:模型集合。它是一个模型列表,可以将多个模型组合在一起。

  5. attempt_load函数:加载模型权重。它接受一个或多个模型权重文件路径,并返回一个模型或模型集合。

这个程序文件是YOLOv5的一部分,用于实现一些实验性的模块和函数。

7.4 code\models\tf.py
class YOLOv5:
    def __init__(self, weights):
        self.weights = weights
        self.model = self._build_model()

    def _build_model(self):
        # Load the weights
        model = ...
        return model

    def detect(self, image):
        # Perform object detection on the input image
        detections = ...
        return detections

这是一个使用TensorFlow和Keras实现的YOLOv5模型的程序文件。它包含了YOLOv5模型的各个组件,如卷积层、批归一化层、激活函数等。该文件还包含了模型的导出和使用方法的示例代码。

8.系统整体结构

根据以上分析,该程序的整体功能是实现目标检测算法YOLOv5,并提供了一些辅助工具和接口。它的构架包括了以下几个主要部分:

  1. 主程序部分:包括code\main.py和code\Interface.py,用于加载模型和数据集,并执行目标检测的接口。

  2. 模型部分:包括code\models\common.py、code\models\experimental.py、code\models\tf.py、code\models\yolo.py和code\models_init_.py,定义了YOLOv5模型的各个组件和实现。

  3. 工具部分:包括code\tools目录下的各个文件,提供了一些辅助工具和函数,如数据处理、模型评估、日志记录等。

  4. 实用工具部分:包括code\utils目录下的各个文件,提供了一些实用工具和函数,如数据处理、模型评估、日志记录等。

下面是每个文件的功能整理:

文件路径 功能
code\example.py YOLOv5目标检测示例代码
code\Interface.py 目标检测接口
code\ui.py 主程序入口
code\torch_utils.py PyTorch工具文件
code\train.py 模型训练脚本
code\models\common.py YOLOv5模型的常用模块和函数
code\models\experimental.py 实验性模块和函数
code\models\tf.py 使用TensorFlow和Keras实现的YOLOv5模型
code\models\yolo.py YOLOv5模型的定义和实现
code\models_init_.py 模型初始化文件
code\tools\activations.py 激活函数相关工具函数
code\tools\augmentations.py 数据增强相关工具函数
code\tools\autoanchor.py 自动锚框相关工具函数
code\tools\autobatch.py 自动批处理相关工具函数
code\tools\callbacks.py 回调函数相关工具函数
code\tools\datasets.py 数据集相关工具函数
code\tools\downloads.py 下载相关工具函数
code\tools\general.py 通用工具函数
code\tools\loss.py 损失函数相关工具函数
code\tools\metrics.py 评估指标相关工具函数
code\tools\plots.py 绘图相关工具函数
code\tools\torch_utils.py PyTorch工具函数
code\tools_init_.py 工具初始化文件
code\tools\aws\resume.py AWS相关工具函数
code\tools\aws_init_.py AWS工具初始化文件
code\tools\flask_rest_api\example_request.py Flask REST API示例请求
code\tools\flask_rest_api\restapi.py Flask REST API接口
code\tools\loggers_init_.py 日志记录器初始化文件
code\tools\loggers\wandb\log_dataset.py WandB日志记录器的数据集日志
code\tools\loggers\wandb\sweep.py WandB日志记录器的超参数搜索
code\tools\loggers\wandb\wandb_utils.py WandB日志记录器的工具函数
code\tools\loggers\wandb_init_.py WandB日志记录器初始化文件
code\utils\activations.py 激活函数相关实用函数
code\utils\augmentations.py 数据增强相关实用函数
code\utils\autoanchor.py 自动锚框相关实用函数
code\utils\autobatch.py 自动批处理相关实用函数
code\utils\callbacks.py 回调函数相关实用函数
code\utils\datasets.py 数据集相关实用函数
code\utils\downloads.py 下载相关实用函数
code\utils\general.py 通用实用函数
code\utils\loss.py 损失函数相关实用函数
code\utils\metrics.py 评估指标相关实用函数
code\utils\plots.py 绘图相关实用函数
code\utils\torch_utils.py PyTorch实用函数
code\utils_init_.py 实用工具初始化文件
code\utils\aws\resume.py AWS相关实用函数
code\utils\aws_init_.py AWS实用工具初始化文件
code\utils\flask_rest_api\example_request.py Flask REST API示例请求
code\utils\flask_rest_api\restapi.py Flask REST API接口
code\utils\loggers_init_.py 日志记录器初始化文件
code\utils\loggers\wandb\log_dataset.py WandB日志记录器的数据集日志
code\utils\loggers\wandb\sweep.py WandB日志记录器的超参数搜索
code\utils\loggers\wandb\wandb_utils.py WandB日志记录器的工具函数
code\utils\loggers\wandb_init_.py WandB日志记录器初始化文件

请注意,这只是对每个文件的功能进行了初步的概括,具体的实现细节可能需要参考第九节中每个文件的代码。

9.系统整合

下图完整源码&环境部署视频教程&自定义UI界面
在这里插入图片描述

参考博客《基于YOLOv5&opencv的交通道路三角锥检测系统(部署教程&源码)》

10.参考文献


[1]王莉,何牧天,徐硕,等.基于YOLOv5s网络的垃圾分类和检测[J].包装工程.2021,(8).DOI:10.19554/j.cnki.1001-3563.2021.08.007.
[2]龙燕,李南南,高研,等.基于改进FCOS网络的自然环境下苹果检测[J].农业工程学报.2021,(12).DOI:10.11975/j.issn.1002-6819.2021.12.035http://www.tcsae.org.
[3]徐守坤,倪楚涵,吉晨晨,等.基于YOLOv3的施工场景安全帽佩戴的图像描述[J].计算机科学.2020,(8).DOI:10.11896/jsjkx.190600109.
[4]李涛,张代胜,张飞,等.基于改进YOLO算法的FSAC赛车实时目标检测系统[J].合肥工业大学学报(自然科学版).2020,(9).DOI:10.3969/j.issn.1003-5060.2020.09.001.
[5]黄剑华,丁建睿,刘家锋,等.基于局部加权的Citation-kNN算法[J].电子与信息学报.2013,(3).DOI:10.3724/SP.J.1146.2012.00016.
[6]许伟,熊卫华,姚杰,等.基于改进YOLOv3算法在垃圾检测上的应用[J].光电子.激光.2020,(9).DOI:10.16136/j.joel.2020.09.0142.
[7]尹昱航.基于特征融合的交通场景目标检测方法研究[D].2021.
[8]高照.基于深度学习的遥感图像目标检测方法研究[D].2020.
[9]王小龙.基于深度学习的目标检测与跟踪技术研究及应用[D].2020.
[10]张凯.无人驾驶电动方程式赛车环境感知算法研究[D].2021.

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

基于YOLOv5&opencv的交通道路三角锥检测系统(部署教程&源码) 的相关文章

  • 深度估计的准确性 - 立体视觉

    我正在研究立体视觉 我对这个问题的深度估计的准确性感兴趣 这取决于几个因素 例如 适当的立体校准 旋转 平移和失真提取 图像分辨率 相机和镜头质量 失真越小 色彩捕捉正确 两个图像之间的匹配特征 假设我们没有低成本的相机和镜头 没有廉价的网
  • 开放简历fisherfaces

    我有这个问题 当我使用 vs2010 调试 opencv 2 4 0 facetec demo c 运行时 程序出现此错误 OpenCV错误 未知函数中图像步长错误 矩阵不连续 因此其行数无法更改 文件 src opencv modul e
  • 如何使用 AdaBoost 进行特征选择?

    我想使用 AdaBoost 从大量 100k 中选择一组好的特征 AdaBoost 的工作原理是迭代功能集并根据功能的执行情况添加功能 它选择对现有特征集错误分类的样本表现良好的特征 我目前正在 Open CV 中使用CvBoost 我得到
  • 如何加速 svm.predict?

    我正在编写一个滑动窗口来提取特征并将其输入到 CvSVM 的预测函数中 然而 我偶然发现 svm predict 函数相对较慢 基本上 窗口以固定的步幅长度在图像比例上滑动穿过图像 遍历图像加上提取每个图像特征的速度 窗口大约需要 1000
  • 在骨架图像中查找线 OpenCV python

    我有以下图片 我想找到一些线来进行一些计算 平均长度等 我尝试使用HoughLinesP 但它找不到线 我能怎么做 这是我的代码 sk skeleton mask rows cols sk shape imgOut np zeros row
  • 使用 OpenCV 进行相机校准 - 如何调整棋盘方块大小?

    我正在使用 OpenCV Python 示例开发相机校准程序 来自 OpenCV 教程 http opencv python tutroals readthedocs io en latest py tutorials py calib3d
  • java.lang.UnsatisfiedLinkError:java.library.path中没有opencv_java2411

    我正在尝试将 opencv 添加到我的 Spring Boot Maven 项目中 为了使用 opencv 库 我必须在 java library path 中提供本机库 我已将以下命令添加到 Eclipse VM 参数中 Djava li
  • 在Python中从整个图像中检测表格部分

    我有一张尺寸为 3500x5000 的图像 现在我只想检测整个图像中的表格部分 如果不能直接进行 OCR 处理 则对其进行裁剪和旋转 经过所有搜索后 我想到了使用裁剪图像中的每个单元格的想法https medium com coinmonk
  • 相机校准:如何正确进行

    我正在尝试使用棋盘格通过众所周知的张氏方法进行校准 然后进行捆绑调整 该方法在 Matlab 和 OpenCV 中都可用 有很多经验指南 但从我个人的经验来看 准确性是相当随机的 它有时可能非常好 但有时也可能非常糟糕 实际上 只需将棋盘放
  • Opencv 对象检测:ORB GPU 检测器和 SURF GPU 描述符提取器

    我只是做了一个小实验来尝试不同的检测器 描述符组合 我的代码使用 ORB GPU 检测器来检测特征 并使用 SURF GPU 描述符来计算描述符 我使用 BruteForceMatcher GPU 来匹配描述符 并使用 knnMatch 方
  • 车辆分割和跟踪

    我已经从事一个项目一段时间了 目的是在无人机捕获的视频中检测和跟踪 移动 车辆 目前我正在使用 SVM 该 SVM 接受了从车辆和背景图像中提取的局部特征的特征袋表示的训练 然后 我使用滑动窗口检测方法来尝试定位图像中的车辆 然后我想要跟踪
  • opencv不失真图像有一个奇怪的圆圈

    我尝试使用 opencv 针孔模型来计算校准参数 然后使图像不失真 问题是 未失真的图像中有一个奇怪的圆圈 如下所示 代码 原始图像和结果图像是here https github com wennycooper A004 pinhole 任
  • 使用“const cv::Mat &”、“cv::Mat &”、“cv::Mat”或“const cv::Mat”作为函数参数的区别?

    我已经彻底搜索过 但没有找到一个简单的答案 传递 opencv 矩阵 cv Mat 作为函数的参数 我们传递一个智能指针 我们对函数内部的输入矩阵所做的任何更改也会改变函数范围之外的矩阵 我读到 通过将矩阵作为 const 引用传递 它不会
  • 使用 OpenCV 描述符与 findFundamentalMat 匹配

    我之前发布了有关同一程序的问题 但没有收到答案 我已经纠正了当时遇到的问题 但又面临新的问题 基本上 我使用未校准的方法自动校正立体图像对的旋转和平移 我使用 SURF 等特征检测算法来查找两个图像 左右立体图像对 中的点 然后再次使用 S
  • opencv cmake安装的python包路径错误

    我一直在尝试遵循 opencv 安装步骤pyimagesearch com http www pyimagesearch com 2015 06 15 install opencv 3 0 and python 2 7 on osx 与虚拟
  • OpenCV warpPerspective 性能缓慢

    在我的应用程序中 我跟踪一个物体 到达它的地方corners都在这个框架中 我发现它之间的单应性corners从最后一帧开始和 当前帧 使用单应性来做perspectiveTransform on the corners在当前帧中找到 得到
  • Opencv中内存Mat表示

    我知道在内存中opencv将Mat对象表示为一个大数组 因此 如果我有 3 个尺寸为 200x200 的通道垫 那么在内存中它将将该垫存储在尺寸为 3x200x200 的数组中 或者更一般地说 内存中的任何 Mat 都将存储为channel
  • Opencv - Features2D + 单应性不正确的结果

    我在将检测到的物体的轮廓放置在正确的位置时遇到了一些问题 就好像坐标位于错误的位置一样 我将粗麻布设置为 2000 并过滤了小于最小距离 3 倍的匹配 任何帮助 将不胜感激 运行匹配和单应性的结果 代码示例如下 public static
  • 如何在 OpenCV 中删除 mouseCallback

    在使用 C 的 OpenCV 中 有没有办法删除 mouseHandler int event int x int y int flags void param 通过函数添加到窗口 image window cv setMouseCallb
  • 如何使用 Python 3 在 OpenCV 3 上正确加载 cv2.KeyPoint 和描述符?

    有一天 我不得不恢复一个使用 OpenCV 3 和 Python 2 7 的旧项目 在此代码中 要加载 cv2 KeyPoint 我执行以下操作 import numpy as np import cPickle import cv2 ke

随机推荐

  • Spring 中的Advice类型介绍

    Spring 中的 Advice 类型介绍 翻译原文链接 Introduction to Advice Types in Spring 1 概述 在本文中 我们将讨论可以在 Spring 中创建的不同类型的 AOP 通知 In this a
  • javaweb:监听域对象创建和销毁的Listener

    1 什么是Servlet监听器 先来看看什么是监听器 监听器是专门用于对其它对象身上发生的事件或状态改变进行监听和相应处理的对象 当被监视的对象发生情况时立即采取相应的行动 Servlet监听器是Servlet规范中定义的一种特殊类 它用于
  • ubuntu安装code

    进入链接 http code visualstudio com下载 deb 在下载好的文件处终端输入sudo dpkg i code xxx
  • sklearn 数据处理与特征工程

    1 数据处理的流程 2 数据预处理 Preprocessing Impute 2 1 数据无量纲化 在机器学习算法实践中 我们往往有着将不同规格的数据转换到同一规格 或不同分布的数据转换到某个特定分布的需求 这种需求统称为将数据 无量纲化
  • java对list分组_Java List排序,分组等操作

    假定有一列实体类对像 List list UserServer getList 去重 去除重复对象 每个属性的值都一样的 需要注意的是要先重写对象User的equals和hashCode方法 List distinctList list s
  • 冒泡排序,快速排序,选择排序详细过程

    一 冒泡排序 1基本思想 相邻的两个数之间进行比较 按照规则进行交换 2 实现思路 以升序排列为例 第一趟比较 先用第一个和第二个元素进行比较 将较大的交换到第二个位置上 然后第二个和第三个进行比较 将较大的放在第三个位置上 依次类推 第一
  • 宝藏软件Obsidian知识体系搭建,免费的多端云同步

    宝藏软件Obsidian知识体系搭建 免费的多端云同步 为什么推荐Obsidian 人很奇怪 在关注短期目标的时候 会有成功失败之说 但是如果关注体系呢 就不那么会在乎短期收益了 为什么呢 因为体系可能会创造强大的滚雪球效应 使用笔记软件颇
  • Blender设置相机围绕物体旋转

    以下内容参考视频 https www bilibili com video BV1X7411g75c 1 首先随便添加一个物体 选中摄像机 位置 旋转归零 缩放归一 这一步不能少 快捷键 位置归零 Alt G 旋转归零 Alt R 缩放归一
  • C语言创建多线程

    线程是计算机中独立运行的最小单位 每个线程占用的CPU时间是由系统分配的 因此可以把线程看成操作系统分配CPU时间的基本单位 每个线程只有在系统分配给它的时间片内才能取得CPU控制权 执行线程中的代码 Linux操作系统在一个进程内生成多个
  • multipart/form-data (一种POST 数据提交的方式)

    一 初识multipart form data enctype属性 enctype 规定了form表单在发送到服务器时候编码方式 它有如下的三个值 application x www form urlencoded 默认的编码方式 但是在用
  • 解决数字字母不换行的问题

    当在标签中输入的是字母和数字的时候 会出现不换行的情况 导致内容不能显示完整 给p标签或者父标签div增加一下属性 text word break break all container word break break all 实现数字和
  • 博客摘录「 mysql char,mysql to_char」2023年6月12日

    场景 mysql 相仿to char to date 函数mysql 类似to char to date 函数mysql日期和字符相互转换方法date format date Y m d gt oracle中的to char str to
  • 文件没保存怎么恢复?3种方法恢复未保存office文档

    是否遇到过Excel Word或者PPT程序由于电脑断电 崩溃导致没有及时保存文档 如何恢复未保存的office文档文件 本文中提供了3种方法 用以帮助用户了解如何恢复未保存的office文档 以Word为例 数据蛙为大家图文介绍每种办法的
  • spring提前加载,懒加载,bean的作用域和注入注解讲解

    前言 sping知识随笔笔记 spring提前加载 懒加载 bean的作用域和注入注解讲解 spring提前加载 懒加载 bean的作用域和注入注解讲解 前言 1 depends on 2 bean的作用域 3 lazy init 懒加载
  • Spring Boot事务配置管理

    Spring Boot事务配置管理 场景 我们在开发企业应用时 由于数据操作在顺序执行的过程中 线上可能有各种无法预知的问题 任何一步操作都有可能发生异常 异常则会导致后续的操作无法完成 此时由于业务逻辑并未正确的完 成 所以在之前操作过数
  • HJ32 密码截取

    题目 HJ32 密码截取 题解 暴力截取所有子串 利用双指针判断子串是否为回文串 获取最大长度回文串 public int interceptPassword String password int maxLength 100 for in
  • vue 单页面(SPA) ,IOS端页面跳转后调用微信jssdk 时报错: "invalid signature"的解决方案

    背景 1 JS接口安全域名 OK 2 Android手机 微信开发者工具 测试分享都没问题 问题 在IOS手机微信端 从A页面 http a com A 跳转到B页面 http a com B 后 B页面进行分享时就会报签名 invalid
  • div让两个按钮并排显示在一行中

    做微信小程序 查了一些方法 对于我来说都不适用 有各种各样的问题 下面的这个试了 可以 wxml语法
  • java android小程序_java和android一些小程序

    Java 和 android 的一些小程序 1 给定字符串 String str a b c g b h l b h r v 剔除重 复的 并统计出之后其个数 public class zhaoshu1 构造遍历字符串及将重复出现的字符置空
  • 基于YOLOv5&opencv的交通道路三角锥检测系统(部署教程&源码)

    1 研究背景与意义 随着城市化进程的加快和交通流量的不断增加 交通安全问题成为了一个日益突出的社会问题 其中 交通道路上的三角锥是一种常见的交通安全设施 用于标记道路施工 交通事故现场 道路封闭等情况 然而 由于道路规模庞大 人力资源有限