C++初学者求助:如何像Python一样简便保存数组变量为图像
在C++中用OpenCV保存图像(对应Python的cv2.imwrite)
嘿,作为C初学者,你完全不用担心——OpenCV的C接口里就有和Python中cv2.imwrite几乎一样简便的方法!下面针对你提到的两个变量分别说明:
一、保存RGB图像(color变量)
你的color是IplImage*类型,这是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




