0

OpenCV 2.4.1 を使用して 2 つのウィンドウを開く基本的なプログラムを作成しました。プログラムは正しくコンパイルされています。オブジェクト ファイルを実行しようとすると、ウィンドウが開きません。ソースコードとコンパイルコマンドを以下に示します。どこが間違っていますか?

#include <cstdio>
#include "cv.h"
#include "highgui.h"

void changeColor(int pos)
{
cvSet(imgColor, CV_RGB(red, green, blue), NULL);    
}

int main()
{
    int red, blue, green;
    cvNamedWindow("DrawArea", 0);   //area for inputting digits
    cvNamedWindow("ColorSelector", 0);  //area for selecting colour of input

    cvCreateTrackbar("Red", "ColorSelector", &red, 255, &changeColor);
    cvCreateTrackbar("Green", "ColorSelector", &green, 255, &changeColor);
    cvCreateTrackbar("Blue", "ColorSelector", &blue, 255, &changeColor);


    cvSetMouseCallback(“Demo”,&on_mouse, 0 );
}

コンパイルに使用するコマンドは次のとおりです。

gcc `pkg-config opencv --cflags` paint.cpp  -o paint `pkg-config opencv --libs`

オブジェクト ファイルを実行すると、次の出力が表示されます。

./paint
init done 
opengl support available 
4

3 に答える 3

2

あなたのプログラムにはいくつかの問題があります。

まず、imgColor宣言されていないため、次のものが必要です。

IplImage* imgColor = cvCreateImage(cvSize(640, 480), IPL_DEPTH_8U, 3);

また、

void changeColor(int pos)
{
    cvSet(imgColor, CV_RGB(red, green, blue), NULL);    
}

これらはメインに対してローカルであるため、 、 、 、および here のいずれredにもアクセスできません。これは単なる概念証明の例だと思います。これらをグローバルに宣言しましょう。greenblue

次に、ウィンドウが表示されない理由について説明します。2 つの理由があります。

  1. 当たり前のように聞こえるかもしれませんが、main が戻ってきて、プログラムは単に終了しています。sgar91 が既に指摘したようにcvWaitKey(0);、メインの最後にプログラムを保持して GUI イベントを処理できるようにする必要があります。

  2. これも当たり前のように聞こえるかもしれませんが、実際には OpenCV に何も表示するように指示していません。が必要ですcvShowImage("ColorSelector", imgColor);。これにより、OpenCV 内のウィンドウ ペインティングのイベントがトリガーされます。

次の簡単な例は問題なく動作し、ウィンドウに表示される色を選択できます。

#include <cstdio>
#include "cv.h"
#include "highgui.h"

int red, blue, green;
IplImage* imgColor = cvCreateImage(cvSize(640, 480), IPL_DEPTH_8U, 3);

void changeColor(int pos)
{
    cvSet(imgColor, CV_RGB(red, green, blue), NULL);   
    cvShowImage("ColorSelector", imgColor);
}

int main()
{
//     cvNamedWindow("DrawArea", 0);   //area for inputting digits
    cvNamedWindow("ColorSelector", 0);  //area for selecting colour of input

    cvShowImage("ColorSelector", imgColor);

    cvCreateTrackbar("Red", "ColorSelector", &red, 255, &changeColor);
    cvCreateTrackbar("Green", "ColorSelector", &green, 255, &changeColor);
    cvCreateTrackbar("Blue", "ColorSelector", &blue, 255, &changeColor);

//     cvSetMouseCallback("Demo", &on_mouse, 0);

    cvWaitKey(0);
}
于 2013-09-11T02:44:02.797 に答える
0

私はあなたの問題を単純化しようとしましたが、これは私にとってはうまくいきました:

#include <cstdio>
#include <cv.h>
#include <highgui.h>

using namespace cv;

void changeColor(int pos) {}

int main() {
    int value;

    cvNamedWindow("ColorSelector", 0);  //area for selecting colour of input
    cvCreateTrackbar("Red", "ColorSelector", &value, 255, &changeColor);

    char key = 0;
    Mat original = imread("/path/to/fileimage.png");
    while ((int)key != 27) {
        Mat temp = original.clone();
        for (int i = 0; i < temp.rows; ++i) {
            for (int j = 0; j < temp.cols; ++j) {
                temp.at<uchar>(i, j, 0) = value * (float)temp.at<uchar>(i, j, 0) / 255;
            }
        }

        imshow("ColorSelector", temp);
        key = waitKey(1);
    }
}
于 2013-02-05T16:55:54.883 に答える
0

waitKey()のリファレンス マニュアルには、次のように記載されています。

注: この関数は、HighGUI でイベントをフェッチして処理できる唯一のメソッドであるため、イベント処理を行う環境で HighGUI を使用しない限り、通常のイベント処理のために定期的に呼び出す必要があります。

したがって、ウィンドウが表示されて画像が表示されるようにするには、ある時点でそれを呼び出す必要があります。

また、次の点にも注意してください。

注: この関数は、少なくとも 1 つの HighGUI ウィンドウが作成されていて、そのウィンドウがアクティブな場合にのみ機能します。複数の HighGUI ウィンドウがある場合、それらのいずれかをアクティブにすることができます。

あなたの例から、アクティブなウィンドウはないようで、waitKey(0) は何もしません。Radford Parker の回答のように、画像を表示する必要があります。

于 2013-09-11T00:41:41.473 に答える