SLAM从入门到精通(被忽视的基础图像处理)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】

工业上用激光slam的多,用视觉slam的少,这是大家都知道的常识。毕竟对于工业来说,健壮和稳定是我们必须要考虑的事情。但是图像slam在这过程当中其实也可以扮演十分重要的角色,比如说地面如果非常有特征的话,黄色路面或者绿色路面。这个时候,即使全局的slam完成不了,那么也可以实现局部道路的slam导航。

ros里面其实也谈到了opencv,它是一个用的比较多的开发库。但是很多时候,上面的demo都是比较割裂的,很难说这是用于实际场景的代码。比如说,平时比较常用的二维码导航,上面就谈的不是很多。所以,对于这些知识点,我们都可以自己编写opencv程序来解决。

目前在ubuntu20.04上面,ros noetic版本自带的是opencv 4版本了,这个需要注意下了。另外,实际图像开发的时候,光源很重要。如果光源不满足条件,可以自己编写代码,比如利用最大灰度值做pwm的pid反馈参考量,这都是有实际意义的。

1、编写测试代码

这段代码来自于网上。主要还是为了说明opencv如何编写代码,有兴趣的同学可以去买一本opencv的书来进行学习和研究。

复制代码
#include <opencv4/opencv2/highgui/highgui.hpp>
#include <opencv4/opencv2/imgcodecs/legacy/constants_c.h>
#include <iostream>
using namespace std;

int main( int argc, char** argv ) {
    cv::Mat image;
    image = cv::imread("test.jpg" , CV_LOAD_IMAGE_COLOR);	      
    if(! image.data ) {
        std::cout <<  "Could not open or find the image" << std::endl ;
	    return -1;
    }

    std::cout << "image wide: "<< image.cols << ",image high: " << image.rows << ",image channels: "<< image.channels() << std::endl;
    
    /* display image
    cv::namedWindow( "Display window", cv::WINDOW_AUTOSIZE );
    cv::imshow( "Display window", image );		    
    cv::waitKey(0);
    */
    
    size_t y,x;// y is row, x is col
    int c;     // c is channel
    y = x = 250;
    c = 2;
    
    // row_ptr is the head point of y row
    unsigned char *row_ptr = image.ptr<unsigned char>(y);
    
    // data_ptr points to pixel data
    unsigned char *data_ptr = &row_ptr[x * image.channels()]; 
    unsigned char data =  data_ptr[c];

    // use cv::Mat::at() to get the pixel value
    // unsigned char is not printable
    // std::cout << std::isprint(data)<<std::isprint(image.at<cv::Vec3b>(y,x)[c]) << std::endl;
    std::cout << "pixel value at y, x ,c"<<static_cast<unsigned>(image.at<cv::Vec3b>(y,x)[c]) << std::endl;
    return 0;
}

2、代码说明

代码的内容不复杂,主要就是打开一幅图片,然后获取指定点的像素信息。当然,这份代码只是起到抛砖引玉的作用,真正用起来,还需要和具体的场景关联起来。

3、编译方法

前面我们说过,ros noetic里面支持的是opencv 4,所以这里代码也是用opencv4的库进行编译的,输入如下所示,

复制代码
g++ test.cpp -o test `pkg-config --cflags --libs opencv4`

4、测试和调试

代码测试的过程中,还需要一张图片,我们不妨去网上搜索一下lena的图片。她也是数字图像处理中用的最多的一张图片,

这样程序和图片都准备好了,执行后不出意外的话,就可以看到这样的打印,

复制代码
shell$ ./test
image wide: 500,image high: 500,image channels: 3
pixel value at y, x ,c177

5、python3实现图像处理

实际生产中,一般是用python编写好算法之后,再转换成c/c++代码,这样效率要高很多。另外,不管是windows平台,还是linux平台,使用python都是很方便的。

复制代码
import cv2
 
def main():
    picture = cv2.imread('./test.jpg')
    cv2.imshow('lena', picture)
    cv2.waitKey(0)
    cv2.destroyAllWindows()
 
if __name__ == '__main__':
    main()

运行的方法,也比较简单,直接输入python3 ./test.py即可。

相关推荐
聆风吟º3 小时前
CANN runtime 实战指南:异构计算场景中运行时组件的部署、调优与扩展技巧
人工智能·神经网络·cann·异构计算
Codebee5 小时前
能力中心 (Agent SkillCenter):开启AI技能管理新时代
人工智能
聆风吟º6 小时前
CANN runtime 全链路拆解:AI 异构计算运行时的任务管理与功能适配技术路径
人工智能·深度学习·神经网络·cann
uesowys6 小时前
Apache Spark算法开发指导-One-vs-Rest classifier
人工智能·算法·spark
AI_56786 小时前
AWS EC2新手入门:6步带你从零启动实例
大数据·数据库·人工智能·机器学习·aws
User_芊芊君子6 小时前
CANN大模型推理加速引擎ascend-transformer-boost深度解析:毫秒级响应的Transformer优化方案
人工智能·深度学习·transformer
智驱力人工智能7 小时前
小区高空抛物AI实时预警方案 筑牢社区头顶安全的实践 高空抛物检测 高空抛物监控安装教程 高空抛物误报率优化方案 高空抛物监控案例分享
人工智能·深度学习·opencv·算法·安全·yolo·边缘计算
qq_160144877 小时前
亲测!2026年零基础学AI的入门干货,新手照做就能上手
人工智能
Howie Zphile7 小时前
全面预算管理难以落地的核心真相:“完美模型幻觉”的认知误区
人工智能·全面预算
人工不智能5777 小时前
拆解 BERT:Output 中的 Hidden States 到底藏了什么秘密?
人工智能·深度学习·bert