Импортировать таблицу txt в качестве объекта OpenCV Mat (C ++) [duplicate]

Поскольку http-вызовы и т. п. являются асинхронными, вы получаете вместо Observable возвращаемое синхронное значение. Вы должны подписаться на него, и в обратном вызове вы получите данные.

Один вариант заключается в том, чтобы поместить вашу логику в вызов subscribe

getSomething() {
    return this._restService.addRequest('object', 'method').run()
        .subscribe(
            res => {
                // do something here
                res;
            },
            err => {
                console.error(err);
            }
        );
}

. Но мне нравится делать обратный вызов , чтобы ввести логику извне (возможно, компонент, возможно, другую службу):

getSomething(callback: (data) => void) {
    return this._restService.addRequest('object', 'method').run()
        .subscribe(
            res => {
                callback(res);
            },
            err => {
                console.error(err);
            }
        );
}

И в вашем компоненте или где угодно:

this._yourService.getSomething((data) => {
    // do something here
    console.log(data);
});
4
задан CrowStudio 25 November 2015 в 13:48
поделиться

1 ответ

Каждая строка файла csv представляет собой строку. Если ваше изображение равно 1 каналу, каждое значение представляет собой значение оттенка серого для пикселя:

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

Полученное изображение 3x3 1 канала:

Если ваше изображение имеет 3 канала, три последовательных значения в каждой строке представляют триплет bgr . Например:

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

приводит к 3-канальному 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;
}
6
ответ дан Miki 20 August 2018 в 11:21
поделиться
  • 1
    Похоже, что неправильно понимает, как выглядит матрица BGR, np.array только там, поэтому я могу передать что-то в код C ++. Я изменю свой np.array на правильно выглядящий BGR, как вы показали выше, спасибо за ваши ответы, я вернусь к вам после того, как я попробовал ваш пример ;-) @Miki – CrowStudio 25 November 2015 в 15:00
  • 2
    Работал как шарм! :-) – CrowStudio 25 November 2015 в 15:02
  • 3
    Рад, что это помогло: D – Miki 25 November 2015 в 15:02
Другие вопросы по тегам:

Похожие вопросы: