OpenCV程序运行时错误

OpenCV Program Runtime Error

本文关键字:运行时错误 程序 OpenCV      更新时间:2023-10-16

我已经用OpenCV 2.4.1制作了一个基本程序来打开两个窗口。程序正在正确编译。当我尝试运行对象文件时,它不会打开窗口。下面给出了源代码和编译命令。我哪里错了?

#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 

您的程序有几个问题。

首先,imgColor没有声明,您需要:

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

此外,在:

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

这里既不能访问redgreen,也不能访问blue,因为它们对main是本地的。我认为这只是一个概念验证的例子,让我们声明这些是全局的。

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

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

我试图简化你的问题,这对我来说很有效:

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

waitKey()的参考手册指出:

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

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

它还指出:

注意:只有当至少创建了一个HighGUI窗口并且该窗口处于活动状态时,该功能才有效。如果有几个HighGUI窗口,其中任何一个都可以处于活动状态。

在您的示例中,似乎没有任何窗口处于活动状态,然后waitKey(0)将不起任何作用。正如拉德福德·帕克的回答一样,你需要显示一个图像。