文章目录

  • 1 C++中如何调用python 中numpy数组变量——xml文件
  • 2 C++中如何调用python 中list列表——txt文件
  • 3 C++中如何调用python 中dict字典——csv文件
  • 补充(1) numpy随机数生成
  • 补充(2) C++ opencv Mat
  • 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\.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