opencv中未声明的'true'(首次在此函数中使用)[重复]

Posted

技术标签:

【中文标题】opencv中未声明的\'true\'(首次在此函数中使用)[重复]【英文标题】:‘true’ undeclared (first use in this function) in opencv [duplicate]opencv中未声明的'true'(首次在此函数中使用)[重复] 【发布时间】:2012-12-31 20:46:42 【问题描述】:

可能重复:Using boolean values in 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) 不是一个好习惯,但我应该怎么做。谁能帮帮我。

【问题讨论】:

【参考方案1】:

用例如替换它

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              

我会想出一个非常奇怪的结果,我发现this link 的结果有点奇怪。

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

#define IS_FALSE(a)  (0 == (a))
#define IS_TRUE(a)   (!IS_FALSE(a))

【讨论】:

@Iserni- 当我使用 c !=27 时,它会给我错误,因为“c”未声明(在此函数中首次使用)并且当我给出没有 c 时。它在每种语法中都给了我错误,作为未定义的引用。 查看答案:“(在循环之前定义 c)”。您需要在循环开始之前放置一个int c; 声明。但是,您可以使用 c-less 语法:while (cvWaitKey(20) != 27) 下面第一个描述;当然,在这种情况下,循环内不再有任何可用的 c 变量。无论如何,我添加了第三种可能性。【参考方案2】:

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

【讨论】:

true 的定义将放在包含文件中(例如,curses.h 定义 TRUE,大写)。 @UmNyobe- 感谢您的即时回复,我看到了链接并尝试使用 stdbool 但它给了我同样的问题。 @Iserni - 我尝试包含 curses.h 文件,但包含后它给了我 26 个错误【参考方案3】:

C 编译器指出变量true 没有在代码的任何地方声明,也没有在它包含的头文件中声明。它不是原始 C 语言规范的一部分。您可以将其定义为这样的宏:

#define true  1

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

我总是忘记 C99。您也可以尝试添加

#include <stdbool.h>

如果你的 C 版本支持的话。

【讨论】:

以上是关于opencv中未声明的'true'(首次在此函数中使用)[重复]的主要内容,如果未能解决你的问题,请参考以下文章

Iphone 开发中的错误 - 未声明的问候语(在此函数中首次使用)

CLONE_VM 未声明(在此函数中首次使用)

SWIG 包装器未声明(在此函数中首次使用)

参数类型不兼容且在此函数中未初始化

c ++ opencv findHomography()函数中未定义的reerence

Cython __pyx_r 可能在此函数中未初始化使用