2013-05-10 1 views
4

Выглядит обманчиво. Ведь мы знаем, что станд или OpenCV вектор может быть легко преобразован в Матрице, как это:преобразовать матрицу openCV в вектор

vector<Point> iptvec(10); 
Mat iP(iptvec); 

Реверс предлагается в OpenCV шпаргалка:

vector<Point2f> ptvec = Mat_ <Point2f>(iP); 

Однако есть один нюанс: матрица должен иметь только одну строку или один столбец. Чтобы преобразовать произвольную матрицу нужно изменить:

int sz = iP.cols*iP.rows; 
vector<Point2f> ptvec = Mat <Point2f>(iP.reshape(1, sz)); 

В противном случае вы получите сообщение об ошибке:

* OpenCV Ошибка: не удалось Assertion (тускнеет == 2 & & (размеры [0] == 1 | | размеры [1] == 1 || размеры [0] * размеры [1] == 0)) в файле create/file /home/.../OpenCV-2.4.2/modules/core/src/matrix.cpp , line 1385 ...

+3

Возникает вопрос? – alrikai

ответ

1

Создайте вектор 2dim и заполните каждую строку. Например:

Mat iP=Mat::zeros(10, 20, CV_8UC1); 
vector<vector<int>> ptvec; 
for (int i = 0; i < iP.rows; i++) 
{ 
    vector<int> row;  
    iP.row(i).copyTo(row); 
    ptvec.push_back(row); 
} 
+0

Обратите внимание, что при создании вектора известного размера всегда лучше распределять память, потому что существует огромная разница в производительности. Итак, было бы предпочтительнее: vector > ptvec (iP.rows, vector (iP.cols)); – kotakotakota