2012-06-05 19 views
5

Estoy tratando de usar cv::calcOpticalFlowPyrLK pero a veces una afirmación interna en esa función falla. La afirmación es npoints = prevPtsMat.checkVector(2, CV_32F, true)) >= 0. Estoy usando OpenCV 2.3.1. El código fuente para esta función está disponible here.cv :: goodFeaturesToTrack no devuelve ninguna característica

Es difícil entender mi código, especialmente debido a mi experiencia limitada con gráficos de computadora y su falta de comentarios. ¿Por qué se activa esta afirmación y qué dice acerca de mi problema?

Editar: I llamar a la función como sigue:

cv::calcOpticalFlowPyrLK(curBwFrame, prvFrame, features, newFeatures, trackingStatus, errors); 

descubrí que el vector features, que se obtuvo llamando cv::goodFeaturesToTrack(curBwFrame, features, 5, 0.2, 0.5, skinMask); con una máscara no vacío que parece ser lo suficientemente grande y una imagen válida, no contiene ninguna característica. ¿Cómo puede pasar esto?

curBwFrame

curBwFrame

skinMask

skinMask

soy capaz de reproducir el problema utilizando el siguiente fragmento de código:

#include <vector> 
#include <cassert> 
#include <opencv2\opencv.hpp> 
using std::vector; 
using namespace cv; 

int main() { 
    vector<Point2f> features; 
    cv::Mat curBwFrame = imread("curBwFrame.png"); 
    cv::cvtColor(curBwFrame, curBwFrame, CV_RGB2GRAY); 
    imwrite("test.png", curBwFrame); 

    cv::Mat skinMask = imread("skinMask.png"); 
    cv::cvtColor(skinMask, skinMask, CV_RGB2GRAY); 
    imwrite("test.png", skinMask); 

    cv::goodFeaturesToTrack(curBwFrame, features, 5, 0.2, 0.5, skinMask); 
    assert(features.size() > 0); 

    return 0; 
} 
+1

las afirmaciones que los cheques argumento de entrada es un vector de puntos. Y es difícil responder a tu pregunta sin tu código. –

+0

He agregado más información arriba, pero no estoy seguro de qué otra información podría ser relevante. Podría volcar algunos fragmentos de código grandes aquí, pero es probable que contengan mucha información irrelevante. – Pieter

+0

Disculpa por haber mezclado algunas llamadas a funciones antes. ¡Agregué el fragmento correcto arriba! También puedo publicar la máscara y la imagen de origen de 'goodFeaturesToTrack' si es necesario. – Pieter

Respuesta

4

El principal problema son su parameters.In el (cambio hay compatibilidad entre 2.3.1) OpenCV 2.3.2 documentation esta es la descripción de los parámetros del método:

void goodFeaturesToTrack(InputArray image, OutputArray corners, int maxCorners, double qualityLevel, double minDistance, InputArray mask=noArray(), int blockSize=3, bool useHarrisDetector=false, double k=0.04) 

Parámetros:

  • imagen - Entrada Imagen de 8 bits o coma flotante de 32 bits de un solo canal.
  • esquinas - Vector de salida de las esquinas detectadas.
  • maxCorners - Número máximo de esquinas para devolver. Si hay más esquinas que las encontradas, se devuelve la más fuerte de ellas.
  • qualityLevel - Parámetro que caracteriza la calidad mínima aceptada de las esquinas de la imagen.El valor del parámetro se multiplica por la mejor medida de calidad de esquina , que es el valor propio mínimo (consulte cornerMinEigenVal()) o la respuesta de la función Harris (consulte cornerHarris()). Las esquinas con la medida de calidad menor que el producto son rechazadas. Por ejemplo, si la mejor esquina tiene la calidad medida = 1500, y qualityLevel = 0.01, entonces se rechazan todas las esquinas con la medida de calidad inferior a 15.
  • minDistance - Distancia euclidiana mínima posible entre las esquinas devueltas .
  • máscara - Región de interés opcional. Si la imagen no está vacía (es necesita tener el tipo CV_8UC1 y el mismo tamaño que la imagen), especifica la región en la que se detectan las esquinas.
  • blockSize - Tamaño de un bloque promedio para calcular una matriz de covariación derivada de sobre cada vecindad de píxeles. Ver cornerEigenValsAndVecs().
  • useHarrisDetector - Parámetro que indica si se debe utilizar un detector Harris (vea la esquina Harris()) o cornerMinEigenVal().
  • k - Parámetro libre del detector Harris.

Te recomiendo que juegues un poco con qualityLevel y minDistance para satisfacer tus necesidades.

+0

Con qualityLevel = 0.1 ya pude detectar 5 funciones. –

+0

¿Cómo afectará un valor de 0.1 al margen de error? Sé que aumentará, pero ¿es este un valor de calidad comúnmente utilizado o se considera poco confiable? – Pieter

+0

¿Qué quiere decir con margen de error? goodFeaturesToTrack funciona en una clasificación de "grado" de cada píxel en una ventana con tamaño blockSize.Cuanto mayor es este "grado", más probable es que este píxel sea una característica correctamente diferenciable, lo que significa que si esa característica se ve en otras condiciones, como iluminación ambiental diferente o pose de cámara, seguirá clasificándose como la misma característica. Si un píxel no tiene una calificación suficientemente grande, no se clasifica como una característica. Cuanto menor sea el nivel de calidad, menor será el "grado" necesario para clasificar un píxel como característica, haciendo que las características extraídas sean menos diferenciables. –

1

¿Ha probado goodFeaturesToTrack sin una máscara para ver si detecta características dentro de la región enmascarada? Es posible que, debido a que la imagen sea oscura, y la región carezca de texturas, goodFeaturesToTrack no encuentre las características allí.

También puede probar ORB or FAST en lugar de goodFeaturesToTrack. He utilizado con éxito ORB con calcOpticalFlowPyrLK (pero no he intentado usar una máscara).

O podría tratar de aclarar la imagen o incluso mejorar el contraste. No estoy muy seguro de si esto trae mejoras porque creo que el mayor problema de su escenario es que los objetos en la escena no tienen suficiente textura o esquinas, que son las características más adecuadas para estos detectores. Te recomiendo que pruebes ORB y veas si obtienes más puntos.

+0

Cuando se omite la región de máscara, selecciona los siguientes píxeles: (864, 1170) y (859, 1149). Ninguno de estos puntos cae dentro de la región de máscara. No estoy familiarizado con ORB y FAST. ¿Dónde puedo encontrar más información sobre estas técnicas? No [encontré] (https://encrypted.google.com/search?hl=es&q=site%3Aopencv.willowgarage.com%20orb%20fast%20goodfeaturestotrack) la información en sus documentos. – Pieter

+0

Si solo detecta esos puntos sin máscara, lo más probable es que confirme lo que expliqué en la respuesta. Lo actualizaré con más información. –

0

¿La imagen comienza en color? Utilice cv :: transform para mejorar el contraste de color antes de convertirlo en gris. Dispare para una gama completa de gris, de 0 a 255. No se preocupe por saturar la imagen fuera de la máscara.

0

Si el código es similar a lo siguiente:

Imgproc.goodFeaturesToTrack(mCurrentFrame, initial, NUMBER_OF_FEATURES, 0.1, 10); 
//The OpenCV opticalFlow will crash if the feature vector does not include any elements 
if (initial.elemSize() == 0) { 
    return; 
} 
initial.convertTo(mPrevPts, CvType.CV_32FC2); 

Video.calcOpticalFlowPyrLK(mPreviousFrame, mCurrentFrame, mPrevPts, mNextPts, status,err); 

Asegúrese de que no se olvide la declaración de comprobar el tamaño del vector de características (initial.elemSize() == 0).

Si este vector está vacía, la conversión de una matriz de punto a puntos flotantes por el hecho initial.convertTo() de la línea no va a suceder y la afirmación se mostrará al llamar calOpticalFlowPyrLK

Cuestiones relacionadas