У меня возникли некоторые трудности при использовании функции DepthCleaner () с методом = DEPTH_CLEANER_NIL для очистки изображения глубины. Эта функция выпущена в OpenCV 3.0.0. Поэтому пока рано искать полезную документацию для этой функции. Если кто-то из вас уже использовал эту функцию, не могли бы вы сообщить мне, какой набор функций и кодов я использую для получения чистого изображения глубины. Допустим, у меня есть изображение глубины из Kinect1, названное «Img1.png». Я объявляю изображение и использую DepthCleaner следующим образом:
char fileName[64];
Mat depth_image = Mat(480, 640, CV_16UC1);
Mat output = Mat(480, 640, CV_16U);
snprintf(fileName, sizeof(fileName), "Depth_Image/Img1.png");
depth_image = imread(fileName, -1);
namedWindow("Input image",WINDOW_AUTOSIZE);
imshow ("Input image",depth_image);
DepthCleaner* depthc = new DepthCleaner(CV_16U, 3, DepthCleaner::DEPTH_CLEANER_NIL);
depthc->operator ()(depth_image,output);
namedWindow("depthCleaner",WINDOW_AUTOSIZE);
imshow ("depthCleaner",output);
Я использую C ++. Но у меня нет правильного результата. Я думаю, что я делаю что-то не так в кодах. Я также пытался использовать этот набор кодов:
char fileName[64];
Mat depth_image = Mat(480, 640, CV_16UC1);
Mat output = Mat(480, 640, CV_16U);
float fx = 525.0f, // default
fy = 525.0f,
cx = 319.5f,
cy = 239.5f;
Mat cameraMatrix = Mat::eye(3,3,CV_32FC1);
{
cameraMatrix.at<float>(0,0) = fx;
cameraMatrix.at<float>(1,1) = fy;
cameraMatrix.at<float>(0,2) = cx;
cameraMatrix.at<float>(1,2) = cy;
}
snprintf(fileName, sizeof(fileName), "Depth_Image/Img1.png");
depth_image = imread(fileName, -1);
namedWindow("Input image",WINDOW_AUTOSIZE);
imshow ("Input image",depth_image);
Mat point3DMat;
depthTo3d(depth_image, cameraMatrix, point3DMat);
DepthCleaner* depthc = new DepthCleaner(CV_16U, 3, DepthCleaner::DEPTH_CLEANER_NIL);
depthc->operator ()(point3DMat,output);
namedWindow("depthCleaner",WINDOW_AUTOSIZE);
imshow ("depthCleaner",output);
Но это мне тоже не помогло; получение ошибки компилятора для этой строки в приведенном выше фрагменте кода:
depthc->operator ()(point3DMat,output);).
Было бы очень полезно, если бы вы указали мне правильное направление.
Задача ещё не решена.