源码文件
#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;
}
功能解读
-
生成灰度图像:程序创建了两个大小为 240x320 像素的黑色灰度图像,分别命名为
imLeft
和imRight
。 -
生成随机特征点:
- 使用
generateRandomKeyPoints
函数在这两个图像上生成指定数量(在这个例子中是100个)的随机特征点。 - 这些特征点存储在
std::vector<cv::KeyPoint>
类型的mvKeys
和mvKeysRight
中。
- 使用
-
处理和显示左图像(
imLeft
):- 克隆
imLeft
到imLeftBGR
。 - 使用
cv::cvtColor
将imLeftBGR
从灰度转换为 BGR 彩色格式。 - 使用
cv::drawKeypoints
在imLeftBGR
上绘制mvKeys
中的特征点,这些点以红色显示(BGR: 0, 0, 255)。
- 克隆
-
处理和显示右图像(
imRight
):- 类似地,克隆
imRight
到imRightBGR
并将其转换为 BGR 彩色格式。 - 使用
cv::drawKeypoints
在imRightBGR
上绘制mvKeysRight
中的特征点,这些点以绿色显示(BGR: 0, 255, 0)。
- 类似地,克隆
-
合并图像:
- 创建一个新的图像
mergedImage
,大小足以容纳imLeftBGR
和imRightBGR
并排放置。 - 将
imLeftBGR
和imRightBGR
分别复制到mergedImage
的左侧和右侧。
- 创建一个新的图像
-
显示合并后的图像:
- 使用
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})