【发布时间】:2016-04-26 09:13:44
【问题描述】:
这是我的循环结构。
int k = 0;
do {
....
do {
fc = Recognize();
....
do {
....
} while(fc != false);
k++;
} while(k != 20);
if (k == 20) {
return;
}
} while(true);
当 k 等于 20 或 fc 等于 true 时,我需要结束所有循环。
我尝试了不同的方法来做到这一点,但失败了。上面的代码是我最后一次尝试。需要帮助来解决这个问题。
grabber.start();
int k=0;
do {
grabber.stop();
grabber.start();
img = grabber.grab();
if (img != null) {
canvas.showImage(img);
canvas.pack();
cvWaitKey(0);
}
do {
fc= Recognize();
grabber.start();
do {
img = grabber.grab();
if (img != null) {
CvHaarClassifierCascade cascade = new
CvHaarClassifierCascade(cvLoad(XML_FILE));
CvMemStorage storage = CvMemStorage.create();
CvSeq sign = cvHaarDetectObjects(img,
cascade,storage, 1.5, 3,CV_HAAR_DO_CANNY_PRUNING);
cvClearMemStorage(storage);
total_Faces = sign.total();
for(int i = 0; i < total_Faces; i++){
CvRect r = new CvRect(cvGetSeqElem(sign, i));
cvRectangle (img,
cvPoint(r.x(),r.y()),
cvPoint(r.width()+r.x(),r.height()+ r.y()),
CvScalar.RED,2,CV_AA,0);
x=r.x();
y=r.y();
h=r.height();
w=r.width();
}
cvFlip(img, img, 1);
canvas.showImage(img);
canvas.pack();
cvWaitKey(0);
}
} while(fc!=false);
k++;
} while(k!=21);
} while(true);
}
【问题讨论】:
-
如果我没看错的话,你目前有一个无限循环。你初始化
int k = 20;,然后当你在第二级do你有k++和检查你检查while(k != 20);的同一个do-while-loop此时k是21,并且它一直在上升,所以它永远不会在你发布的code-sn-p中留下这个do-while循环.. -
@Kevin Cruijssen 。 k=0;在我的代码中。我写帖子的时候弄错了。
-
仍然很混乱...这段代码是做什么的?您正在抓取图像并显示它,如果它不为空,那么您会进行一些“识别”并抓取另一个(?)图像。如果后一个图像不为空,您对其进行一些分析,如果您找到一些东西,您会在您找到的每个对象上放置一个矩形?用语言解释你想做什么。
-
@ГринюкАндрей 我大概花了 10 分钟才让格式以某种方式正确。不幸的是,看到所有代码......很清楚,它需要 extensive 量来进行“干净的重写”。并且无法在重构时运行任何测试……我想我无法兑现我的“承诺”——你必须自己解决这个烂摊子。我的个人提示:扔掉它;并开始做 TDD。编写测试用例,逐步实现需要实现的东西。即使在今天修复现有代码时,也无法进行测试和维护工作。
-
@Jägermeister “干净重写”是什么意思?这段代码现在工作正常。我只需要在 fc==true 或 k==21 之后打破所有循环。尝试标记第一个循环,但它不起作用。