OpenCV: проблема расположения памяти

Я только что установил OpenCV 2.4.10. Я использую бесплатную версию Visual Studio.
Он компилирует команды opencv, и я смог представить вход моей компьютерной камеры в окне.
Однако, похоже, что любая попытка получить доступ к значениям в объекте Mat не удалась. Если я начну с (например):

Mat M;
M.create(4, 4, CV_8UC(2));

Я вижу, что М не пусто, но:

double b = M.at<double>(0, 0);

результаты в:
Необработанное исключение в 0x75C92F71 в myOpenCVStudy.exe: исключение Microsoft C ++: std :: bad_alloc в ячейке памяти 0x006AECD4.

int a = countNonZero(M);

результаты в:
Необработанное исключение в 0x75C92F71 в myOpenCVStudy.exe: Microsoft C ++ исключение: cv :: Исключение в ячейке памяти 0x00ADF868.

а также:

cout << "M = " << endl << " " << M << endl << endl;

результаты в:
Необработанное исключение в 0x734ADE19 (msvcp100.dll) в myOpenCVStudy.exe: 0xC0000005: расположение чтения нарушения доступа 0x00000000.

Во втором случае я получаю «Символы не загружены». Кое-что о C: \ Windows \ SysWoW64 \ KernelBase.dll. Скажем, мне нужно изменить PDB и пути двоичного поиска (Microsoft Symbol Servers), как это делается.

Буду признателен за вашу помощь,

Спасибо,

Яир

0

Решение

Когда вы создали свой MatВы указываете тип как два канала 8-битных данных без знака, передавая CV_8UC(2) к create функция:

M.create(4, 4, CV_8UC(2));

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

double b = M.at<double>(0, 0);

Итак, вам нужно получить доступ, используя соответствующую структуру, такую ​​как Vec2b, который содержит два 8-битных байта:

Vec2b b = M.at<Vec2b>(0, 0);

Теперь вы можете получить доступ к значениям из каждого из двух каналов:

unsigned char uCH1 = b[0];
unsigned char uCH2 = b[1];

Причина того, что countNonZero сбои, вероятно, потому что согласно документации, он ожидает одноканальный вход, а не двухканальный. Запуск в режиме отладки должен был привести к соответствующему утверждению.

Если ты действительно делать хотите одноканальное изображение двойников, просто измените тип на CV_64F когда вы создаете это:

Mat M;
M.create(4, 4, CV_64F);

double b = M.at<double>(0, 0);

int a = countNonZero(M);
1

Другие решения

Ваше изображение имеет два канала, используйте cv :: Vec2b вместо double

cv::Mat M;
M.create(4, 4, CV_8UC(2));
...
cv::Vec2b b = M.at<cv::Vec2b>(0, 0);
0

Попробуйте создать коврик таким образом:

cv::Mat M = cv::Mat(2,2, CV_8UC3, Scalar(0,0,255));
0
По вопросам рекламы [email protected]