2016-09-27 4 views
1

Мне нужно создать объект Mat типа CV_32FC2 для хранения координатных точек, содержащихся в структуре KeyPoint. Я хочу сделать это внутри функции для ясности.Невозможно присвоить значения cv :: Mat внутри функции

void myfun(vector<KeyPoint>& k){ 
    Mat p1_dist(1, k.size(), CV_32FC2); 

    for(int i=0; i<k.size(); i++){ 
     p1_dist.at<double>(0, i)[0] = k1[i].pt.x; 
     p1_dist.at<double>(0, i)[1] = k1[i].pt.y; 
    } 
} 

Компилятор подчеркивает «p1_dist» внутри для цикла просят указатель на этот Мат. Если я напишу этот фрагмент кода внутри основной функции, ошибка не произойдет. Можете ли вы помочь мне указать на проблему?

+0

Вы понимаете, что после выхода из функции 'p1_dist' будет разрушена, и все, что вы делаете внутри цикла будет не зря? Если вы хотите сохранить объект «Мат» живым, вы должны передать его в свою функцию как указатель, чтобы изменения, происходящие внутри тела функции, фактически оставались. – rbaleksandar

+0

'p1_dist.at (0, i)' должен возвращать двойную ссылку, к которой нельзя получить доступ, как массив. Вы могли бы означать 'p1_dist.at (0, i)'. В противном случае я не буду следовать вашей проблеме с main. –

+0

Вы должны отправить точное сообщение компилятора, у вас есть точный ответ. – gia

ответ

1

Сначала вам нужно вернуть матрицу, которую вы создаете. Для того, чтобы соответствовать OpenCV, вы можете передать ссылку на Mat:

void myfun(const vector<KeyPoint>& k, Mat& p1_dist){ ... } 

Затем вам нужно получить доступ к значениям данных с правильным шаблоном. Если вам нужен CV_32FC2 матрицу, т.е. матрицу float с 2 каналами, вам нужно получить к нему доступ с: p1_dist.at<Vec2f>(row, col)[channel], то есть:

p1_dist.at<Vec2f>(0, i)[0] = k[i].pt.x; 
p1_dist.at<Vec2f>(0, i)[1] = k[i].pt.y; 

Это, как правило, понятнее использовать Mat_<Tp>, когда вы уже знаете, тип матрицы , Эквивалент CV_32FC2 будет Mat2f:

void myfun(const vector<KeyPoint>& k, Mat2f& p1_dist){ 
    ... 
    p1_dist(0, i)[0] = k[i].pt.x; 
    p1_dist(0, i)[1] = k[i].pt.y; 
    ... 
} 

Собираем все вместе:

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

void myfun(const vector<KeyPoint>& k, Mat2f& p1){ 
    p1 = Mat2f(1, k.size()); // Set proper size 

    for(size_t i=0; i<k.size(); i++){ 
     p1(0, i)[0] = k[i].pt.x; 
     p1(0, i)[1] = k[i].pt.y; 
    } 
} 

int main() 
{ 
    vector<KeyPoint> k = ...; 
    Mat2f p1_dist; 
    myfun(k, p1_dist); 

    // Use p1_dist 

    return 0; 
} 
+0

Большое спасибо за вашу помощь, я обращался к матрице с использованием неправильного шаблона. –

+0

Рад, что это помогло: D – Miki

Смежные вопросы