2011-10-10 183 views
1

我不知道發生了什麼,因爲這是前幾天運行的宏,但現在我得到關於detectcircle()方法中的undelcared null標識符的錯誤。 if(p==null){return;}我不知道發生了什麼事。null未聲明的標識符錯誤

#include <stdio.h> 
    #include "cv.h" 
    #include "highgui.h" 
    #include <iostream> 
    #include <math.h> 
    #include <string.h> 
    #include <conio.h> 

using namespace std; 

IplImage* img = 0; 
CvMemStorage * cstorage; 
CvMemStorage * hstorage; 

void detectCircle(IplImage *frame); 


int main(int argc, char **argv) 
{ 
    CvCapture *capture = 0; 
    IplImage *frame = 0; 
    int  key = 0; 

    hstorage = cvCreateMemStorage(0); 
    cstorage = cvCreateMemStorage(0); 

    //CvVideoWriter *writer = 0; 
    //int colour = 1; 
    //int fps = 25; 
    //int frameW = 640; 
    //int frameH = 480; 
    //writer = cvCreateVideoWriter("test.avi",CV_FOURCC('P', 'I', 'M', '1'),fps,cvSize(frameW,frameH),colour); 

    //initialise camera 
    capture = cvCaptureFromCAM(0); 

    //check if camera present 
    if (!capture) 
    { 
     fprintf(stderr, "cannot open webcam\n"); 
     return 1; 
    } 

    //create a window 
    cvNamedWindow("Snooker", CV_WINDOW_AUTOSIZE); 

    while(key !='q') 
    { 

    //get frame 
     frame = cvQueryFrame(capture); 
     //int nFrames = 50; 
     //for (int i=0; i<nFrames;i++){ 
      //cvGrabFrame(capture); 
      //frame = cvRetrieveFrame(capture); 
      //cvWriteFrame(writer, frame); 
     //} 

    //check for frame 
     if(!frame) break; 

     detectCircle(frame); 


    //display current frame 
     //cvShowImage ("Snooker", frame); 

     //exit if Q pressed 
     key = cvWaitKey(20); 

    } 
    // free memory 
    cvDestroyWindow("Snooker"); 
    cvReleaseCapture(&capture); 
    cvReleaseMemStorage(&cstorage); 
    cvReleaseMemStorage(&hstorage); 
    //cvReleaseVideoWriter(&writer); 

    return 0; 
} 
void detectCircle(IplImage * img) 
{ 
    int edge_thresh = 1; 
    IplImage *gray = cvCreateImage(cvSize(img->width,img->height), 8, 1); 
    IplImage *edge = cvCreateImage(cvSize(img->width,img->height), 8, 1); 

    cvCvtColor(img, gray, CV_BGR2GRAY); 

    gray->origin = 1; 

    // color threshold 
    cvThreshold(gray,gray,100,255,CV_THRESH_BINARY);  

    // smooths out image 
    cvSmooth(gray, gray, CV_GAUSSIAN, 11, 11); 

    // get edges 
    cvCanny(gray, edge, (float)edge_thresh, (float)edge_thresh*3, 5); 

    // detects circle 
    CvSeq* circle = cvHoughCircles(edge, cstorage, CV_HOUGH_GRADIENT, 1, 
     edge->height/50, 5, 35); 

    // draws circle and its centerpoint 
    float* p = (float*)cvGetSeqElem(circle, 0); 
    if(p==null){ return;} 

    cvCircle(img, cvPoint(cvRound(p[0]),cvRound(p[1])), 3, CV_RGB(255,0,0), -1, 8, 0); 
    cvCircle(img, cvPoint(cvRound(p[0]),cvRound(p[1])), cvRound(p[2]), CV_RGB(200,0,0), 1, 8, 0); 

    cvShowImage ("Snooker", img); 
} 
+0

這應該是什麼語言,C或C++? – Staven

回答

4

NULL代替nullNULL是一個實現定義的宏,表示空指針常量(標準中爲18.1.4)。通常,它是:

#define NULL 0 
0

這是這麼長時間,因爲我不得不用C,我不得不看這件事編程,但我認爲你的意思是NULL 。

它將「null」作爲未聲明的變量。

+0

雅,任何想法如何解決它? – user966890

+2

我想我告訴過你如何解決它。 –

0

區分大小寫,NULL而不是null,不是嗎?

+0

是的。謝謝。太明顯了,那是 – user966890

+0

@ user966890,如果太明顯了,爲什麼不能自己弄清楚? –