3

可能重复:
在 C 中使用布尔值

我是 C 的新手,想编写一个从网络摄像头检测人脸的程序,我在网上找到了一个,我在 eclipse CDT 上使用 opencv-2.4.3,我在网上搜索了解决方案,但没有得到合适的我的问题的解决方案,因此将其发布为新问题。这是代码:

 // Include header files
 #include "/home/OpenCV-2.4.3/include/opencv/cv.h"
 #include "/home/OpenCV-2.4.3/include/opencv/highgui.h"
 #include "stdafx.h"

 int main(){

//initialize to load the video stream, find the device
 CvCapture *capture = cvCaptureFromCAM( 0 );
if (!capture) return 1;

//create a window
cvNamedWindow("BLINK",1);

 while (true){
    //grab each frame sequentially
    IplImage* frame = cvQueryFrame( capture );
    if (!frame) break;

    //show the retrived frame in the window
    cvShowImage("BLINK", frame);

    //wait for 20 ms
    int c = cvWaitKey(20);

    //exit the loop if user press "Esc" key
    if((char)c == 27 )break;
}
 //destroy the opened window
cvDestroyWindow("BLINK");

//release memory
cvReleaseCapture(&capture);
return 0;
 }

而且我收到错误为 true' 未声明(首次在此函数中使用),它在 while 循环中引起问题,我读到使用 while(true) 不是一个好习惯,但我应该怎么做。谁能帮帮我。

4

3 回答 3

6

用例如替换它

while(1)

或者

for(;;)

或者你可以这样做(c在循环之前定义):

while (c != 27)
{
    //grab each frame sequentially
    IplImage* frame = cvQueryFrame( capture );
    if (!frame)
        break;
    //show the retrieved frame in the window
    cvShowImage("BLINK", frame);
    //wait for 20 ms
    c = cvWaitKey(20);
    //exit the loop if user press "Esc" key
}

c根本没有,但这将以20 毫秒的等待时间开始循环:

while (cvWaitKey(20) != 27)
{
    //grab each frame sequentially
    IplImage* frame = cvQueryFrame( capture );
    if (!frame)
        break;
    //show the retrieved frame in the window
    cvShowImage("BLINK", frame);
}

第三种可能性:

for(;;)
{
    //grab each frame sequentially
    IplImage* frame = cvQueryFrame( capture );
    if (!frame)
        break;
    //show the retrieved frame in the window
    cvShowImage("BLINK", frame);
    if (cvWaitKey(20) == 27)
        break;
}

更新:同时想知道定义是否更正确

#define true  1
#define false 0

或者

#define true 1
#define false (!true)

或再次

#define false 0
#define true  (!false)

因为如果我说,做了:

int a = 5;
if (a == true) { // This is false. a is 5 and not 1. So a is not true }
if (a == false){ // This too is false. So a is not false              }

我会想出一个非常奇怪的结果,我发现这个链接指向一个稍微奇怪的结果。

我怀疑以安全的方式解决这个问题需要一些宏,例如

#define IS_FALSE(a)  (0 == (a))
#define IS_TRUE(a)   (!IS_FALSE(a))
于 2013-01-17T10:27:59.610 回答
3

true在许多版本的 c 中都没有定义。如果您想使用“布尔”,请参阅在 C 中使用布尔值

于 2013-01-17T10:30:26.067 回答
1

C 编译器指出该变量true未在代码中的任何位置或它包含的头文件中声明。它不是原始 C 语言规范的一部分。您可以将其定义为如下宏:

#define true  1

但是使用起来更简单,更清晰while(1)。如果你需要一个事件循环,这通常是这样做的。如果这是“不好的做法”,那对我来说就是新闻。

我一直忘记C99。您也可以尝试添加

#include <stdbool.h>

如果您的 C 版本支持它。

于 2013-01-17T10:41:18.510 回答