2016-02-02 4 views
1

Я пытаюсь преобразовать вектор в матрице (128 * 128) с использованием C++ OpenCV это кодOpenCV преобразования вектора в матрице C++

Mat image = imread("1.jpg", 0); 
vector<double> vec ImgVec[i].assign(image.datastart, image.dataend); 
vector<double> avgFace = calAvgFace(vec); 
Mat img=avgFace; 

последняя строка кода не является правильным, но просто пример.

+1

[дубликат] (http://stackoverflow.com/questions/20980723/convert-mat-to-vector-float-and-vectorfloat-to-mat-in-opencv) –

ответ

5

Хотя тот же вопрос был задан до и был дан ответ, например .:

Я думаю, ясное объяснение очевидного решения до сих пор отсутствует. Отсюда мой ответ.


OpenCV предоставляет два простых способ превращающих std::vector к cv::Mat, используя Mat конструкторов:

  • Constructor, которая принимает указатель на данные
  • Constructor, который принимает std::vector.

Вы можете создать копию векторных данных (если вы измените vector, данные в Mat будет без изменений), или создать Matвид содержания в векторе (если вы измените vector, Mat покажет изменения).

Пожалуйста, взгляните на этот код. Сначала я создаю случайный Mat двойника, который я копирую в vector. Затем примените некоторую функцию, которая принимает этот вектор и возвращает новый. Это было только для согласования кода с вашими требованиями. Затем вы можете увидеть, как получить cv::Mat с std::vector с копированием или без копирования данных.

#include <opencv2/opencv.hpp> 
using namespace std; 
using namespace cv; 

vector<double> foo(const vector<double>& v) 
{ 
    // Apply some operation to the vector, and return the result 

    vector<double> result(v); 
    sort(result.begin(), result.end()); 
    return result; 
} 

int main() 
{ 
    // A random CV_8UC1 matrix 
    Mat1d dsrc(128,128); 
    randu(dsrc, Scalar(0), Scalar(1)); 

    imshow("Start double image", dsrc); 
    waitKey(); 

    // Get the vector (makes a copy of the data) 
    vector<double> vec(dsrc.begin(), dsrc.end()); 

    // Apply some operation on the vector, and return a vector 
    vector<double> res = foo(vec); 

    // Get the matrix from the vector 

    // Copy the data 
    Mat1d copy_1 = Mat1d(dsrc.rows, dsrc.cols, res.data()).clone(); 

    // Copy the data 
    Mat1d copy_2 = Mat1d(res, true).reshape(1, dsrc.rows); 

    // Not copying the data 
    // Modifying res will also modify this matrix 
    Mat1d no_copy_1(dsrc.rows, dsrc.cols, res.data()); 

    // Not copying the data 
    // Modifying res will also modify this matrix 
    Mat1d no_copy_2 = Mat1d(res, false).reshape(1, dsrc.rows); 


    imshow("Copy 1", copy_1); 
    imshow("No Copy 1", no_copy_1); 
    waitKey(); 

    // Only no_copy_1 and no_copy_2 will be modified 
    res[0] = 1.0; 

    imshow("After change, Copy 1", copy_1); 
    imshow("After change, No Copy 1", no_copy_1); 
    waitKey(); 

    return 0; 
} 
Смежные вопросы