2010-08-02 5 views
2

Im en utilisant Xcode et C++OpenCV HoughCircles

j'ai copié le code de HoughCircles du OpenCV documentation:

#include <cv.h> 
#include <highgui.h> 
#include <math.h> 

using namespace cv; 

int main(int argc, char** argv) 
{ 
    Mat img, gray; 
    if(argc != 2 && !(img=imread(argv[1], 1)).data) 
     return -1; 
    cvtColor(img, gray, CV_BGR2GRAY); 
    // smooth it, otherwise a lot of false circles may be detected 
    GaussianBlur(gray, gray, Size(9, 9), 2, 2); 
    vector<Vec3f> circles; 
    HoughCircles(gray, circles, CV_HOUGH_GRADIENT, 
       2, gray->rows/4, 200, 100); 
    for(size_t i = 0; i < circles.size(); i++) 
    { 
     Point center(cvRound(circles[i][0]), cvRound(circles[i][1])); 
     int radius = cvRound(circles[i][2]); 
     // draw the circle center 
     circle(img, center, 3, Scalar(0,255,0), -1, 8, 0); 
     // draw the circle outline 
     circle(img, center, radius, Scalar(0,0,255), 3, 8, 0); 
    } 
    namedWindow("circles", 1); 
    imshow("circles", img); 
    return 0; 
} 

puis modifiée comme suit:

int main(int argc, char** argv) 
{ 
    VideoCapture cap(0); 
    if(!cap.isOpened()) 
     return -1; 
    namedWindow("circles", 1); 

    Mat img, gray; 
    for(;;) 
    { 

     cap >> img; 
     vector<Vec3f> circles;  
     cvtColor(img, gray, CV_BGR2GRAY); 
     GaussianBlur(gray, gray, Size(7,7), 1.5, 1.5); 
     HoughCircles(img, circles, CV_HOUGH_GRADIENT, 2, img->rows/4, 200, 100); 
     imshow("circles", img); 
     if(waitKey(30) >= 0) break; 
    } 

    return 0; 
} 

je reçois l'erreur sur les deux cas: erreur: l'opérande de base de '->' a un type de non-pointeur 'cv :: Mat' puis je remplace le -> par. et encore obtenir une autre erreur. C'est la même chose avec le code que j'ai copié de la documentation. Ma théorie est que cela se produit parce qu'il ne reçoit pas et image ou quelque chose. mais quand je prends le code HoughCircles, la caméra fonctionne bien.

Des idées s'il vous plaît ??

Répondre

0

Les deux erreurs de compilation? Quelle erreur obtenez-vous lorsque vous utilisez . pour accéder aux photos de img? Je suis certain que vous devez pas utiliser -> dans ce cas puisque img n'est pas un pointeur vers Mat.

Selon le API reference manual (vous devriez prendre un butin à elle):

void HoughCircles(Mat& image, vector<Vec3f>& circles, int method, double dp, double minDist, double param1=100, double param2=100, int minRadius=0, int maxRadius=0); 

Vous devez passer l'adresse mémoire des objets img et cercles au lieu de passer les objets eux-mêmes.

Vous devriez faire quelque chose comme:

HoughCircles(&img, &circles, CV_HOUGH_GRADIENT, 2, img.rows/4, 200, 100); 
+0

oui les deux erreurs. l'erreur que je reçois en utilisant. : "cv :: HoughCircles (cv :: Mat const &, __gnu_debug_def :: vecteur , std :: allocateur >> &, int, double, double, double, double, int, int) ", référencé par: – Harry

+0

J'ai édité ma réponse pour fournir de meilleures informations pour vous. – karlphillip

2

D'abord, vous ne devez pas passer l'adresse de img et circles. HoughCircles prend des références, pas des pointeurs. Si vous essayez de passer &img et &circles, vous recevrez des erreurs de type nouvelles et passionnantes. Votre code d'origine est correct à cet égard.

Si la fonction a des pointeurs, il est la déclaration aurait été:

void HoughCircles(Mat * image, vector<Vec3f> * circles, ...); 

(qui est pas - je mentionner que pour quelqu'un d'autre qui est confondu par la syntaxe & en fonction C++ déclarations)

Deuxièmement, le -> ne fonctionnera pas car Mat est un objet, pas un pointeur. Je suis seulement légèrement surpris que la documentation originale soit fausse. L'interface C++ d'OpenCV (que vous utilisez, si vous utilisez cv::Mat) est un peu nouvelle, et la transition est toujours en cours. Cela a probablement été copié/collé à partir de la documentation de l'API C et -> a été manqué.

img.rows devrait fonctionner (et fonctionne pour moi). L'erreur que vous avez fournie pour l'affaire img.rows n'est pas une erreur complète, donc je ne sais pas pourquoi c'est une plainte.

La seule chose que je vois en ce moment est que le paramètre dp est un double, et vous passez un int. N'importe quel compilateur C++ que j'ai jamais utilisé fera cette upconversion pour vous, mais si votre compilateur est en mode paranoïa complète, vous pouvez essayer de changer 2 à 2.0. (Je doute vraiment que ce soit le problème, mais sans plus de détails sur l'erreur, je ne vois pas pourquoi vous obtenez des erreurs de compilation)

À l'exécution, cependant, il va exploser parce que vous passez HoughCircles votre img basé sur BGR d'origine au lieu de passer le canal unique gray.