Как заполнить Матрицу в OpenCV массивом глубины Pixel OpenNi
У меня проблема с OpenCV. После получения кадра глубины от kinect я пытаюсь заполнить матрицу (Mat of OpenCV) данными, возвращаемыми frame.getData ().
Проблема в том, что данные в матрице глубины не совпадают с данными, содержащимися в массиве p1 (из frame.getData ()).
Кто-нибудь знает, почему это, или как я должен заполнить свою Матрицу, чтобы получить правильный результат.
DepthPixel* p1 = (DepthPixel*)frame.getData();
Mat depthMat = Mat(frame.getHeight(), frame.getWidth(), CV_16U, p1);
1 ответ
Я проверил этот код с моей простой программой, и он отлично работает. Имейте в виду, однако, что вы делаете бросок. Функция getData()
возвращает const void *
что вы приводите неконстантный указатель. Это не очень хорошая практика. В документации неясно, возвращаются ли данные, на которые указывает указатель, getData()
имеет бесконечную продолжительность жизни.
Лучший способ сделать это - скопировать данные в буфер, а затем использовать этот буфер для инициализации cv::Mat
depth.readFrame(&depthFrame);
DepthPixel *depthPixels = new DepthPixel[depthFrame.getHeight()*depthFrame.getWidth()];
memcpy(depthPixels, depthFrame.getData(), depthFrame.getHeight()*depthFrame.getWidth()*sizeof(uint16_t));
cv::Mat depthImage(depthFrame.getHeight(), depthFrame.getWidth(), CV_16U, depthPixels);