You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

C++初学者求助:如何像Python一样简便保存数组变量为图像

在C++中用OpenCV保存图像(对应Python的cv2.imwrite)

嘿,作为C初学者,你完全不用担心——OpenCV的C接口里就有和Python中cv2.imwrite几乎一样简便的方法!下面针对你提到的两个变量分别说明:

一、保存RGB图像(color变量)

你的colorIplImage*类型,这是OpenCV旧版的C风格接口对象,我们可以轻松把它转换成C++风格的cv::Mat,然后用cv::imwrite直接保存,步骤非常简单:

#include <opencv2/opencv.hpp>

// 把IplImage*转换成cv::Mat(浅拷贝,不会额外占用过多内存)
cv::Mat colorMat(color);

// 和Python的cv2.imwrite用法几乎一致,直接保存图像
cv::imwrite("output_color.jpg", colorMat);

如果你习惯用旧版C接口,也可以用cvSaveImage函数,但更推荐cv::imwrite——它是OpenCV C++接口的标准写法,兼容性和扩展性更好。

二、保存骨架数据(sn变量)

sn是自定义的骨架结构体(SLR_ST_Sn),它本身不是图像数据,所以需要先把骨架可视化绘制到图像上,再保存。这里假设你的骨架结构体包含关节点的坐标信息(比如关节的x、y位置),我们可以创建一个空白图像,然后绘制关节点和连线,最后保存:

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

// 创建和RGB图像同尺寸的空白图像(白色背景),也可以自定义尺寸
cv::Mat skeletonImg(colorMat.size(), CV_8UC3, cv::Scalar(255, 255, 255));

// 根据你的骨架结构,定义关节之间的连接关系(示例)
std::vector<std::pair<int, int>> jointConnections = {
    {0, 1},   // 头→肩
    {1, 2},   // 肩→肘
    {2, 3},   // 肘→腕
    // 可添加其他关节连接...
};

// 绘制红色实心关节点
for (int j = 0; j < sn.numJoints; j++) { // 假设sn.numJoints是关节总数
    cv::Point jointPos(sn.joints[j].x, sn.joints[j].y); // 假设sn.joints是关节坐标数组
    cv::circle(skeletonImg, jointPos, 5, cv::Scalar(0, 0, 255), -1);
}

// 绘制绿色关节连线
for (auto& conn : jointConnections) {
    cv::Point pt1(sn.joints[conn.first].x, sn.joints[conn.first].y);
    cv::Point pt2(sn.joints[conn.second].x, sn.joints[conn.second].y);
    cv::line(skeletonImg, pt1, pt2, cv::Scalar(0, 255, 0), 2);
}

// 保存绘制好的骨架图像
cv::imwrite("output_skeleton.jpg", skeletonImg);

注意:上面的代码需要根据你SLR_ST_Sn结构体的实际成员调整(比如关节数组的名称、关节数量的变量名等),核心思路就是把骨架的关键点和连线画到图像载体上,再用cv::imwrite保存。


内容的提问来源于stack exchange,提问作者peony

火山引擎 最新活动