3

重複の可能性:
C でのブール値の使用

私はCの初心者で、Webカメラから顔を検出するプログラムを書きたいと思っています。オンラインで入手しました。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 ループで問題が発生しています。誰か助けてくれませんか。

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);
}

そして 3 番目の可能性:

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;
}

UPDATE:定義する方が正しいかどうか疑問に思っている間

#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

trueC コンパイラは、変数がコード内のどこにも宣言されておらず、それがインクルードするヘッダー ファイルにも宣言されていないことを指摘しています。これは、元の C 言語仕様の一部ではありません。次のようにマクロとして定義できます。

#define true  1

ただし、使用する方が簡単で明確while(1)です。イベント ループが必要な場合は、これが通常行われる方法です。それが「良い習慣ではない」場合、それは私にとってニュースです。

私はC99を忘れ続けています。追加することもできます

#include <stdbool.h>

C のバージョンがサポートされている場合。

于 2013-01-17T10:41:18.510 に答える