VS C++:讀寫 CSV 的方法 (搭配OpenCV使用)
前言
這禮拜要開始開發"Python訓練好的CNN權重移植到VS C++"上,由於我是用CNN來預測人臉特徵點,因此需要在圖片上顯示預測的結果,以確保模型移植成功。
為了能將預測結果在影像上標示出來,我一樣會在VS C++上使用OpenCV來幫我完成,也因此要在VS C++裡面建置OpenCV的環境,這部分之前就有安裝過可以參考之前文章。
為了先熟悉如何在VS C++上面標示特徵點出來,我試著在VS C++中讀取CSV檔,(這部分是參考網路上的程式,連結我放在最下面),讀完之後再將這些點用OpenCV繪製在影像上。
讀取
#include <fstream>
#include <sstream>
#include <iostream>
using namespace std;
int main()
{
//std::cout << "Hello World!\n";
vector<double> matrix;
fstream file;
file.open("..\\..\\LM_0.csv");
string line;
while (getline(file, line, '\n')) //讀檔讀到跳行字元
{
istringstream templine(line); // string 轉換成 stream
string data;
while (getline(templine, data, ',')) //讀檔讀到逗號
{
matrix.push_back(atof(data.c_str())); //string 轉換成數字
}
}
file.close();
std::cout << matrix.size() << endl;
for (int i = 0; i < matrix.size()/2; ++i) {
std::cout << matrix[i*2] << " " << matrix[i*2 + 1] << endl;
}
return 0;
}
寫入
#include <iostream>
#include <fstream>
#include <sstream>
using namespace std;
int main()
{
vector<double> matrix;
file.open(".\\..\\LM_0.csv");
for (int i=0;i<matrix.size();i++)
{
file << matrix[i]<<",";
}
file.close();
return 0;
}
讀取CSV並搭配OpenCV使用
#include <fstream>
#include <sstream>
#include <iostream>
#include <opencv2/opencv.hpp>
using namespace std;
using namespace cv;
int main()
{
//std::cout << "Hello World!\n";
vector<double> matrix;
//readfile
fstream file;
file.open("..\\..\\LM_0.csv");
string line;
while (getline(file, line, '\n')) //讀檔讀到跳行字元
{
istringstream templine(line); // string 轉換成 stream
string data;
while (getline(templine, data, ',')) //讀檔讀到逗號
{
matrix.push_back(atof(data.c_str())); //string 轉換成數字
}
}
file.close();
std::cout << matrix.size() << endl;
Mat img = imread("..\\..\\PF_0.png", -1);
if (img.empty()) return -1;
for (int i = 0; i < matrix.size()/2; ++i) {
std::cout << matrix[i*2] << " " << matrix[i*2 + 1] << endl;
circle(img, Point(matrix[i*2], matrix[i*2 + 1]), 2, Scalar(255, 255, 255), -1);
}
imshow("frame", img);
waitKey(0);
destroyAllWindows();
return 0;
}