非常详细的相机标定原理、步骤(一)

人工智能100

目录

一、什么是相机标定

二、坐标系

1.世界坐标系(word Coordinate)

2.相机坐标系(camera coordinate)

3.世界坐标系到相机坐标系转换

三、总结:

非常详细的相机标定原理、步骤(二)_An efforter的博客-CSDN博客

(2条消息) 非常详细的相机标定原理(三)(张正友相机标定法初见和单应性矩阵)_An efforter的博客-CSDN博客

(2条消息) 非常详细的相机标定原理(四)(张正友相机标定法数学推导求解)_An efforter的博客-CSDN博客

非常详细的相机标定(五)(相机标定代码讲解)_An efforter的博客-CSDN博客

一、什么是相机标定

  • 空间物体表面某点的三维几何位置与其在图像中对应点之间的相互关系,必须建立相机成像的几何模型
  • 这些几何模型参数就是相机参数
  • 这个求解参数的过程就称之为相机标定(或摄像机标定)

二、坐标系

1.世界坐标系(word Coordinate)

由于摄像机与被摄物体可以放置在环境中任意位置,这样就需要在环境中建立一个坐标系,来表示摄像机和被摄物体的位置,这个坐标系就成为 世界坐标系非常详细的相机标定原理、步骤(一)

2.相机坐标系(camera coordinate)

一个三维直角坐标系,原点位于镜头光心处, x、y轴分别与相面的两边平行,z轴为镜头光轴,与像平面垂直。

非常详细的相机标定原理、步骤(一)

3.世界坐标系到相机坐标系转换

三维物理坐标转化到相机平面的像坐标,其实就是一个过渡的过程,其中会有旋转与平移的操作。

旋转的表示有很多种:

旋转矩阵,欧拉角,四元数,轴角,李群与李代数

旋转的应用场景:

惯性导航,机器人学(机械臂运动学,无人机姿态估计, SLAM等)

简单的旋转:小红点不随着坐标轴的旋转变而变,始终是不变的。对应的关系如下:

非常详细的相机标定原理、步骤(一)非常详细的相机标定原理、步骤(一)

红点经过x轴转化,在新坐标系下具体的步骤进行分解:

非常详细的相机标定原理、步骤(一)

这是属于左乘的思想:左边乘以一个旋转矩阵非常详细的相机标定原理、步骤(一)

下面是关于按各个坐标轴转换矩阵,矩阵是右乘 的思想解法:[X,Y,Z] * R。

非常详细的相机标定原理、步骤(一)

前面都是打基础,这个是世界坐标系到相机坐标系的关键步骤:注意看,R就是旋转矩阵,t是平移矩阵,都属于相机外参。最下面的公式为了得到4*4的矩阵,所有矩阵最后一格都设为了 1(线性代数的知识)。

非常详细的相机标定原理、步骤(一)

三、总结:

  1. 为啥要把世界坐标系变到相机坐标系? 因为我们相机坐标系可以将图像的世界点联系起来。
  2. 啥是世界点? 一般情况下我们是需要测量物体到机器人的距离和位置关系,因此世界坐标系一般定在机器人上,或者是机器人工作的场景中。
  3. 世界坐标系与相机坐标系的关系就是相机的外参。

Original: https://blog.csdn.net/qq_40694323/article/details/125229526
Author: An efforter
Title: 非常详细的相机标定原理、步骤(一)



相关阅读1

Title: 安装Anaconda/Python3.9/Tensorflow

安装Anaconda/Python3.9/Tensorflow

· 安装Anaconda

官网安装,开梯子
非常详细的相机标定原理、步骤(一)
Download即可。打开下载好的安装包,按照提示,一路【Next】
非常详细的相机标定原理、步骤(一)
选择安装路径
非常详细的相机标定原理、步骤(一)
这里官方并没有推荐自动配置环境变量,自动或手动配置均可。一般是默认勾选下边的选项(我这里刚刚已经装好一次,因此勾选不上。)
点击【Install】,等待安装完成。继续按提示操作至安装界面结束。

; · 配置Anaconda环境变量

添加如下Path环境变量
非常详细的相机标定原理、步骤(一)
cmd查看Anaconda版本
非常详细的相机标定原理、步骤(一)
证明Anaconda已经装好。

· 安装Tensorflow

开始菜单打开Anaconda Prompt
非常详细的相机标定原理、步骤(一)
配置清华镜像源,从这里开始要关掉代理了。

conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/
conda config --set show_channel_urls yes

Anaconda创建Python环境,可在官网查看Tensorflow支持的Python版本:
非常详细的相机标定原理、步骤(一)
我的Anaconda给我装了Python3.9,于是

conda create -n tensorflow python=3.9

询问[Y/N]时选择Y。完成时给出如下提示
非常详细的相机标定原理、步骤(一)
查看目前有哪些环境,通过

conda env list

conda info --env

可以看到tensorflow环境已经创建。星号为当前所在环境(基础环境base)。通过 activate tensorflow进入tensorflow环境:
非常详细的相机标定原理、步骤(一)
开始实际安装Tensorflow。查看当前可使用的Tensorflow版本,通过

conda search --full --name tensorflow

非常详细的相机标定原理、步骤(一)
从1.1.0到2.6.0都有。可指定版本安装,这里安装默认版本

pip install --upgrade --ignore-installed tensorflow

无报错结束应该是装好了。打开Python环境,导入tensorflow包进行测试
非常详细的相机标定原理、步骤(一)
确定tensorflow已经装好(这里应该是Cuda版本低了,以后再调)。 tf.__version__查看版本为2.7。
最后如果想退出tensorflow环境

conda deactivate

同时,conda控制台是默认打开base环境的,如果想管理这一设置

conda config --set auto_activate_base false / true

参考博客如下

https://blog.csdn.net/zaxcac/article/details/122422684
https://blog.csdn.net/weixin_42412254/article/details/107569830
https://blog.csdn.net/woniuyc/article/details/121984874
https://blog.csdn.net/weixin_44717083/article/details/121555146
https://blog.csdn.net/java_pythons/article/details/114875018
https://blog.csdn.net/qq_38463737/article/details/109492394
https://blog.csdn.net/qq_37924224/article/details/117712061

Original: https://blog.csdn.net/qq_45755158/article/details/122644140
Author: Miska_Muska
Title: 安装Anaconda/Python3.9/Tensorflow

相关阅读2

Title: Node: ‘conv2d_transpose_1/conv2d_transpose/Conv2DBackpropFilter‘No algorithm worked Error messages

情况说明

用tensorflow在GPU上跑一个fit,模型里用到了两个卷积函数layers.Conv2D和layers.Conv2DTranspose
epoch时出错,具体错误日志见下文,一开始Conv2D位置报错

解决过程

(1)搜索到一个类似的:No algorithm worked!,即代码开头加上以下设置

from tensorflow.config.experimental import list_physical_devices, set_memory_growth
physical_devices = list_physical_devices('GPU')
set_memory_growth(physical_devices[0], True)

(2)现在Conv2DTranspose位置报错,据错误日志推测大概是调用cudnn跑卷积转置失败,使用错误日志搜索无果后,使用关键词"cudnn运行反卷积gpu失败",同样参考类似问题:Could not load library cudnn_cnn_infer64_8.dll,可能是cudnn的底层cnn计算库本身有问题,学博主的降一个cudnn版本

总结

  • 解决方案就是【加代码+cudnn降版本】
  • 当前版本环境:window10、tensorflow2.8.0、cuda11.2.2、cudnn8.1.0.77,下载地址如下:
  • tensorflow官方文档
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple tensorflow

这里临时使用了清华镜像站作为源地址,因为官方源地址下载非常慢


pip config list

python -m pip install --upgrade pip

pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple

  • cuda11.2.2 我本来装的当前最新版cuda11.6+cudnn8.2,考虑到tensorflow官网上跑GPU的软件要求,就开始换cuda版本,先在控制面板里卸载带有CUDA名字的,大概有6个,再用CCleaner排查注册表问题,再安装11.2
    非常详细的相机标定原理、步骤(一)
  • cudnncudnn8.1.0.77
  • 其间接连从anaconda里卸载tensorflow,直接安装到终端之类的,然并卵
  • 其间还尝试只用CPU跑来排除到底是不是GPU环境配置的问题
import os
os.environ["CUDA_VISIBLE_DEVICES"]="-1"

错误日志

NotFoundError: Graph execution error: Detected at node 'gradient_tape/denoise/sequential_1/conv2d_transpose_1/conv2d_transpose/Conv2DBackpropFilter' defined at (most recent call last):
...

Node: 'gradient_tape/denoise/sequential_1/conv2d_transpose_1/conv2d_transpose/Conv2DBackpropFilter'
No algorithm worked! Error messages:
Profiling failure on CUDNN engine 1#TC: UNKNOWN: CUDNN_STATUS_INTERNAL_ERROR
in tensorflow/stream_executor/cuda/cuda_dnn.cc(4177): 'cudnnConvolutionBackwardFilter( cudnn.handle(), alpha, input_nd_.handle(), input_data.opaque(), output_nd_.handle(), output_data.opaque(), conv_.handle(), ToConvBackwardFilterAlgo(algo), scratch_memory.opaque(), scratch_memory.size(), beta, filter_.handle(), filter_data.opaque())'
Profiling failure on CUDNN engine 1: UNKNOWN: CUDNN_STATUS_INTERNAL_ERROR
in tensorflow/stream_executor/cuda/cuda_dnn.cc(4177): 'cudnnConvolutionBackwardFilter( cudnn.handle(), alpha, input_nd_.handle(), input_data.opaque(), output_nd_.handle(), output_data.opaque(), conv_.handle(), ToConvBackwardFilterAlgo(algo), scratch_memory.opaque(), scratch_memory.size(), beta, filter_.handle(), filter_data.opaque())'
Profiling failure on CUDNN engine 0#TC: UNKNOWN: CUDNN_STATUS_EXECUTION_FAILED
in tensorflow/stream_executor/cuda/cuda_dnn.cc(4177): 'cudnnConvolutionBackwardFilter( cudnn.handle(), alpha, input_nd_.handle(), input_data.opaque(), output_nd_.handle(), output_data.opaque(), conv_.handle(), ToConvBackwardFilterAlgo(algo), scratch_memory.opaque(), scratch_memory.size(), beta, filter_.handle(), filter_data.opaque())'
Profiling failure on CUDNN engine 0: UNKNOWN: CUDNN_STATUS_EXECUTION_FAILED
in tensorflow/stream_executor/cuda/cuda_dnn.cc(4177): 'cudnnConvolutionBackwardFilter( cudnn.handle(), alpha, input_nd_.handle(), input_data.opaque(), output_nd_.handle(), output_data.opaque(), conv_.handle(), ToConvBackwardFilterAlgo(algo), scratch_memory.opaque(), scratch_memory.size(), beta, filter_.handle(), filter_data.opaque())'
Profiling failure on CUDNN engine 3#TC: UNKNOWN: CUDNN_STATUS_INTERNAL_ERROR
in tensorflow/stream_executor/cuda/cuda_dnn.cc(4177): 'cudnnConvolutionBackwardFilter( cudnn.handle(), alpha, input_nd_.handle(), input_data.opaque(), output_nd_.handle(), output_data.opaque(), conv_.handle(), ToConvBackwardFilterAlgo(algo), scratch_memory.opaque(), scratch_memory.size(), beta, filter_.handle(), filter_data.opaque())'
Profiling failure on CUDNN engine 3: UNKNOWN: CUDNN_STATUS_INTERNAL_ERROR
in tensorflow/stream_executor/cuda/cuda_dnn.cc(4177): 'cudnnConvolutionBackwardFilter( cudnn.handle(), alpha, input_nd_.handle(), input_data.opaque(), output_nd_.handle(), output_data.opaque(), conv_.handle(), ToConvBackwardFilterAlgo(algo), scratch_memory.opaque(), scratch_memory.size(), beta, filter_.handle(), filter_data.opaque())'
[[{{node gradient_tape/denoise/sequential_1/conv2d_transpose_1/conv2d_transpose/Conv2DBackpropFilter}}]] [Op:__inference_train_function_973]

Original: https://blog.csdn.net/qq_39380838/article/details/123777080
Author: polar-bear-lily
Title: Node: ‘conv2d_transpose_1/conv2d_transpose/Conv2DBackpropFilter‘No algorithm worked Error messages

相关阅读3

Title: Tensorflow lite在树莓派4B上进行图像分类和目标检测

接着前面系列博客来讲,这里来实现下官方例子

一.在Raspberry Pi 4B上进行图像分类

examples/lite/examples/image_classification/raspberry_pi at master · tensorflow/examples · GitHub TensorFlow examples. Contribute to tensorflow/examples development by creating an account on GitHub.非常详细的相机标定原理、步骤(一)https://github.com/tensorflow/examples/tree/master/lite/examples/image_classification/raspberry_pi ;下载完毕后,将examples-master整个文件夹上传到树莓派上,然后终端cd到如下目录下(结合自己的路径)

非常详细的相机标定原理、步骤(一)

这边博主修改了下setup.sh中的路径,不然tflite模型按照默认路径下载会失败,红框内的路径可以修改为如下:

https://storage.googleapis.com/tfhub-lite-models/tensorflow/lite-model/efficientnet/lite0/uint8/2.tflite

非常详细的相机标定原理、步骤(一)

完毕后,终端执行,安装一些必要库,同时下载两个tflite模型

sh setup.sh

可以看到下载的两个模型已经在当前文件夹下了

非常详细的相机标定原理、步骤(一)

博主这边在pycharm中运行下classify.py文件

非常详细的相机标定原理、步骤(一)

连上一个usb的摄像头就可以取像了,实时去分类了,博主拿了一把汤勺做实验

非常详细的相机标定原理、步骤(一)

二. 在Raspberry Pi 4B上进行目标检测

examples/lite/examples/object_detection/raspberry_pi at master · tensorflow/examples · GitHub 非常详细的相机标定原理、步骤(一)https://github.com/tensorflow/examples/tree/master/lite/examples/object_detection/raspberry_pi ;参考上面官网进行配置,cd到目标检测目录下

非常详细的相机标定原理、步骤(一)

同上,这里也要修改下setup.sh中的路径

非常详细的相机标定原理、步骤(一)

红框内的路径修改为如下:

https://storage.googleapis.com/tfhub-lite-models/tensorflow/lite-model/efficientdet/lite0/detection/metadata/1.tflite

完毕后,运行安装必要库及下载检测模型

sh setup.sh

完毕后,可以看到目录下已经有了需要的模型

非常详细的相机标定原理、步骤(一)

终端可直接如下命令,运行下检测demo程序

python3 detect.py --model efficientdet_lite0.tflite

我家的小白猫被检测出来了

非常详细的相机标定原理、步骤(一)

到此,demo结束。

仔细看下里面的代码,其实主要实现代码,在博主前面几篇博客中也用到了

Tensorflow Lite Model Maker实现图像分类和目标检测迁移学习_竹叶青lvye的博客-CSDN博客

Tensorflow Lite使用介绍_竹叶青lvye的博客-CSDN博客

Original: https://blog.csdn.net/jiugeshao/article/details/124257071
Author: 竹叶青lvye
Title: Tensorflow lite在树莓派4B上进行图像分类和目标检测