2015-11-30 3 views
0

У меня есть изображение, которое я помещаю в вектор uchar, который я отправляю от процессора к процессору с использованием открытого mpi, однако мне нужно поместить вектор uchar в cv::Mat.Vector of Uchar to cv :: Mat

Есть ли простой способ сделать это?

cv::Mat image_on_proc = newpopulation(cv::Rect(0, start, population.cols, rows_in_section)); 
    std::vector<byte> img = matToBytes(image_on_proc); 

    std::vector<uchar> test; 
    for(int i=0; i<image_on_proc.rows; i++) 
    { 
     for(int j=0; j<image_on_proc.cols; j++) 
     { 
    test.push_back(image_on_proc.at<uchar>(i,j)); 
     } 
    } 

    MPI_Barrier(MPI_COMM_WORLD); 

    MPI_Send(&test[0],test.size()*sizeof(uchar), MPI_BYTE, 0, 99, MPI_COMM_WORLD); 

Вышеприведенные показывает, как я положил изображение в вектор и отправить его, есть соответствующая RECV и она работает, но я не знаю, как превратить его обратно в изображение.

+1

'резюме :: Mat imgFromVector = резюме :: Mat (строки, перевалы, CV_8UC1, vector.data()) клон(); 'можно опустить .clone, если вы не хотите копировать данные. – Micka

ответ

1

Вы можете хранить Mat в vector<uchar> с помощью:

Mat img = ...; // img must be CV_8UC1 in this example 
vector<uchar> v(img.begin<uchar>(), img.end<uchar>()); 

и обратно в Mat с помощью:

Mat img2(img.rows, img.cols, img.type(), v.data()); 

Обратите внимание, что здесь вы не копируете значения, но только создавая Mat заголовок для данных в v, поэтому img2 отразит любые изменения, сделанные на v. Если v выходит за пределы области видимости, то img2 становится недействительным. Вы можете просто использовать clone() для копирования данных, как:.

Mat img3 = Mat(img.rows, img.cols, img.type(), v.data()).clone(); 
Смежные вопросы