Класса: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
. Я делаю что-то очень глупое?
Большое спасибо.
Ничто не кажется, неправильно в опубликованном коде. Возможно, вы можете опубликовать [MCVE] (http://stackoverflow.com/help/mcve). –
Вы вызываете два метода на одном экземпляре 'videoPlay'? –
Я - Сандер. Я на самом деле тупой, это сводит меня с ума! –