FindChessboardCorners ne peut pas détecter l'échiquier sur de très grandes images par de longues lentilles de focale
Je peux utiliser FindChessboardCorners fonctions pour les images que moins de 15 Méga pixels, telles que la 2k x 1,5 k. cependant lorsque je l'utilise sur l'image du REFLEX numérique, la résolution à 3700x5300, il ne fonctionne pas.
J'ai essayé d'utiliser redimensionner() afin de réduire la taille de l'image directement, alors qu'il travaille.
Évidemment, il y a quelques codé en dur ou d'un bogue dans le OpenCV code source.
Pourriez-vous m'aider à comprendre, ou m'indiquer un patch pour cela ?
J'ai trouvé quelqu'un a posté un sujet similaire en 2006, icidonc il semble que le problème subsiste.
Le code que j'ai utilisé, c'est comme
found = findChessboardCorners( viewGray, boardSize, ptvec,
CV_CALIB_CB_ADAPTIVE_THRESH + CV_CALIB_CB_FILTER_QUADS + CV_CALIB_CB_NORMALIZE_IMAGE + CV_CALIB_CB_FAST_CHECK);
Mise à jour
Juste ici de préciser. Je pense que l'algorithme fonctionne sur la grande résolution de l'image, mais il échoue lorsque l'échiquier occupent la plus grande proportion de l'image.
Par exemple, lorsque j'utilise un 50mm fixe l'objectif sur la même position de la caméra, FindChessboardCorners n'échoue jamais. Après je l'ai changer pour 100 mm lentille fixe, la fonction commence à arrêter la détection du motif. Je pense qu'il est lié à la proportion ou la longueur focale.
L'image ci-dessous est le 100mm objectif de résultat.
Mise à jour 2
J'ai ajouté un filtre de netteté à l'image de grande taille, et il commence à résoudre le problème.
Tout d'abord j'ai utilisé
//do a sharpen filter for the large resolution image
if (viewGray.cols > 1500)
{
Mat temp ;
GaussianBlur(viewGray,temp, Size(0,0), 105) ; //hardcoded filter size, to be tested on 50 mm lens
addWeighted(viewGray, 1.8, temp, -0.8,0,viewGray) ; //hardcoded weight, to be tested.
//imwrite("test"+ imageList[k][i], viewGray) ;
}
found = findChessboardCorners( viewGray, boardSize, ptvec,
CV_CALIB_CB_ADAPTIVE_THRESH + CV_CALIB_CB_FILTER_QUADS + CV_CALIB_CB_NORMALIZE_IMAGE + CV_CALIB_CB_FAST_CHECK);
Téléchargé l'image:
Une image jpg à la résolution d'origine 3744 x 5616, si ce site convertir de force, alors assurez-vous d'utiliser la bonne résolution.
source d'informationauteur tomriddle_1234
Vous devez vous connecter pour publier un commentaire.
Quelques points.
Si vous avez accès à la OpenCV source et de la rebâtir, alors peut-être vous pouvez déboguer le comportement de
cvFindChessboardCorners
.Vous avez à
#define
DEBUG_CHESSBOARD
et puis vous avez peu d'aide dans la compréhension de l'algorithme.Je pense que OpenCV 2.4 a cette capacité (voir, par exemple,https://github.com/Itseez/opencv/blob/2.4/modules/calib3d/src/calibinit.cpp).
En outre, même si elle ne semble pas s'appliquer à votre cas, OpenCV doc donne une exigence pour la cible de calibrage:
http://docs.opencv.org/modules/calib3d/doc/camera_calibration_and_3d_reconstruction.html#findchessboardcorners