自学内容网 自学内容网

【红外】采集数据

8ca7b66a22a1459e82e97345f244239b.png

 【orin】米文动力 orin 使用体验 以及实操(雷达;摄像头)_米文+orin-CSDN博客

 

红外型号是IR-Pilot 640 41Z1GC,通过gsml连orin

0879480fd9a34ddbb6fb66b60af6d7f3.png

 

631e7f101d784f18ad4a9ca8637ee44a.png

首先,这个miivii文件下缺东西,features/gmsl_camera/samples里就缺东西,缺了两个文件夹。

所以我去新机器拷了新的miivii,完整的。然后打包成miwen.tar.gz,然后解压编译的。


miwen是我建的文件夹,把miwen.tar.gz解压生成的miivii文件夹放到了miwen里

e69a1bac6e2d4105b061d2e931f36d67.png

 

sudo make 报错看着是缺opencv

因为正常装了opencv是这样的

c4df178ae9d641c1a9fc43a19de0e817.png

但是我这个目录下只有python,没有opencv相关。

之所以不用find命令,是因为机器里容器里也安装了opencv,太长了,很难排查。


然后我在home下用源码编译的opencv

7fec2bda67174bb49804e5b8b5a9b448.png

## 编译opencv源码

解压opencv.zip得到opencv-4.2.0文件夹

解压opencv_contrib.zip得到opencv_contrib-4.2.0文件夹

将opencv_contrib-4.2.0移动到opencv-4.2.0文件夹内

```
cd opencv-4.2.0
mkdir build
cd build/

export http_proxy=http://127.0.0.1:7890/ # 在容器内设置代理

cmake \
-DCUDA_nppicom_LIBRARY=stdc++ \
-DCMAKE_BUILD_TYPE=Release \
-DCMAKE_INSTALL_PREFIX=/usr/local \
-DOPENCV_ENABLE_NONFREE=1 \
-DBUILD_opencv_python2=1 \
-DBUILD_opencv_python3=1 \
-DWITH_FFMPEG=1 \
-DCUDA_TOOLKIT_ROOT_DIR=/usr/local/cuda \
-DCUDA_ARCH_BIN=8.7 \
-DCUDA_ARCH_PTX=8.7 \
-DWITH_CUDA=1 \
-DENABLE_FAST_MATH=1 \
-DCUDA_FAST_MATH=1 \
-DWITH_CUBLAS=1 \
-DOPENCV_GENERATE_PKGCONFIG=1 \
-DOPENCV_EXTRA_MODULES_PATH=../opencv_contrib-4.2.0/modules \
..


make -j4 # 四线程编译

sudo make install
```

源码编译opencv的时候出错

f2555606d5d34d36a509bb7ba64d5649.png

sudo apt-get install libboost-all-dev

之后编译成功,usr/local/lib下也出现opencv的库了


opencv编译后,接着编译gmsl

 还是有报错

80a4365041e34412b17dd1b190443822.png

 

而Makefile里默认路径(老miivii文件夹)里只有两个so

aca7579ee0bf4194ade08ee37b7dad62.png

去找新miivii发现有缺的这个so

64a97c51f10f44e7a2e882485dc5bb5a.png

 所以我直接把opt下老miivii换成新的了

然后home下的miivii和opt下的miivii都sudo make 编译一下

2fa049169b694f8f8d11e882521ad147.png

没报错,看样子是过了

现在继续下一步,运行demo,报错了:缺一个so

1f6c397207634319ab4028568aecbe3f.png

先下一个locate工具

sudo apt-get install mlocate

sudo updatedb

86c43dd0aa2442c3a45d6edb962d2dfd.png

还挺多,那就是没摸到,环境变量的原因了

export LD_LIBRARY_PATH=/home/nvidia/opencv/opencv/opencv-4.2.0/build/lib:/usr/local/lib:$LD_LIBRARY_PATH

再次测试

./cameras_opencv_demo -s 640x512 -d /dev/video0

成功!

b2b3775c4f454bbf967488cb31a6a111.png

 e5838e36b7f145f98f85918255f189f9.png

注意

a112fbe9efe14c59b3c8f30ec764e62e.png

有段警告,缺东西,但可能无伤大雅,先跳过

nvidia@wk-orin:/opt/miivii/features/gmsl_camera/bin$ ./cameras_opencv_demo -s 640x512 -d /dev/video0
attestationVerify [13] succeed.
Opening camera...
[ WARN:0] global /home/nvidia/opencv/opencv/opencv-4.2.0/modules/videoio/src/cap_gstreamer.cpp (935) open OpenCV | GStreamer warning: Cannot query video position: status=0, value=-1, duration=-1
Gtk-Message: 20:23:56.141: Failed to load module "canberra-gtk-module"

接下来把环境变量永久写进去

永久设置 LD_LIBRARY_PATH

如果需要永久设置 LD_LIBRARY_PATH,可以在用户的 .bashrc 或 .profile 文件中添加以下行:

export LD_LIBRARY_PATH=/home/nvidia/opencv/opencv/opencv-4.2.0/build/lib:/usr/local/lib:$LD_LIBRARY_PATH

25779f869c674d3cad6f79960a7a9ea9.png

 208aed9612914fa2a48a077963dfd8b7.png

 source ~/.bashrc  使其生效

03e91722db544f4eb953b52956176d5f.png

搞定!

接着我要录制 ros 话题的红外图像。

 

我现在已经成功输出了红外图像,如何查找红外摄像头的信息呢

ls -l /dev/video*

43d65ff0aae040e399fa7b1aa21585ee.png

 

0621d6caf412462da22a8f2f943cbea5.png

 


openCV 转 ros话题发布出去

cv_bridge/Tutorials/ConvertingBetweenROSImagesAndOpenCVImagesPython - ROS Wiki

sRGB和RGB有什么区别?

  1. RGB

    • RGB 是一种加色模型,代表红(Red)、绿(Green)和蓝(Blue)三种基本颜色。在显示技术中,通过调整这三种颜色的不同强度可以产生各种各样的颜色。RGB 模型主要用于电子设备上,比如电视、计算机显示器和智能手机屏幕。
  2. sRGB

    • sRGB 是一种具体的色彩空间标准,它定义了一组特定的颜色,这些颜色可以通过 RGB 加色模型来实现。sRGB 是一种较为狭窄但非常普遍的色彩空间,它被广泛应用于网页设计、摄影和打印等领域。sRGB 是由微软和惠普等公司在1990年代末期制定的一个标准,目的是创建一个可以跨多种设备(包括监视器、打印机和扫描仪)的一致色彩语言。

我是sRGB还是mono8?

    BGR8 (bgr8):用于彩色图像,每个像素有三个通道(蓝、绿、红),每个通道占用 8 位。
    
    RGB8 (rgb8):用于彩色图像,每个像素有三个通道(红、绿、蓝),每个通道占用 8 位。
    
    灰度图像 (mono8):用于单通道灰度图像,每个像素只有一个通道,占用 8 位。

选择合适的编码格式

    彩色图像:
        如果你的图像数据是 BGR 格式(OpenCV 默认格式),你应该使用 bgr8 编码。
        如果你的图像数据是 RGB 格式,你应该使用 rgb8 编码。

    灰度图像:
        如果你的图像数据是灰度图像,你应该使用 mono8 编码。

 

ros_frame.step这个是什么

ros_frame.step 是 sensor_msgs/Image 消息中的一个字段,表示图像每一行的字节数。它是一个非常重要的字段,因为它影响到图像数据的解析和传输。

ros_frame.step 的含义
定义:

ros_frame.step 表示图像每一行的字节数。
它通常等于图像的宽度乘以每个像素的字节数。
计算方法:

对于彩色图像(如 bgr8 或 rgb8),每个像素有 3 个通道(R、G、B),每个通道占用 1 字节。
因此,对于宽度为 width 的图像,step 计算公式为:
python
step = width * channels
示例
假设图像宽度为 1920 像素,每个像素有 3 个通道(BGR 或 RGB),则 step 计算如下:

python
width = 1920
channels = 3
step = width * channels
对于 1920x1080 的 BGR 图像:

python
ros_frame.step = 1920 * 3
为什么需要 step?
内存对齐:

在某些情况下,图像数据可能会有额外的填充字节,以保证内存对齐。这些填充字节不会被显示,但会影响每一行的总字节数。
step 包含了这些额外的填充字节,确保数据正确解析。
跨平台兼容性:

不同的操作系统或硬件可能有不同的内存对齐要求。step 确保数据在不同平台上都能正确解析。

 


d0a41d681b124664aa39c5d89b692eff.png

 

cf5e46041c4f409b8caa25c258ebc709.png

 

 


原文地址:https://blog.csdn.net/m0_74633496/article/details/142353869

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!