计算机视觉 | 人工智能 自己总结 (下)

news/2024/3/29 17:28:02/文章来源:https://blog.csdn.net/lijiamingccc/article/details/130325330

目录

  • 立体视觉
    • 立体视觉的概念
    • 视差信息的概念
    • 立体匹配
    • 目标检测和跟踪
    • 三维重建
    • 立体图像拼接

立体视觉

立体视觉的概念

立体视觉是指人类双眼所产生的深度感觉,也称为立体感或深度感。它是由于两只眼睛分别观察到同一物体的微小差异而产生的。

当两只眼睛看到同一物体时,它们分别从不同的角度观察该物体。这些微小的视角差异导致我们的大脑能够计算出物体的深度和距离,从而产生立体感。

立体视觉也是一种计算机视觉技术,其目的是从两幅或两幅以上的图像中推理出图像中每个像素的深度信息

视差信息的概念

在立体视觉中,视差是指两个视点(即左右摄像机)观察同一场景时,同一个空间点在两个图像上对应像素的水平位置之间的差值。视差信息就是通过比较两个图像中对应像素之间的水平位置差异,计算出每个像素点的视差值。

视差信息是立体视觉的重要信息,因为它可以用来计算像素点的深度或距离,从而实现三维场景的重建、物体的检测与跟踪等。在立体视觉中,一般会将左右两个视点的图像分别称为左图和右图,通过匹配左右图像中对应像素的位置,得到每个像素点的视差信息
视差值越大,表示该像素点距离摄像机越近;
视差值越小,表示该像素点距离摄像机越远。

视差信息的获取需要对左右两个视点的图像进行配准和匹配,通常会使用立体匹配算法来实现。
立体匹配算法的目标就是找到左右两个视点中对应像素之间的匹配关系,从而计算出视差信息。

立体匹配

概念:OpenCV提供了一些立体匹配算法,例如Semi-Global Block Matching(SGBM)和StereoSGBM算法,可以计算两张图片之间的视差,从而计算出物体的深度信息。

使用opencv实现立体视觉的示例代码:

import cv2# 读入左右两张图像
img_left = cv2.imread('left.png')
img_right = cv2.imread('right.png')# 转为灰度图像
gray_left = cv2.cvtColor(img_left, cv2.COLOR_BGR2GRAY)
gray_right = cv2.cvtColor(img_right, cv2.COLOR_BGR2GRAY)# 定义SGBM算法参数
stereo = cv2.StereoSGBM_create(numDisparities=16, blockSize=15)# 计算视差图
disparity = stereo.compute(gray_left, gray_right)# 显示视差图
cv2.imshow('Disparity Map', disparity)
cv2.waitKey(0)
cv2.destroyAllWindows()

在上述示例代码中,我们使用OpenCV的StereoSGBM_create函数创建了一个SGBM算法对象,并传入了numDisparities和blockSize两个参数。然后,我们使用该算法对象计算了左右两张灰度图像的视差图,并使用cv2.imshow函数显示了结果。需要注意的是,在实际使用中,我们通常会对算法参数进行调整以获取更好的匹配结果

目标检测和跟踪

目标检测和跟踪是计算机视觉领域中的重要研究方向,它们可以帮助计算机理解并处理图像或视频中的目标物体信息。

目标检测可以被视为一种分类问题,它的任务是在图像或视频中检测出特定类别的物体,并用边框框定它们的位置。常用的目标检测算法包括 Haar 级联分类器、基于深度学习的 Faster R-CNN、YOLO等。

跟踪算法则是基于目标检测结果的基础上,追踪物体在图像或视频中的位置,使得在物体移动或者遮挡的情况下,依然能够准确地追踪物体。常用的跟踪算法包括卡尔曼滤波、mean-shift 算法、correlation filters 算法等。

在 OpenCV 中,目标检测和跟踪都可以很方便地实现。下面是一个简单的示例代码,演示如何使用 OpenCV 中的 Haar 级联分类器来实现人脸检测,并使用追踪算法跟踪人脸运动轨迹:

import cv2# 加载 Haar 级联分类器
face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')# 初始化追踪器
tracker = cv2.TrackerCSRT_create()# 打开视频
cap = cv2.VideoCapture(0)# 读取第一帧图像
ret, frame = cap.read()# 进行人脸检测
faces = face_cascade.detectMultiScale(frame, scaleFactor=1.3, minNeighbors=5)# 对第一个人脸进行跟踪
if len(faces) > 0:x, y, w, h = faces[0]bbox = (x, y, w, h)tracker.init(frame, bbox)while True:# 读取一帧图像ret, frame = cap.read()# 进行跟踪success, bbox = tracker.update(frame)# 根据跟踪结果绘制矩形框if success:x, y, w, h = [int(i) for i in bbox]cv2.rectangle(frame, (x, y), (x + w, y + h), (0, 255, 0), 2, 1)else:cv2.putText(frame, "Lost", (100, 80), cv2.FONT_HERSHEY_SIMPLEX, 0.75, (0, 0, 255), 2)# 显示结果cv2.imshow('frame', frame)if cv2.waitKey(1) & 0xFF == ord('q'):break# 释放资源
cap.release()
cv2.destroyAllWindows()

在该示例代码中,我们首先加载 Haar 级联分类器目标检测和跟踪是计算机视觉中的重要应用,其可以识别图像或视频中的目标,并对其进行跟踪和定位。其中,目标检测通常被定义为在图像或视频中检测出特定类别的目标,而目标跟踪则是在一个视频序列中跟踪一个物体的位置。

在OpenCV中,目标检测和跟踪通常是通过使用预训练的深度学习模型实现的。常见的模型包括基于单阶段的目标检测算法(例如YOLO和SSD)和基于两阶段的目标检测算法(例如Faster R-CNN和Mask R-CNN)。

以下是一个基于OpenCV和YOLOv3的目标检测示例代码:

import cv2# 加载YOLOv3模型
net = cv2.dnn.readNetFromDarknet('yolov3.cfg', 'yolov3.weights')
classes = []
with open('coco.names', 'r') as f:classes = [line.strip() for line in f.readlines()]
layer_names = net.getLayerNames()
output_layers = [layer_names[i[0] - 1] for i in net.getUnconnectedOutLayers()]# 读取图像
img = cv2.imread('test.jpg')# 获取图像宽高和通道数
height, width, channels = img.shape# 对图像进行预处理
blob = cv2.dnn.blobFromImage(img, 0.00392, (416, 416), (0, 0, 0), True, crop=False)# 输入预处理后的图像到网络中进行前向传播
net.setInput(blob)
outs = net.forward(output_layers)# 解析网络输出,筛选出置信度高于0.5的检测结果
class_ids = []
confidences = []
boxes = []
for out in outs:for detection in out:scores = detection[5:]class_id = np.argmax(scores)confidence = scores[class_id]if confidence > 0.5:center_x = int(detection[0] * width)center_y = int(detection[1] * height)w = int(detection[2] * width)h = int(detection[3] * height)x = int(center_x - w / 2)y = int(center_y - h / 2)boxes.append([x, y, w, h])confidences.append(float(confidence))class_ids.append(class_id)# 使用非极大值抑制去除重叠框
indexes = cv2.dnn.NMSBoxes(boxes, confidences, 0.5, 0.4)# 在图像上绘制检测结果
font = cv2.FONT_HERSHEY_SIMPLEX
for i in range(len(boxes)):if i in indexes:x, y, w, h = boxes[i]label = classes[class_ids[i]]confidence = confidences[i]color = (0, 255, 0)cv2.rectangle(img, (x, y), (x + w, y + h), color, 2)cv2.putText(img, '{} {:.2f}'.format(label, confidence), (x, y - 5), font, 0.5, color, 1)# 显示图像
cv2.imshow('Image', img)
cv2.waitKey(0)
cv2.destroyAllWindows()

三维重建

三维重建是指将二维图像或点云数据转化为三维模型的过程。在计算机视觉领域,三维重建有着广泛的应用,如建筑、地图制作、文物修复等。

三维重建可以通过多种方式实现,如利用三角测量法,使用相机标定和立体匹配技术获取深度信息,利用光线投射法和点云数据生成三维模型等。其中,利用相机标定和立体匹配技术进行三维重建的方法被广泛应用。

opencv中的代码实现:

import cv2
import numpy as np# 读入左右两张图像
img_left = cv2.imread('left.png')
img_right = cv2.imread('right.png')# 转为灰度图像
gray_left = cv2.cvtColor(img_left, cv2.COLOR_BGR2GRAY)
gray_right = cv2.cvtColor(img_right, cv2.COLOR_BGR2GRAY)# 定义SGBM算法参数
stereo = cv2.StereoSGBM_create(numDisparities=16, blockSize=15)# 计算视差图
disparity = stereo.compute(gray_left, gray_right)# 计算深度图
depth = cv2.convertScaleAbs(disparity, alpha=0.1)# 根据内参和外参计算投影矩阵
K = np.array([[fx, 0, cx], [0, fy, cy], [0, 0, 1]])
R = np.array([[r11, r12, r13], [r21, r22, r23], [r31, r32, r33]])
t = np.array([[tx], [ty], [tz]])
P_left = np.dot(K, np.hstack((R, t)))# 构建点云
points = []
for v in range(height):for u in range(width):# 计算点的三维坐标x = (u - cx) * depth[v, u] / fxy = (v - cy) * depth[v, u] / fyz = depth[v, u]# 投影到左相机坐标系p = np.dot(R.T, np.array([[x], [y], [z]] - t))points.append(p)# 将点云转为numpy数组并保存为ply文件
points = np.array(points)
ply_header = 'ply\nformat ascii 1.0\nelement vertex %d\nproperty float x\nproperty float y\nproperty float z\nend_header\n' % len(points)
np.savetxt('point_cloud.ply', points, header=ply_header, comments='')

立体图像拼接

立体图像拼接是将两个或多个不同视角拍摄的图像拼接成一幅立体图像的过程。立体图像拼接可以用于创建更加逼真的三维场景,同时也可以用于医学影像处理和机器人视觉等领域。

立体图像拼接的主要步骤包括相机标定、立体匹配和图像融合。相机标定用于确定相机内外参数,立体匹配用于计算两个相机之间的视差信息,而图像融合则是将两个图像融合为一幅立体图像。

opencv中的代码实现:

import cv2
import numpy as np# 读入左右两张图像
img_left = cv2.imread('left.png')
img_right = cv2.imread('right.png')# 转为灰度图像
gray_left = cv2.cvtColor(img_left, cv2.COLOR_BGR2GRAY)
gray_right = cv2.cvtColor(img_right, cv2.COLOR_BGR2GRAY)# 定义SGBM算法参数
stereo = cv2.StereoSGBM_create(numDisparities=16, blockSize=15)# 计算视差图
disparity = stereo.compute(gray_left, gray_right)# 计算视差映射
map_left, map_right = cv2.initUndistortRectifyMap(K_left, D_left, R_left, P_left, (width, height), cv2.CV_16SC2)
disparity_map = cv2.remap(disparity, map_left, map_right, cv2.INTER_LINEAR)# 根据视差映射拼接图像
img_out = np.zeros_like(img_left)
for v in range(height):for u in range(width):# 计算右图像素坐标x = u - disparity_map[v, u]y = v# 判断像素坐标是否在右图像范围内if x >= 0 and x < width:# 将左右像素拼接到输出图像中img_out[y, u] = img_left[y, u]img_out[y, x] = img_right[y, x]# 显示结果图像
cv2.imshow('Stereo Image', img_out)
cv2.waitKey(0)

在上述示例代码中,我们首先使用OpenCV的StereoSGBM_create函数计算了左右两张灰度图像的视差图,并使用相机的内参和外参计算了视差映射。然后,我们根据视差映射将左右图像拼接到一起,得到了立体图像。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_102890.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SQLServer:Win/Linux环境安装及一键部署脚本

1. Win安装SQLServer CSDN已有完整安装流程&#xff0c;亲测可用。----》Windows安装SQLServer流程 2. Linux安装 SQLServer 2.1 设置镜像 curl https://packages.microsoft.com/config/rhel/7/mssql-server-2017.repo > /etc/yum.repos.d/mssql-server.repo 2.2 通过y…

深度学习模型参数量与训练数据量的平衡对泛化性能的影响

一、引言 深度学习模型在计算机视觉、自然语言处理等领域取得了显著的成果。为了获得泛化性能良好的模型&#xff0c;研究者需要在模型复杂度和训练数据量之间找到合适的平衡。本文将探讨这两者之间的关系以及如何在实际应用中实现最佳效果。 二、模型复杂度与训练数据量的关…

史上最严宝宝口粮新国标出台,DHA和维生素D可能无需额外补充了

自2023年2月22日起&#xff0c;我国婴幼儿配方食品&#xff08;以下简称配方奶&#xff09;新国标开始实施。这意味着2023年2月22日以后在中国上架销售的配方奶必须符合新国标&#xff0c;重新取得国家市场监督管理总局食品评审中心&#xff08;CFE-SAMR&#xff09;的注册。这…

改变思想,拥抱毒瘤,让公司走的更远

牛B的人物&#xff0c;早已经厌倦了中英文混杂&#xff0c;他们更进一步&#xff0c;使用中英文缩写&#xff0c;对普通人进行降维打击。更厉害的&#xff0c;造就新的名词&#xff0c;并科普出去。 有几项技术&#xff0c;我从心底里鄙视和厌恶&#xff0c;但每次在技术方案中…

【MCAL_Uart】-1.1-图文详解Uart串口协议

目录 1 什么是UART 2 UART的电平 3 UART的波特率 4 UART帧格式 4.1 start bit起始位 4.2 data bit数据位 4.3 parity bit奇偶校验位 4.4 stop bit停止位 5 什么是8-N-1 6 UART总线负载率计算 结尾 优质博文推荐阅读&#xff08;单击下方链接&#xff0c;即可跳转&am…

Linux驱动之在Ubuntu下编译驱动模块——学习笔记(12)

为了方便驱动开发学习&#xff0c;了解一下在Ubuntu上进行驱动编译的流程。 一、下载对应的内核源码 首先要通过 uname -a查询一下自己的内核版本。 我这里下载的是 https://mirrors.edge.kernel.org/pub/linux/kernel/v5.x/linux-5.4.tar.gz 二、编译内核 &#xff08;1&a…

功能安全ISO26262 道路车辆 功能安全审核及评估方法第3部分:软件层面

道路车辆 功能安全审核及评估方法 第3部分&#xff1a;软件层面 Road vehicles - Functional Safety Audit and Assessment Method - Part 3: Software Level &#xff08;工作组草案&#xff09; 2022.4.15 前  言 本文件按照GB/T 1.1—2020《标准化工作导则 第1部分…

Pytorch深度学习笔记(十)多分类问题

课程推荐&#xff1a;09.多分类问题_哔哩哔哩_bilibili 目录 1. 多分类模型 2. softmax函数模型 3. Loss损失函数 4.实战MNIST Dataset 之前&#xff0c;在逻辑斯蒂回归中我们提到了二分类任务&#xff0c;现在我们讨论多分类问题。 1. 多分类模型 与二分类不同的是多分…

Hive基础和使用详解

文章目录 一、启动hive1. hive启动的前置条件2. 启动方式一: hive命令3. 方式二:使用jdbc连接hive 二、Hive常用交互命令1. hive -help 命令2. hive -e 命令3. hive -f 命令4. 退出hive窗口5. 在hive窗口中执行dfs -ls /&#xff1b; 三、Hive语法1.DDL语句1.1 创建数据库1.2 两…

Redis 数据存储原理

核心模块如图 1-10。 图1-10 图 1-10 Client 客户端&#xff0c;官方提供了 C 语言开发的客户端&#xff0c;可以发送命令&#xff0c;性能分析和测试等。 网络层事件驱动模型&#xff0c;基于 I/O 多路复用&#xff0c;封装了一个短小精悍的高性能 ae 库&#xff0c;全称是 …

【人工智能】遗传算法

人工智能算法---遗传算法&#xff08;基础篇&#xff09; 知识导图&#xff1a;遗传算法&#xff08;概念&#xff09;1.初始化种群二进制编码与解码 2.选择操作3.交叉操作4.评估操作5.终止操作 知识导图&#xff1a; 遗传算法&#xff08;概念&#xff09; 可以把遗传算法类比…

Docker 快速入门

1、Docker 简介 Docker是一个开源的容器引擎&#xff0c;它可以帮助我们更快地交付应用。Docker可将应用程序和基础设施层隔离&#xff0c;并且能将基础设施当作程序一样进行管理。使用Docker&#xff0c;可更快地打包、测试以及部署应用程序&#xff0c;并可减少从编写到部署…

python的智能换行函数(一堆烦乱的判断)

def zntxt(txt):line30 #设置单行长度js,e,s,rs,aa,nm,x,y{},[],txt,[],,[],0,0n 1 if ord(s[0]) > 127 else 0for i in range(len(s)):m1 if ord(s[i]) > 127 else 0if m!n:rs.append(aa)aas[i]elif ilen(s)-1:aas[i]rs.append(aa)else:aas[i]nmfor i in rs: for j in…

搜索引擎找外贸客户

说起搜索引擎&#xff0c;我们每个人都不陌生&#xff0c;也许第一时间就能想到平日经常使用的“百度一下”和凭借强大算法及丰富功能占据近85%市场份额的谷歌搜索&#xff08;Statista 2023年1月数据&#xff09;这些耳熟能详的搜索引擎。对于外贸人而言搜索引擎也是非常实用的…

一文谈谈文心一言对比ChatGPT4.0的差距

对于想体验文心一言的朋友&#xff0c;可以进行申请尝试&#xff0c;快速入口 如果想体验ChatGPT的朋友&#xff0c;可以自行fq注册&#xff1b;但是由于现在限制注册并且不稳定&#xff0c;对于不会用梯子不想注册的朋友可以使用这个进行访问&#xff0c;快速入口 关于ChatG…

PMP证书备考攻略+PMP知识点汇总

一&#xff0c;考PMP好处多 1.能力提升 大型项目&#xff0c;领导专业团队 2.升职加薪 晋升管理岗&#xff0c;优先升职加薪 3.招投标加分 具有PMP证书&#xff0c;企业招标有加分 4.转型利器 助力转型&#xff0c;拓宽职业发展 5.公司支持 企业鼓励学习&#xff0c;报销费用 6…

C++模板使用

感谢你的阅读&#xff01;&#xff01;&#xff01; 目录 感谢你的阅读&#xff01;&#xff01;&#xff01; 举个例子&#xff1a; template 有什么意义为什么要用模板 与typedef的区别 使用方法 模板&#xff1a;隐式实例化与显示实例化 和非模板函数以及多个模板类…

气传导耳机和骨传导耳机的区别是啥?气传导耳机有哪些优缺点?

本文主要讲解一下气传导耳机和骨传导耳机的区别、气传导耳机的优缺点&#xff0c;并推荐一些目前主流的气传导耳机款式&#xff0c;大家可以根据自身需求&#xff0c;选择自己感兴趣的部分观看。 气传导耳机和骨传导耳机不同点&#xff1a; 气传导耳机和骨传导耳机最大且最根…

什么是 MVVM?MVVM和 MVC 有什么区别?什么又是 MVP ?

目录标题 一、什么是MVVM&#xff1f;二、MVC是什么&#xff1f;三、MVVM和MVC的区别&#xff1f;四、什么是MVP&#xff1f; 一、什么是MVVM&#xff1f; MVVM是 Model-View-ViewModel的缩写&#xff0c;即模型-视图-视图模型。MVVM 是一种设计思想。 模型&#xff08;Model…