2011-12-19 3 views
0

Я работаю с OpenCV и C++ для проекта, и я нашел следующую проблему: после инициализации циновки со следующего утверждениемошибка присваивания с Mat OpenCV

Mat or_mat=Mat(img->height,img->width,CV_32FC1); 

проверки следующего значения

or_mat.at <float> (i, j) = atan (fy/fx)/2 +1.5707963; 

После завершения возврата мата для вывода функции, но когда я иду читать, есть много значений, которые не соответствуют выходу. Точные неправильные значения для I-4.31602e +008 вставляются, и если я делаю cout, значение выражения будет правильным. Что может быть ошибкой?

соответствующий код:

Mat or_mat=Mat(img->height,img->width,CV_32FC1); 

to angle 
if(fx > 0){ 
    or_mat.at<float>(i,j) = atan(fy/fx)/2+1.5707963; 
} 
else if(fx<0 && fy >0){ 
    or_mat.at<float>(i,j) = atan(fy/fx)/2+3.1415926; 
} 
else if(fx<0 && fy <0){ 
    or_mat.at<float>(i,j) = atan(fy/fx)/2; 
} 
else if(fy!=0 && fx==0){ 
    or_mat.at<float>(i,j) = 1.5707963; 
} 

Я должен вычислить локальную ориентацию изображения отпечатка пальца, следующий код я опущены несколько заявлений и расчеты, которые не имеют ошибок.

+0

Сначала укажите канал: 'CV_32FC1' или' CV_32FC3'. И разместите соответствующий код. – Sam

ответ

2

Я бы трижды проверил, что вы правильно индексируете. Следующий код показывает мою инициализацию матрицы, полной нулей, а затем заполнение ее некоторым поплавком с использованием оператора .at. Он хорошо компилируется и работает:

int main() 
{ 

    int height = 10; 
    int width = 3; 

    // Initialise or_mat to with every element set to zero 
    cv::Mat or_mat = cv::Mat::zeros(height, width, CV_32FC1); 
    std::cout << "Original or_mat:\n" << or_mat << std::endl; 

    // Loop through and set each element equal to some float 
    float value = 10.254; 
    for (int i = 0; i < or_mat.rows; ++i) 
    { 
     for (int j = 0; j < or_mat.cols; ++j) 
     { 
      or_mat.at<float>(i,j) = value; 
     } 
    } 

    std::cout << "Final or_mat:\n" << or_mat << std::endl; 

    return 0; 
} 
+0

Я пробовал использовать только Mat, инициализирующий структуру следующим оператором: Mat or_mat = Mat (img-> height, img-> width, CV_32F); и присвоить значение, как указано выше. Ошибка сохраняется. –

+0

Вы, кажется, смешиваете между использованием 'CvMat *' и 'cv :: Mat' - это разные структуры, и вы, вероятно, должны выбрать тот или другой. – Chris

+0

Обратите внимание, что в [последней документации] (http://opencv.itseez.com/modules/core/doc/old_basic_structures.html#cvmat) 'CvMat' считается устаревшим ... – Chris

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