4

PythonスクリプトからパイプしたCSV文字列からcv::Matを作成しようとしています。私は現在、python 2.7、C++、および OpenCV 3.0 を使用しています。OpenCV 2.4 でそれを行う方法しかわかりませんが、問題は、ml::TrainData が何らかの形で代わりに使用される 3.0 とは大きく異なることです。私はそれがどのように機能するのか理解できず、サンプルコードもありません! :-(

私のpython-scriptが行うことは、np.arrayをCSVとしてパイプすることです。次のようになります。

import sys
import numpy as np
import csv


csvToSend = csv.writer(sys.stdout, delimiter=',')

data = np.array([ [3, 7, 9],
               [1, 7, 0],
               [4, 12, 8]])

csvToSend.writerows(data)

python-script は現在、bgr RAW 形式で画像を送信するカメラをシミュレートしています。

パイプされたデータは私の C++ コードによって受信されます。コードは次のようになります。

#include <iostream>
#include <string>
#include <opencv2/core/core.hpp>

using namespace std;
using namespace cv;

string values = "", csvPart;
Mat img;
int i;

int main()
{
    for (i = 0; i < 3; i++)
    {

        cin >> csvPart; //here I get my CSV lines from python-script

        if (values == "") values = values + csvPart;

        else values = values + "\n" + csvPart;  //makes the CVS lines look like a 3x3 matrix again
    }

    cout << values << endl; //prints the CVS to see that it looks like it did before piping it over to the C++ code

    /* how the printed string looks like
    3,7,9 
    1,7,0
    4,12,8    */

/*      Here I want to load the "values" into the Mat img
        so I can do my mojo with openCV in C++          */
}

誰かがこれを手伝ってくれて、簡単なコード例を教えてくれれば幸いです。np.array を C++ コードにパイプして cv::Mat にロードするより良い方法があれば、私の腕はあなたのために開かれています! ;-)

4

1 に答える 1

6

csv ファイルの各行は行を表します。画像が 1 チャンネルの場合、各値はピクセルのグレースケール値です。

1,2,3 
4,5,6 
7,8,9 

結果の 3x3 1 チャンネル画像は次のとおりです。

ここに画像の説明を入力

画像が 3 チャンネルの場合、各行の 3 つの連続する値はbgrトリプレットを表します。たとえば、次のようになります。

1,2,3,200,100,200
4,5,6,47,205,103
7,8,9,95,23,209

3x2 の 3 チャンネル画像になります。

ここに画像の説明を入力

このloadFromCSV関数は、csv コンテンツの文字列と OpenCV 画像タイプを受け取り、画像を返します。

Mat loadFromCSV(const string& values, int opencv_type);

完全なコードを見てください。

#include <opencv2\opencv.hpp>
#include <string>
#include <sstream>
#include <iostream>
using namespace std;
using namespace cv;

Mat loadFromCSV(const string& values, int opencv_type)
{
    Mat m;

    stringstream ss(values);
    string line;
    while (getline(ss, line))
    {
        vector<double> dvals;

        stringstream ssline(line);
        string val;
        while (getline(ssline, val, ','))
        {
            dvals.push_back(stod(val));
        }

        Mat mline(dvals, true);
        transpose(mline, mline);

        m.push_back(mline);
    }

    int ch = CV_MAT_CN(opencv_type);

    m = m.reshape(ch);
    m.convertTo(m, opencv_type);
    return m;
}

int main()
{
    string values = "1,2,3\n4,5,6\n7,8,9";
    Mat img = loadFromCSV(values, CV_8UC1);
    //Mat img = loadFromCSV(values, CV_8UC3);

    //string values = "1,2,3,200,100,200\n4,5,6,47,205,103\n7,8,9,95,23,209";
    //Mat img = loadFromCSV(values, CV_8UC3);

    cout << "Img:" << endl;
    cout << img << endl;

    imshow("Img", img);
    waitKey();

    return 0;
}
于 2015-11-25T13:37:49.627 に答える