今天我们来完成一个视觉领域有趣的基本入门级必备的功能程序开发(该程序之于视觉领域入门就好比“Hello world!”之于计算机编程入门):程序实现输入Input一张图像,输出Output该图像提取的形状特征,图像是RGB图,提取的图像形状特征表示是二维像素坐标特征;并且我们大家考虑一个问题就是如何将提取的二维像素坐标特征在三维领域读取出来。读者们,这就是一个入门级但是极为经典的如何读取一张图像,并且提取图像的形状特征,以往的帖子中到这里已经完成了,我们现在多考虑一步就是图像的二维像素坐标数据如何与立体三维点云数据进行转换的方法,因为随着人工智能AI的技术演进很多应用场景对计算机视觉领域的应用需求已经不仅仅只是满足一个二维的图像特征提取了,有一些场景还需要视觉提供三维特征尤其是Z轴深度特征值,鉴于这个实际情况我们就在这个初学的入门程序里面增添一个功能就是将提取的二维坐标序列通过设置特定Z平面的方式扩展到三维坐标系,当然实际的二维到三维是有专门的三维重建立体几何数学计算原理得来的,那个讲起来就海量知识了,本帖子只是启蒙性质的用通俗视角的浅显的来解读这从一/二维到三维的奥秘,让初学者就能窥测视觉一二三维的整体框架,由此有助于读者们后续学习过程中便于通向攀登珠峰的山脚小径。
借助于当前最流行的人工智能AGI通用/专用助手明星产品(例如DeepSeek/ChaGPT/文心一言/通义千问/豆包/腾讯元宝等)的辅助科研智能助手,我得以较快的保质保量的完成该部分工作。我们先写一个算法程序:实现输入一张图像Img,输出图像蛇的形状特征:形状特征提取包括边缘特征,并且保存为二维像素坐标点序列vector<vector> contours到文件中。
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace cv;
using namespace std;
//定义提取输入图像形状特征函数
Mat extractBodyContour(const Mat& image) {
Mat gray, blurred, edges, contourImage;
// 转换为灰度图
cvtColor(image, gray, COLOR_BGR2GRAY);
// 高斯模糊
GaussianBlur(gray, blurred, Size(5, 5), 0);
// Canny边缘检测
Canny(blurred, edges, 50, 150);
// 查找人体形态
vector<vector<Point>> contours;
findContours(edges, contours, RETR_EXTERNAL, CHAIN_APPROX_SIMPLE);
// 创建空白图像
contourImage = Mat::zeros(image.size(), image.type());
// 绘制白色形态特征 (Scalar(255, 255, 255) 是白色)
drawContours(contourImage, contours, -1, Scalar(255, 255, 255), 2