Я только что установил 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), как это делается.
Буду признателен за вашу помощь,
Спасибо,
Яир
Когда вы создали свой 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);
Ваше изображение имеет два канала, используйте cv :: Vec2b вместо double
cv::Mat M;
M.create(4, 4, CV_8UC(2));
...
cv::Vec2b b = M.at<cv::Vec2b>(0, 0);
Попробуйте создать коврик таким образом:
cv::Mat M = cv::Mat(2,2, CV_8UC3, Scalar(0,0,255));