班级定义:
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
设置为鼠标指针所在的球(如果有的话)。然后在调用waitkey switch statement
方法后,在键盘上按{kbd> 1 并在addLabel
内。它应该使用sB
索引houghCircles
中selectBall
设置的数字,但它会回到sB
实例化的原始值。由于某些原因,sB
selectBall()
{p> sB
在selectBall
方法中设置为2,但当addLabel
使用sB
索引到向量时,sB
不会t == selectBall
中设置的内容。我做的事情非常愚蠢吗?
非常感谢。
答案 0 :(得分:0)
我会检查两个回调是否使用videoPlay
的相同实例。你可以这样做,例如像这样在两种方法中:
cout << "this = '" << this << "'" << endl;
(抱歉,我认为这会更好,但是我没有足够的代表来添加评论......)