小秋SLAM入门实战

小秋SLAM入门实战

源码文件

#include <iostream>
#include <vector>
#include <opencv2/opencv.hpp>

std::vector<cv::KeyPoint> generateRandomKeyPoints(const cv::Mat& image, int numPoints) {
    std::vector<cv::KeyPoint> keypoints;
    cv::RNG rng; // OpenCV 随机数生成器
    for (int i = 0; i < numPoints; ++i) {
        cv::Point2f pt(rng.uniform(0.f, (float)image.cols), rng.uniform(0.f, (float)image.rows));
        keypoints.push_back(cv::KeyPoint(pt, 1.f));
    }
    return keypoints;
}

int main() {
    // 生成两个简单的灰度图像
    cv::Mat imLeft = cv::Mat::zeros(240, 320, CV_8UC1); // 240x320 的黑色图像
    cv::Mat imRight = cv::Mat::zeros(240, 320, CV_8UC1);

    // 生成一些随机特征点
    std::vector<cv::KeyPoint> mvKeys = generateRandomKeyPoints(imLeft, 100);
    std::vector<cv::KeyPoint> mvKeysRight = generateRandomKeyPoints(imRight, 100);

    cv::Mat imLeftBGR;
    imLeftBGR = imLeft.clone();
    cv::cvtColor(imLeft, imLeftBGR, cv::COLOR_GRAY2BGR);
    cv::drawKeypoints(imLeftBGR, mvKeys, imLeftBGR, cv::Scalar(0, 0, 255));

    cv::Mat imRightBGR;
    imRightBGR = imRight.clone();
    cv::cvtColor(imRight, imRightBGR, cv::COLOR_GRAY2BGR);
    cv::drawKeypoints(imRightBGR, mvKeysRight, imRightBGR, cv::Scalar(0, 255, 0));

    cv::Mat mergedImage(imLeftBGR.rows, imLeftBGR.cols + imRightBGR.cols, imLeftBGR.type());
    imLeftBGR.copyTo(mergedImage(cv::Rect(0, 0, imLeftBGR.cols, imLeftBGR.rows)));
    imRightBGR.copyTo(mergedImage(cv::Rect(imLeftBGR.cols, 0, imRightBGR.cols, imRightBGR.rows)));


    cv::imshow("Merged Image", mergedImage);
    cv::waitKey(0);

    return 0;
}

C++ 程序使用 OpenCV 生成两个黑色的灰度图像,并添加随机特征点,然后将这两个图像合并为一张图像并显示-LMLPHP

功能解读

  1. 生成灰度图像:程序创建了两个大小为 240x320 像素的黑色灰度图像,分别命名为 imLeftimRight

  2. 生成随机特征点

    • 使用 generateRandomKeyPoints 函数在这两个图像上生成指定数量(在这个例子中是100个)的随机特征点。
    • 这些特征点存储在 std::vector<cv::KeyPoint> 类型的 mvKeysmvKeysRight 中。
  3. 处理和显示左图像(imLeft

    • 克隆 imLeftimLeftBGR
    • 使用 cv::cvtColorimLeftBGR 从灰度转换为 BGR 彩色格式。
    • 使用 cv::drawKeypointsimLeftBGR 上绘制 mvKeys 中的特征点,这些点以红色显示(BGR: 0, 0, 255)。
  4. 处理和显示右图像(imRight

    • 类似地,克隆 imRightimRightBGR 并将其转换为 BGR 彩色格式。
    • 使用 cv::drawKeypointsimRightBGR 上绘制 mvKeysRight 中的特征点,这些点以绿色显示(BGR: 0, 255, 0)。
  5. 合并图像

    • 创建一个新的图像 mergedImage,大小足以容纳 imLeftBGRimRightBGR 并排放置。
    • imLeftBGRimRightBGR 分别复制到 mergedImage 的左侧和右侧。
  6. 显示合并后的图像

    • 使用 cv::imshow 显示 mergedImage
    • cv::waitKey(0) 使得图像窗口保持打开状态,直到用户按下任意键。

总体来说,这个程序演示了如何在 OpenCV 中生成图像,添加特征点,进行基本的图像处理(例如颜色空间转换和特征点绘制),以及如何合并和显示图像。这种类型的处理在计算机视觉和图像分析中很常见。

编译文件

cmake_minimum_required(VERSION 3.10)
project(ImagePyramid)

# 设置C++标准
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED True)

# 找到OpenCV包
find_package(OpenCV REQUIRED)

# 包含OpenCV头文件
include_directories(${OpenCV_INCLUDE_DIRS})

# 添加可执行文件
add_executable(ImagePyramid main.cpp)

# 链接OpenCV库
target_link_libraries(ImagePyramid ${OpenCV_LIBS})

01-28 05:02