C++移植python模型及中间参数
文章目录
1 C++中如何调用python 中numpy数组变量——xml文件
(1)Python中写入xml文件:
arr = np.random.random((10, 10))
cv_file = cv2.FileStorage(“./arr.xml”, cv2.FileStorage_WRITE)
cv_file.write("arr ", arr)
cv_file.release()
(2)C++中读取xml文件:
string path = "./arr.xml";
cv::FileStorage cv_file(path, cv::FileStorage::READ);
cv::Mat arr;
cv_file["arr"] >> arr;
cv_file.release();
打开xml文件,type_id前面对应的是变量名,如下arr为变量名
<?xml version="1.0"?>
<opencv_storage>
<arr type_id="opencv-matrix">
<rows>3</rows>
<cols>3</cols>
<dt>d</dt>
<data>
8.9535297591993968e-02 6.9886897302531437e-01 4.7054884894646920e-01
1.8916937579699100e-01 7.9890025562913491e-01 3.6986110618962009e-01
2.5680837013939484e-01 7.3721407264774441e-01 5.8065059731930979e-01</data></arr>
</opencv_storage>
(3)补充:
Python中读取xml文件:
cv_read_file = cv2.FileStorage("./arr.xml", cv2.FileStorage_READ)
arr_read = cv_read_file.getNode("arr").mat()
cv_read_file.release()
print("arr_read:\n", arr_read)
(4)注意:
用arr = cv2.imread(“,./1.jpg) 替换arr = np.random.random((10, 10))也是可以的;
也就是读取到图片内容和创建的数组都可以保存为xml文件;
其中arr类型为<class ‘NoneType’>,可通过arr = np.array(arr)变成<class ‘numpy.ndarray’>;
2 C++中如何调用python 中list列表——txt文件
(1)Python中list列表写入txt文件:
# 列表写入**txt**,按行写入**
list = [123, 323, 223, 423, 623, 523]
filename = open('list.txt', 'w')
for value in list:
filename.write(str(value) + "\n")
filename.close()
(2)C++中读取txt文件,放入vector:
string path = "./list.txt";
ifstream fin(path); // #include<fstream>
vector list;
string line;
if (fin)
{
while (getline(fin, line)) //#include<string> 有opencv就不用加了
{
cout << line << endl;
list.push_back(line);
}
}
3 C++中如何调用python 中dict字典——csv文件
(1)python保存dict文件
import csv
# dict相关属性
A = {"A": 1, "B": 2, "C": 3}
key = A.keys()
value = A.values()
item = A.items() # items()方法把字典中每对key和value组成一个元组,并把这些元组放在列表中返回。
print(item) # dict_items([('A', 1), ('B', 2), ('C', 3)])
print(key) # dict_keys(['A', 'B', 'C'])
print(list(key)[0]) # A
# dict写入csv,第一行为key,第二行为value
f_dict = open("./1.csv", "w", newline='') # newline='',不加该句第二行会空行
writer = csv.DictWriter(f_dict, key) # list(key)
writer.writeheader() # 写入表头,key的内容写入表头
writer.writerow(A)
writer.writerow(A)
(2)C++调用csv,实现dict功能(map函数)
#include<iostream>
#include<opencv2/opencv.hpp>
#include<fstream>
using namespace std;
using namespace cv;
vector<string> splitstr(const std::string& str, char tag);
int main()
{
string path = "F:\\Users\\whd\\Desktop\\AS\\AS_whd\\Predict\\1.csv";
ifstream f_csv(path);
vector<vector<string>> dict;
while (!f_csv.eof())
{
string str;
vector<string> names;
getline(f_csv, str);
if (str != "") //特别注意csv读取时, 会读入csv最后一行空的,加上该句排除
{
names = splitstr(str, ',');
dict.push_back(names);
}
}
typedef map<string, string> smap; // map可以写成其他map<string, int>等形式
smap my_dict;
// 生成c++字典dict
for (int j = 0; j < dict[0].size(); j++)
{
my_dict[dict[0][j]] = dict[1][j];
}
//显示dict内容
smap::iterator it = my_dict.begin();
while (it != my_dict.end())
{
cout << "my_dict key:" << it->first << " -> " << "value:" << it->second << endl;
it++;
}
std::cout << "end" << std::endl;
return 0;
}
/*
作用:
根据分隔符分割字符串,返回分割后的vector<string>
参数:
str: 待分割的字符串
tag: 根据什么字符进行分割
返回值:
自带返回值,返回值类型为vector<string>,用于存放分割后的字符串;
*/
vector<string> splitstr(const std::string& str, char tag)
{
vector<string> li;
std::string subStr;
//遍历字符串,同时将i位置的字符放入到子串中,当遇到tag(需要切割的字符时)完成一次切割
//遍历结束之后即可得到切割后的字符串数组
for (size_t i = 0; i < str.length(); i++)
{
if (tag == str[i]) //完成一次切割
{
if (!subStr.empty())
{
li.push_back(subStr);
subStr.clear();
}
}
else //将i位置的字符放入子串
{
subStr.push_back(str[i]);
}
}
if (!subStr.empty()) //剩余的子串作为最后的子字符串
{
li.push_back(subStr);
}
return li;
}
(3)注意:**txt文件也可以,分开保存keys和values到不同的txt文件
补充(1) numpy随机数生成
import numpy as np
np.random.seed(0)
print(np.random.random((3, 4))) # 或者写成**np.random.random((2, 2))**,将中括号改成小括号**
print(np.random.randn(3, 4)) # 正态分布**-1.96~1.96**之间,概率为**0.95**;有正有负,也不排除这个区间外的。**
print(np.random.rand(3, 4)) # 均匀分布,**0~1**之间。**
# 注意: random**和**rand**区别**
# 相同点:两个函数都是在 [0, 1) 的均匀分布中产生随机数。**
# 不同点:参数传递不同。**random.random( )**接收一个单独的元组,而**random.rand( )**接收分开的参数**
print(np.random.randint(5)) # 随机生成一个**0~5**之间的整数**
print(np.random.randint(5, 10)) # 随机生成一个**5~10**之间的整数。**
# 注意:有**high**值,就是**low~high**;无**high**值,就是**0~low
补充(2) C++ opencv Mat
(1)Mat.type()
opencv中Mat存在各种类型,其中mat有一个type()的函数可以返回该Mat的类型。类型表示了矩阵中元素的类型以及矩阵的通道个数,它是一系列的预定义的常量,其命名规则为CV_(位数)+(数据类型)+(通道数)。具体的有以下值:
通道数我们可以发现,C4=C3+8、C3=C2+8
(2)Mat类矩阵类型
Mat类矩阵类型可以是CV_8UC3、CV_16SC1…CV_64FC3等。里面的8U表示8位无符号整数(0~255),16S表示16位有符号整数(32768-32767),64F表示64位浮点double类型数据,C后面的数表示通道数,例如C1表示一个通道的图像,C3表示3个通道的图像。通道一般只有1、3、4,1个通道表示灰度图(0 - 255),3个通道为RGB图像(0 - 255, 0 - 255, 0 - 255),4个通道为RGBA(其中A代表透明度)。
(3)Mat创建及属性
cv::Mat image = Mat(240, 320, CV_8UC3, Scalar(135, 255, 135)); // 240**行(高),**320**列(宽)
cv::Mat image = Mat(240, 320, CV_8UC1, Scalar(0)); // 240**行(高),**320**列(宽)
cv::imshow("image", image); //1**通道和**3**通道都能显示
cv::waitKey(100);
cout << image.cols << endl; // 320
cout << image.rows << endl; // 240
cout << image.dims << endl; // 2
cout << image.channels() << endl; // 3
cout << image.size() << endl; // [320x240] //size**属性:**[**宽**x**高**]
cout << image.type() << endl; // 16
C++查看变量类型:
typeid(arr).name()
python查看变量类型:
type(arr)
本文地址:https://blog.csdn.net/weixin_41874898/article/details/111933941
上一篇: 关于IDEA配置文件字符集的问题
下一篇: 常见的数字验证正则表达式整理