Actualmente estoy trabajando con un sensor de profundidad Orbbec Astra Mini. Descargué e instalé el paquete Astra Driver y OpenNI2. El sensor de profundidad se muestra en el administrador de dispositivos en mi Windows 10 tan pronto como lo conecto al puerto USB. Hasta ahora todo está bien.

Mi objetivo es leer RGB images y depth map con OpenCV y mostrarlos con imshow.

El siguiente código se compila bien en Visual Studio 2015, pero aparece este error:

OpenCV Error: Assertion failed (size.width>0 && size.height>0) in cv::imshow, file C:\build\master_winpack-build-win64-vc14\opencv\modules\highgui\src\window.cpp

... así que supongo que OpenCV no pudo abrir el dispositivo y, por lo tanto, mi cv :: Mat sigue estando vacío.

En algún lugar leí que necesito compilar OpenCV con la bandera OpenNI, ¿es cierto? Si es así, ¿algún enlace útil que pueda ayudarme a progresar? ¿Alguna idea de lo que me podría haber perdido?

#include<iostream>
#include<algorithm>
#include<fstream>
#include<System.h>
#include<time.h>
#include<opencv2/core/core.hpp>

using namespace std;

int main(int argc, char **argv) {

    cv::VideoCapture cap;
    cap.open(CV_CAP_OPENNI);
    cap.set(CV_CAP_OPENNI_IMAGE_GENERATOR_OUTPUT_MODE, CV_CAP_OPENNI_VGA_30HZ);
    cap.set(CV_CAP_OPENNI_DEPTH_GENERATOR_REGISTRATION, 1);

    cv::Mat im, dm;     // rgb image, depth map

    while (true)
    {

        if (cap.grab()) {
            cap.retrieve(im, CV_CAP_OPENNI_BGR_IMAGE);
            cap.retrieve(dm, CV_CAP_OPENNI_DEPTH_MAP);
        } else {
            cout << "ERROR: Could not grab image data." << endl;
        }

        if (!im.data) {
            cout << "ERROR: RGB not retrieved." << endl;
        }

        if (!dm.data) {
            cout << "ERROR: Depth map not retrieved." << endl;
        }

        cv::imshow("Image", im);
        cv::imshow("Depth", dm);

        if (cv::waitKey(1) >= 0)
            break;
    }

    cap.release();

    return 0;
}

ACTUALIZACIÓN 19.02.18:

Problema resuelto compilando las bibliotecas OpenCV con el indicador OpenNI como se describe aquí. ¡Gracias Dmitrii!

Sin embargo, la imagen de profundidad sigue siendo bastante débil. ¿Alguna idea de dónde / cómo ajustar los parámetros? Aunque, al ejecutar las aplicaciones de muestra del Orbbec Astra SDK, la imagen de profundidad es bastante sólida (que funcionan con OpenGL). Entonces, ¿supongo que el problema está en algún lugar dentro de OpenCV?

Aquí hay una captura de pantalla del mapa de profundidad (invertido a blanco, resonancia bastante débil):

enter image description here

1
salocinx 17 feb. 2018 a las 01:42

2 respuestas

La mejor respuesta

Escribí una guía completa sobre cómo compilar ORB SLAM 2 (que era mi objetivo preliminar) con OpenCV que incluye OpenNI2 para utilizar mi Cámara Orbbec Astra como sensor de profundidad. Con suerte, alguien más que tropiece con este hilo pueda usarlo.

0
salocinx 20 feb. 2018 a las 15:04

Tu preguntaste:

Sin embargo, la imagen de profundidad sigue siendo bastante débil. ¿Alguna idea de dónde / cómo ajustar los parámetros? Aunque, al ejecutar las aplicaciones de muestra del Orbbec Astra SDK, la imagen de profundidad es bastante sólida (que funcionan con OpenGL). Entonces, ¿supongo que el problema está en algún lugar dentro de OpenCV?

Intente implementar un mapa de color falso a la imagen de profundidad. Los diferentes píxeles de profundidad tienen valores que varían mucho y, por lo tanto, no son fácilmente discernibles si se ven directamente.

 // Holds the colormap version of the image:
 Mat img_color;
 // Apply the colormap:
 applyColorMap(img_in, img_color, COLORMAP_JET);
 // Show the result:
 imshow("colorMap", img_color);

https://docs.opencv.org/3.4.1/d3/d50/group__imgproc__colormap.html

0
Pang 24 may. 2018 a las 01:28