2015-02-04 3 views
-2
определения

Класса:C++, изменяя переменный класс внутри метода класса

class videoPlay { 
public: 
    VideoCapture video; 
    int cannyThreshold; 
    int houghThreshold; 
    int clickX; 
    int clickY; 
    int sB; 
    int clickRadius; 
    bool playVideo; 
    bool edgeDetection; 
    Mat selectedBall; 
    Mat frame; 
    Mat origFrame; 
    vector<Vec3f> houghCircles; 

    videoPlay(VideoCapture video) : video(video) {} 
    void nextFrame(); 
    void houghTransform(); 
    void detectEdges(); 
    void drawFrame(); 
    void mouseActionListener(int event, int x, int y, int flags, void* userdata); 
    void selectBall(); 
    void addLabel(int num); 
}; 

Два метода

void videoPlay::selectBall() { 
    frame = origFrame.clone(); 
    for(int i = 0; i < houghCircles.size(); i++) { 
     int x = houghCircles[i][0]; 
     int y = houghCircles[i][1]; 
     int radius = cvRound(houghCircles[i][2]); 

     float circleEq = pow(clickX - x, 2) + pow(clickY - y, 2); 
     Point center(cvRound(x), cvRound(y)); 

     if(circleEq <= pow(radius, 2)) { 
      circle(frame, center, radius, Scalar(255, 0, 255), 4, 8, 0); 
      sB = i; 
      cout << sB << " - " << i << endl; 
     } else { 
      circle(frame, center, radius, Scalar(0, 0, 255), 2, 8, 0); 
     } 
    } 
} 

void videoPlay::addLabel(int num) { 
    cout << sB << endl; 
    int x = (int)houghCircles[sB][0]; 
    int y = (int)houghCircles[sB][1]; 
    putText(frame, "1", Point(x, y), 1, 1, Scalar(255, 255, 0), 1, 8, 0); 
} 

Я называю videoplayobject.selectBall() в mouseclick обратного вызова. Затем он устанавливает sB мячу (если есть), в котором находится указатель мыши. Затем я нажимаю на клавиатуре и внутри switch statement после вызова метода addLabel. Он должен использовать sB для индексации в houghCircles вектора по номеру, указанному в selectBall, но вместо этого он возвращается к исходному значению, которое создается в sB. По какой-то причине sB не должным быть установлен внутри selectBall()

sB устанавливается сказать 2 в методе selectBall, но когда addLabel приходит использовать sB индексировать в векторе, то sB не ==, что он был установлен в в selectBall. Я делаю что-то очень глупое?

Большое спасибо.

+2

Ничто не кажется, неправильно в опубликованном коде. Возможно, вы можете опубликовать [MCVE] (http://stackoverflow.com/help/mcve). –

+0

Вы вызываете два метода на одном экземпляре 'videoPlay'? –

+0

Я - Сандер. Я на самом деле тупой, это сводит меня с ума! –

ответ

0

Я бы установил, что два обратных вызова используют один и тот же экземпляр videoPlay. Вы можете сделать это, например. как это в течение двух методов:

cout << "this = '" << this << "'" << endl; 

(. К сожалению, я думаю, что это будет лучше в качестве комментария, но я не хватает респ еще добавить комментарии ...)

+0

Похоже, что мой mouseCallback не использует правильный экземпляр videoPlay. Большое спасибо за Вашу помощь! Если бы я мог, я бы ответил. –

Смежные вопросы