Проблема с преобразованием типа мата и доступом к отдельному пикселю

У меня возникла проблема при программировании с помощью OpenCV.
Спустя много времени я обнаружил, что результат cout ‹‹ mat и значение отдельного пикселя отличаются после преобразования типа.

это код

#include "opencv2/core/core.hpp"
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgproc/imgproc.hpp"
#include <iostream>
using namespace std;
using namespace cv;

int main() {
Mat a = (Mat_<int>(3, 3) << 1, 2, 3, 4, 5, 6, 7, 8, 9);
cout << "Initial mat type: " << a.type() << endl;
cout << "Pos(1, 1): " << a.at<int>(1, 1) << endl;

a.convertTo(a, CV_8U);
cout << "CV_8U converted mat type: " << a.type() << endl;
cout << "Mat content: \n" << a << endl;
cout << "Pos(1, 1): " << a.at<int>(1, 1) << endl;

return 0;
}

И результат здесь:

Initial mat type: 4 // CV_32S 
Pos(1, 1): 5
CV_8U converted mat type: 0 // CV_8U
Mat content: 
[1, 2, 3;
  4, 5, 6;
  7, 8, 9]
Pos(1, 1): -1254749944

Это означает, что после преобразования из CV_32S в CV_8U я получаю правильную матрицу из cout ‹‹ a, но при обращении к отдельному пикселю я получаю путаницу :|
Вы можете мне помочь? благодарить !


person pars    schedule 11.11.2013    source источник


Ответы (1)


Поскольку вы преобразовали значения в другой тип, вам нужно получить к ним доступ, используя другой тип:

cout << "Pos(1, 1): " << static_cast<int>(a.at<uchar>(1, 1)) << endl;
person Vaughn Cato    schedule 11.11.2013
comment
При использовании cout вы можете добавить явное приведение к типу int. cout << char(5) может не дать ожидаемого результата - person user1595178; 11.11.2013
comment
cout ‹‹ Pos(1, 1): ‹‹ (int)a.at‹uchar›(1, 1) ‹‹ endl; Все в порядке, спасибо. Я думаю, что понял проблему, почему результат cout ‹‹ a (распечатать мат) и значение отдельного элемента разные. Это потому, что cout ‹‹ a_mat печатает символ, а не целое число или что-то числовое? - person pars; 11.11.2013