C/C++,  影像處理

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;
}

參考

留下一個回覆

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *