【问题标题】:OpenCV Program Runtime ErrorOpenCV 程序运行时错误
【发布时间】:2013-09-11 10:44:02
【问题描述】:

我使用 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 

【问题讨论】:

  • 尝试在main末尾添加cvWaitKey(0)
  • 做到了。无济于事。没有输出窗口出现。会不会和编译命令有关?

标签: c++ c opencv


【解决方案1】:

您的程序有几个问题。

首先imgColor没有被声明,你需要:

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

另外,在:

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

你不能在这里访问redgreenblue,因为它们是本地的。我认为这只是一个概念证明示例,让我们将这些声明为全局。

现在来看看为什么没有显示窗口。有两个原因:

  1. 这听起来很明显,但是,main 正在返回,您的程序正在退出。正如 sgar91 已经指出的那样,您需要在 main 末尾添加 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);
}

【讨论】:

    【解决方案2】:

    我试图简化你的问题,这对我有用:

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

    【讨论】:

      【解决方案3】:

      waitKey() 的参考手册指出:

      注意:该函数是 HighGUI 中唯一可以获取和处理事件的方法,因此需要定期调用它来进行正常的事件处理,除非在处理事件的环境中使用 HighGUI。

      因此,您肯定必须在某个时候调用它才能出现窗口并显示图像。

      它还指出:

      注意:该功能仅在至少创建了一个 HighGUI 窗口并且该窗口处于活动状态时才有效。如果有多个 HighGUI 窗口,任何一个都可以是活动的。

      从您的示例中,似乎没有窗口处于活动状态,然后 waitKey(0) 将什么也不做。就像 Radford Parker 的回答一样,您需要显示一张图片。

      【讨论】:

        猜你喜欢
        • 2011-03-27
        • 1970-01-01
        • 2013-05-13
        • 2012-01-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多