从基础到人脸识别与目标检测

news2025/2/11 11:49:39

前言

从本文开始,我们将开始学习ROS机器视觉处理,刚开始先学习一部分外围的知识,为后续的人脸识别、目标跟踪和YOLOV5目标检测做准备工作。我采用的笔记本是联想拯救者游戏本,系统采用Ubuntu20.04,ROS采用noetic。

颜色编码格式,图像格式和视频压缩格式

(1)RGB和BGR:这是两种常见的颜色编码格式,分别代表了红、绿、蓝三原色。不同之处在于,RGB按照红、绿、蓝的顺序存储颜色信息,而BGR按照蓝、绿、红的顺序存储。

rgb8图像格式:常用于显示系统,如电视和计算机屏幕。
	RGB值以8 bits表示每种颜色,总共可以表示256×256×256=16777216种颜色。
	例如: (255,0,0) 表示红色,(0,255,0) 表示绿色,(0,0,255) 表示蓝色。
bgr8图像格式:由一些特定的硬件制造商采用,
	软件方面最著名的就是opencv,其默认使用BGR的颜色格式来处理图像。
	与RGB不同, (0,0,255) 在BGR中表示红色,(0,255,0) 仍然表示绿色,(255,0,0) 表示蓝色。

在自动驾驶里,使用rgb8图像格式的图像,一般称为原图,是数据量最大的格式,没有任何压缩。(2)(2)YUV:这是另一种颜色编码方法,与RGB模型不同的是,它将图像信息分解为亮度(Y)和色度(U和V)两部分。这种方式更接近于人类对颜色的感知方式。

Y:代表亮度信息,也就是灰阶值。
U:从色度信号中减去Y得到的蓝色信号的差异值。
V:从色度信号中减去Y得到的红色信号的差异值。

YUV颜色编码主要用在电视系统以及视频编解码标准中,在这些系统中,Y通道信息可以单独使用,这样黑白电视机也能接收和显示信号。而彩色信息则通过U和V两个通道传输,只有彩色电视机才能处理。这样设计兼容了黑白电视和彩色电视。YUV色彩空间相比RGB色彩空间,更加符合人眼对亮度和色彩的敏感度,在视频压缩时,可以按照人眼的敏感度对YUV数据进行压缩,以达到更高的压缩比。由于历史和技术的原因,YUV的标准存在多种,例如YUV 4:4:4、YUV 4:2:2和YUV 4:2:0等,这些主要是针对U和V通道的采样方式不同定义的。采样不同,对应的压缩比也不同。

(3)图像压缩格式

jpeg:Joint Photographic Experts Group,是一种常见的用于静态图像的损失性压缩格式,
	它特别适合于全彩色和灰度图片,被广泛使用。
	通常情况下,JPEG可以提供10:1到20:1的有损压缩比,根据图像质量自由调整。
png: Portable Network Graphics,PNG是一种无损压缩格式,主要使用了DEFLATE算法。
	由于这是无损压缩,所以解压缩图像可以完全恢复原始数据。
	被广泛应用于需要高质量图像的场景,如网页设计、艺术作品等。
bmp:Bitmap,BMP是Windows系统中常用的一种无压缩的位图图像格式,通常会创造出较大的文件。

位图(Bitmap)是一种常见的计算机图形,最小单位是像素,每个像素都包含一定量的信息,如颜色和亮度等。位图图像的一个主要特点就是,在放大查看时,可以看到图像的像素化现象,也就是我们常说的"马赛克"。BMP、JPEG、GIF、PNG等都是常见的位图格式。

(4)H264和H265:这是两个视频压缩格式,也是两种视频编解码标准。以1280*720的摄像头为例,如果是rgb8格式的原图,一帧图像的大小是:

3*1280*720=27648000字节,即2.7648MB

如果是一小时的视频,那将是非常大的数据量,对网络传输,数据存储,都是很大的压力。而H264通过种种帧间操作,可以达到10:1到50:1的压缩比,甚至更高。H265更进一步,压缩比更高,用来解决4K或8K视频的传输。

更具体的原理见:图像编码与 H264 基础知识在自动驾驶领域,图像数据也使用h264格式,主要用于数采和回放,控制数据量。

usb_cam

(1)linux针对摄像头硬件有一套Video for Linux内核驱动框架,对应提供的有命令行工具 v4l2-ctl (Video for Linux 2),可以查看摄像头硬件信息:

ls /dev/video0  //一般video0是笔记本自带摄像头设备文件
v4l2-ctl -d /dev/video0 --all

这里截取了部分关键信息,下面的usb_cam的launch文件将用到:

(2)usb_cam是ros里usb camera的软件包,一般称为ros摄像头驱动,但这是一个应用程序,其调用v4l2并通过ros topic发出图像数据。搞机器视觉,第一步就是要有图。安装并启动usb_cam,查看图像:

sudo apt-get install ros-noetic-usb-cam 
roslaunch usb_cam usb_cam-test.launch
rqt_image_view

usb_cam-test.launch:

<launch>
  <node name="usb_cam" pkg="usb_cam" type="usb_cam_node" output="screen" >
    //指定设备文件名,默认是/dev/video0
    <param name="video_device" value="/dev/video0" />
    // 宽和高分辨率	
    <param name="image_width" value="640" />
    <param name="image_height" value="480" />
    // 像素编码,可选值:mjpeg,yuyv,uyvy
    <param name="pixel_format" value="yuyv" />
    <param name="color_format" value="yuv422p" />
    // camera坐标系名
    <param name="camera_frame_id" value="usb_cam" />
    // IO通道,可选值:mmap,read,userptr,大数据量信息一般用mmap
    <param name="io_method" value="mmap"/>
  </node>
  <node name="image_view" pkg="image_view" type="image_view" respawn="false" output="screen">
  	// 指定发出的topic名:/usb_cam/image_raw
    <remap from="image" to="/usb_cam/image_raw"/>
    <param name="autosize" value="true" />
  </node>
</launch>

(3)/usb_cam/image_raw的数据结构体:

rostopic info /usb_cam/image_raw
rosmsg show  sensor_msgs/Image

//消息头,每个topic都有
std_msgs/Header header	
  uint32 seq
  time stamp
  // 坐标系名
  string frame_id
// 高和宽分辨率
uint32 height
uint32 width
// 无压缩的图像编码格式,包括rgb8,YUV444
string encoding
// 图像数据的大小端存储模式
uint8 is_bigendian
// 一行图像数据的字节数量,作为步长参数
uint32 step
// 存储图像数据的柔性数组,大小是step*height
uint8[] data

/usb_cam/image_raw内容展示:

(4)/usb_cam/image_raw/compressed的数据结构体:

rostopic info /usb_cam/image_raw/compressed
rosmsg show sensor_msgs/CompressedImage

std_msgs/Header header
  uint32 seq
  time stamp
  string frame_id
// 压缩的图像编码格式,jpeg,png
string format
uint8[] data

/usb_cam/image_raw/compressed内容展示:

摄像头标定

标定引入

(1)Calibration:翻译过来就是校准和标定。(2)摄像头标定:Camera Calibration是计算机视觉中的一种关键技术,其目的是确定摄像头的内部参数(Intrinsic Parameters)和外部参数(Extrinsic Parameters)。

内部参数:包括焦距、主点坐标以及镜头畸变等因素。
	这些参数与相机本身的硬件有关,如镜头和图像传感器等,一般由厂家提供。
外部参数:摄像头相对于环境的位置和方向。
	例如,它可能描述了一个固定摄像头相对于周围环境的姿态或者安装位置。
	以汽车为例,外参包括各个摄像头之间的关系,摄像头与radar,摄像头与lidar的关系。

(3)汽车各种传感器的之间的相对位置和朝向,用3自由度的旋转矩阵和3自由度的平移向量表示,这些外参由整车厂自己标。一般整车下线之后,进入特定的房间,使用静态标靶、定位器的等高精度设备,完成Camera、radar、Lidar等传感器的标定,称之为产线标定,也叫做下线标定。

笔记本摄像头内参标定

这里我们使用标定常用的标靶图形,完成笔记本摄像头的内参标定。usb_cam可以使用内参标定,避免图像畸变。(1)安装标定功能包(ubuntu20.04+noetic)

sudo apt-get install ros-noetic-camera-calibration

(2)创建 robot_vision 软件包,并标定相关文件

cd ~/catkin_ws/src
catkin_create_pkg robot_vision cv_bridge image_transport sensor_msgs std_msgs geometry_msgs message_generation roscpp rospy

cd robot_vision 
mkdir doc launch
touch launch/cameta_calibration.launch

标定靶图片:

cameta_calibration.launch:

<launch>
  // 使用usb_cam包,发出/usb_cam/image_raw图像数据
  <node name="usb_cam" pkg="usb_cam" type="usb_cam_node" output="screen" >
    <param name="video_device" value="/dev/video0" />
    <param name="image_width" value="640" />
    <param name="image_height" value="480" />
    <param name="pixel_format" value="yuyv" />
    <param name="camera_frame_id" value="usb_cam" />
    <param name="io_method" value="mmap"/>
  </node>
  // 使用标定功能包,完成标定。
  // 参数中,8x6表示横向8个内部角点,竖向有6个
  // square 是每个棋盘格的边长
  // /usb_cam/image_raw是监听的图像topic
  <node
      pkg="camera_calibration"
      type="cameracalibrator.py"
      name="camera_calibration"
      output="screen"
      args="--size 8x6 --square 0.024 image:=/usb_cam/image_raw camera:=/usb_cam"
  />
</launch>

(3)编译并运行

cd ~/catkin_ws/
catkin_make --source src/robot_vision 
source devel/setup.bash
roslaunch robot_vision cameta_calibration.launch

不断晃动,直到COMMIT按键亮起,然后点击,即可生成标定文件,本人的路径为:/home/mm/.ros/camera_info/head_camera.yaml。

opencv和cv_bridge引入

(1)opencv和cv_bridge

安装opencv(ubuntu20.04+noetic):

sudo apt-get install ros-noetic-vision-opencv libopencv-dev python3-opencv

(2)opencv和cv_bridge的简单架构图如下:

根据这个图,在ros里,处理图像的流程一般是:

    # 第一步:使用cv_bridge将ROS的图像数据转换成OpenCV的图像格式
	cv_image = cv_bridge.imgmsg_to_cv2(msg, "bgr8")

	# 第二步:使用opencv进行图像处理
	。。。
	
	# 第三步,再将opencv格式额数据转换成ros image格式的数据
	ros_image = cv_bridge.cv2_to_imgmsg(cv_image, "bgr8")

(3)在 上节的robot_vision包里,我们新增一个cv_bridge的小样例,主要功能是在捕捉到的图像上打个蓝色的圆标。

本文不深入讲解opencv,推荐一个资料:W3Cschool - OpenCV教程

cv_bridge_test.py:

#! /usr/bin/env python3
# -*- coding: utf-8 -*-
import rospy
import cv2
from functools import partial
from cv_bridge import CvBridge, CvBridgeError
from sensor_msgs.msg import Image

def image_cb(msg, cv_bridge, image_pub):
    # 使用cv_bridge将ROS的图像数据转换成OpenCV的图像格式
    try:
        cv_image = cv_bridge.imgmsg_to_cv2(msg, "bgr8")
    except CvBridgeError as e:
        print(e)

    # 在opencv的显示窗口中绘制一个圆,作为标记
    # cv_image.shape返回一个元组,包含图像的行数(高度),列数(宽度)和通道数(通常是3个通道:BGR)
    (rows, cols, channels) = cv_image.shape
    # 当图像的宽度和高度都大于60时,才执行画圆标动作
    if cols > 60 and rows > 60:
    	# 在计算机图像处理中,图像的原点(0,0)通常定义为图像的左上角。(60,60)是圆心的坐标。
    	# 30是圆的半径。
    	# (255,0,0)定义了圆的颜色。在OpenCV中,默认的颜色空间是BGR,所以这其实是绘制了一个蓝色的圆。
    	# -1表示填充圆。如果这个值是正数,则代表绘制的圆的线宽;如果是负数,则代表填充该圆。
        cv2.circle(cv_image, (60,60), 30, (255,0,0), -1)

    # 使用Opencv的接口,显示Opencv格式的图像
    cv2.imshow("ycao: opencv image window", cv_image)
    cv2.waitKey(3)

    # 再将opencv格式额数据转换成ros image格式的数据发布
    try:
        image_pub.publish(cv_bridge.cv2_to_imgmsg(cv_image, "bgr8"))
    except CvBridgeError as e:
        print(e)

def main():
    rospy.init_node("cv_bridge_test")
    rospy.loginfo("starting cv_bridge_test node")

    bridge = CvBridge()
    image_pub = rospy.Publisher("/cv_bridge_image", Image, queue_size=1)
    bind_image_cb = partial(image_cb, cv_bridge=bridge, image_pub=image_pub)
	// 订阅/usb_cam/image_raw,然后再回调函数里处理图像,并发布出来
    rospy.Subscriber("/usb_cam/image_raw", Image, bind_image_cb)
    rospy.spin()
    cv2.destroyAllWindows()
if __name__ == "__main__":
    main()

cv_bridge_test.launch

<launch>
  <node name="usb_cam" pkg="usb_cam" type="usb_cam_node" output="screen" >
    <param name="video_device" value="/dev/video0" />
    <param name="image_width" value="640" />
    <param name="image_height" value="480" />
    <param name="pixel_format" value="yuyv" />
    <param name="camera_frame_id" value="usb_cam" />
    <param name="io_method" value="mmap"/>
  </node>
  <node
      pkg="robot_vision"
      type="cv_bridge_test.py"
      name="cv_bridge_test"
      output="screen"
  />
  <node
      pkg="rqt_image_view"
      type="rqt_image_view"
      name="rqt_image_view"
      output="screen"
  />
</launch>

(4)编译并运行

cd ~/catkin_ws/
catkin_make --source src/robot_vision 
source devel/setup.bash
roslaunch robot_vision cv_bridge_test.launch

总结

本文主要系统介绍了机器视觉处理的外围知识,引入了opencv和cv_bridge,后面几篇文章,我们将用它们继续丰富 robot_vision 软件包。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Photoshop自定义键盘快捷键

编辑 - 键盘快捷键 CtrlShiftAltK 把画笔工具改成Q , 橡皮擦改成W , 涂抹工具改成E , 增加和减小画笔大小A和S 偏好设置 - 透明度和色域 设置一样颜色 套索工具 可以自定义套选一片区域 Shiftf5 填充 CtrlU 可以改颜色/色相/饱和度 CtrlE 合并图层 CtrlShiftS 另存…

LSTM的介绍

网上一些描述LSTM文章看的云里雾里&#xff0c;只是介绍LSTM 的结构&#xff0c;并没有说明原理。我这里用通俗易懂的话来描述一下。 我们先来复习一些RNN的核心公式&#xff1a; h t t a n h ( W h h t − 1 W x x t b h ) h_t tanh(W_h h_{t-1} W_x x_t b_h) ht​tan…

C++ ——从C到C++

1、C的学习方法 &#xff08;1&#xff09;C知识点概念内容比较多&#xff0c;需要反复复习 &#xff08;2&#xff09;偏理论&#xff0c;有的内容不理解&#xff0c;可以先背下来&#xff0c;后续可能会理解更深 &#xff08;3&#xff09;学好编程要多练习&#xff0c;简…

AI技术填坑记2:标注系统

在问答中,通用大模型往往拥有不可控性,而在正常的业务系统里面,往往有自己的各种专门的术语和内容,标注系统可以对大量数据进行标记,确认大模型解答的结果符合设想。 一、总体思路 一个标注,一般分为模块、应用、提问词汇、标注值,其中,模块可以认为是一种应用分类;应…

【机器学习】超参数的选择,以kNN算法为例

分类准确度 一、摘要二、超参数的概念三、调参的方法四、实验搜索超参数五、扩展搜索范围六、考虑距离权重的kNN算法七、距离的计算方法及代码实现八、明可夫斯基距离的应用九、网格搜索超参数 一、摘要 本博文讲解了机器学习中的超参数问题&#xff0c;以K近邻算法为例&#…

哪吒闹海!SCI算法+分解组合+四模型原创对比首发!SGMD-FATA-Transformer-LSTM多变量时序预测

哪吒闹海&#xff01;SCI算法分解组合四模型原创对比首发&#xff01;SGMD-FATA-Transformer-LSTM多变量时序预测 目录 哪吒闹海&#xff01;SCI算法分解组合四模型原创对比首发&#xff01;SGMD-FATA-Transformer-LSTM多变量时序预测效果一览基本介绍程序设计参考资料 效果一览…

Django开发入门 – 3.用Django创建一个Web项目

Django开发入门 – 3.用Django创建一个Web项目 Build A Web Based Project With Django By JacksonML 本文简要介绍如何利用最新版Python 3.13.2来搭建Django环境&#xff0c;以及创建第一个Django Web应用项目&#xff0c;并能够运行Django Web服务器。 创建该Django项目需…

2025.2.8——二、Confusion1 SSTI模板注入|Jinja2模板

题目来源&#xff1a;攻防世界 Confusion1 目录 一、打开靶机&#xff0c;整理信息 二、解题思路 step 1&#xff1a;查看网页源码信息 step 2&#xff1a;模板注入 step 3&#xff1a;构造payload&#xff0c;验证漏洞 step 4&#xff1a;已确认为SSTI漏洞中的Jinjia2…

【C语言标准库函数】标准输入输出函数详解[5]:格式化文件输入输出

目录 一、fprintf() 函数 1.1. 函数简介 1.2. fprintf使用场景 1.3. 注意事项 1.4. 示例 二、fscanf() 函数 2.1. 函数简介 2.2. fscanf使用场景 2.3. 注意事项 2.3. 示例 三、总结 在 C 语言中&#xff0c;格式化文件输入输出函数能够让我们以特定的格式对文件进行…

【详细版】DETR系列之Deformable DETR(2021 ICLR)

论文标题Deformable DETR: Deformable Transformers for End-to-End Object Detection论文作者Xizhou Zhu, Weijie Su, Lewei Lu, Bin Li, Xiaogang Wang, Jifeng Dai发表日期2021年03月01日GB引用> Xizhou Zhu, Weijie Su, Lewei Lu, et al. Deformable DETR: Deformable T…

c++----函数重载

目录标题 为什么会有函数重载函数重载的概念函数重载的例子第一个&#xff1a;参数的类型不同第二个&#xff1a;参数的个数不同第三种&#xff1a;类型的顺序不同函数重载的奇异性重载函数的底层原理有关函数重载的一个问题 为什么会有函数重载 大家在学c语言的时候有没有发现…

从云原生到 AI 原生,谈谈我经历的网关发展历程和趋势

作者&#xff1a;谢吉宝&#xff08;唐三&#xff09; 编者按&#xff1a; 云原生 API 网关系列教程即将推出&#xff0c;欢迎文末查看教程内容。本文整理自阿里云智能集团资深技术专家&#xff0c;云原生产品线中间件负责人谢吉宝&#xff08;唐三&#xff09; 在云栖大会的精…

多头自注意力中的多头作用及相关思考

文章目录 1. num_heads2. pytorch源码演算 1. num_heads 将矩阵的最后一维度进行按照num_heads的方式进行切割矩阵&#xff0c;具体表示如下&#xff1a; 2. pytorch源码演算 pytorch 代码 import torch import torch.nn as nn import torch.nn.functional as Ftorch.set…

常用的python库-安装与使用

常用的python库函数 yield关键字openslide库openslide库的安装-linuxopenslide的使用openslide对象的常用属性 cv2库numpy库ASAP库-multiresolutionimageinterface库ASAP库的安装ASAP库的使用 concurrent.futures.ThreadPoolExecutorxml.etree.ElementTree库skimage库PIL.Image…

对接DeepSeek

其实&#xff0c;整个对接过程很简单&#xff0c;就四步&#xff0c;获取key&#xff0c;找到接口文档&#xff0c;接口测试&#xff0c;代码对接。 获取 KEY https://platform.deepseek.com/transactions 直接付款就是了&#xff08;现在官网暂停充值2025年2月7日&#xff0…

ChatGPT提问技巧:行业热门应用提示词案例-文案写作

ChatGPT 作为强大的 AI 语言模型&#xff0c;已经成为文案写作的得力助手。但要让它写出真正符合你需求的文案&#xff0c;关键在于如何与它“沟通”&#xff0c;也就是如何设计提示词&#xff08;Prompt&#xff09;。以下是一些实用的提示词案例&#xff0c;帮助你解锁 ChatG…

分享如何通过Mq、Redis、XxlJob实现算法任务的异步解耦调度

一、背景 1.1 产品简介 基于大模型塔斯&#xff0c;整合传统的多项能力&#xff08;NLP、OCR、CV等&#xff09;&#xff0c;构建以场景为中心的新型智能文档平台。通过文档审阅&#xff0c;实现结构化、半结构化和非结构化文档的信息获取、处理及审核&#xff0c;同时基于大…

8.flask+websocket

http是短连接&#xff0c;无状态的。 websocket是长连接&#xff0c;有状态的。 flask中使用websocket from flask import Flask, request import asyncio import json import time import websockets from threading import Thread from urllib.parse import urlparse, pars…

【大模型实战】使用Ollama+Chatbox实现本地Deepseek R1模型搭建

下载安装Ollama Ollama官方链接:https://ollama.com/,打开链接后就可以看到大大的下载按钮,如下图: 我选择用Win的安装。将Ollama的安装包下载到本地,如果下载慢可以复制链接到迅雷里面,提高下载速度,如下图: 双击之后,就可以开始安装了,如下图: 默认安装到C盘,…

VMware 虚拟机 ubuntu 20.04 扩容工作硬盘

一、关闭虚拟机 关闭虚拟机参考下图&#xff0c;在vmware 调整磁盘容量 二、借助工具fdisk testubuntu ~ $ df -h Filesystem Size Used Avail Use% Mounted on udev 1.9G 0 1.9G 0% /dev tmpfs 388M 3.1M 385M 1% /run /dev/sda5 …