‘true’ undeclared (first use in this function) in opencv
本问题已经有最佳答案,请猛点这里访问。
Possible Duplicate:
Using boolean values in C
我是C的新手,想写一个程序来检测网络摄像头的人脸,我在网上找到了一个,我在EclipseCDT上使用OpenCV-2.4.3,我在网上搜索了解决方案,但没有找到适合我的问题的解决方案,所以把它作为新问题发布。代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 | // 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; } |
我得到的错误是"真的"未声明的(第一次在这个函数中使用),它导致了while循环中的问题,我读到使用while(真的)不是很好的实践,但是我应该怎么做。有人能把我救出来吗?
替换为例如
1 | while(1) |
或
1 | for(;;) |
或者可以这样做(在循环之前定义
1 2 3 4 5 6 7 8 9 10 11 12 | 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 } |
或者根本不使用
1 2 3 4 5 6 7 8 9 | 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); } |
还有第三种可能性:
1 2 3 4 5 6 7 8 9 10 11 | 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; } |
更新:同时想知道定义是否更正确
1 2 | #define true 1 #define false 0 |
或
1 2 | #define true 1 #define false (!true) |
或再次
1 2 | #define false 0 #define true (!false) |
因为如果我,说,做了:
1 2 3 | 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 } |
我会想出一个非常奇怪的结果,我发现这个链接到一个稍微奇怪的结果。
我怀疑以安全的方式解决这个问题需要一些宏,比如
1 2 | #define IS_FALSE(a) (0 == (a)) #define IS_TRUE(a) (!IS_FALSE(a)) |
在许多版本的C中没有定义
C编译器指出,变量"true"既没有在代码中的任何地方声明,也没有在它包含的头文件中声明。它不是原始C语言规范的一部分。您可以像这样将其定义为宏:
定义真1
然而,使用while(1)更简单、更清晰。如果您需要一个事件循环,通常是这样做的。如果这是"不好的练习",那对我来说是个新闻。
我一直忘了C99。您也可以尝试添加
1 | #include <stdbool.h> |
如果您的C版本支持它。