C++ OpenCV程序运行时错误

C++ OpenCV程序运行时错误,c++,c,opencv,C++,C,Opencv,我已经用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

我已经用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 );
}
运行对象文件时,将显示以下输出:

./paint
init done 
opengl support available 

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

#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);
    }
}
#包括
#包括
#包括
使用名称空间cv;
void changeColor(int pos){}
int main(){
int值;
cvNamedWindow(“颜色选择器”,0);//用于选择输入颜色的区域
cvCreateTrackbar(“红色”、“颜色选择器”、&value、255、&changeColor);
字符键=0;
Mat original=imread(“/path/to/fileimage.png”);
while((int)键!=27){
Mat temp=original.clone();
对于(int i=0;i
waitKey()的参考手册规定:

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

因此,您一定要在某个时候调用它,以便windows显示图像

它还注意到:

注意:仅当至少创建了一个HighGUI窗口且该窗口处于活动状态时,该函数才起作用。如果有多个HighGUI窗口,则其中任何一个都可以处于活动状态


在您的示例中,似乎没有任何窗口处于活动状态,然后waitKey(0)将不起任何作用。与Radford Parker的回答一样,您需要显示一个图像。

您的程序有几个问题

首先,
imgColor
未声明,您需要:

IplImage* imgColor = cvCreateImage(cvSize(640, 480), IPL_DEPTH_8U, 3);
此外,关于:

void changeColor(int pos)
{
    cvSet(imgColor, CV_RGB(red, green, blue), NULL);    
}
您无法访问此处的
红色
、绿色、蓝色,因为它们是main的本地项。我认为这只是一个概念证明的例子,让我们声明这些是全局的

现在了解为什么不显示窗口。原因有两个:

  • 这听起来可能很明显,但是,main正在返回,您的程序正在退出。正如sgar91已经指出的,您需要
    cvWaitKey(0)在main的末尾,这样您的程序就可以在那里处理gui事件

  • 这听起来也很明显,但实际上您并没有指示OpenCV显示任何内容。您需要
    cvShowImage(“颜色选择器”,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);
    }
    
    #包括
    #包括“cv.h”
    #包括“highgui.h”
    红色、蓝色、绿色;
    IplImage*imgColor=cvCreateImage(cvSize(640480),IPL_DEPTH_8U,3);
    无效更改颜色(内部位置)
    {
    cvSet(imgColor,CV_RGB(红色、绿色、蓝色),空值);
    cvShowImage(“颜色选择器”,imgColor);
    }
    int main()
    {
    //cvNamedWindow(“绘图区域”,0);//用于输入数字的区域
    cvNamedWindow(“颜色选择器”,0);//用于选择输入颜色的区域
    cvShowImage(“颜色选择器”,imgColor);
    cvCreateTrackbar(“红色”、“颜色选择器”、&Red、255、&changeColor);
    cvCreateTrackbar(“绿色”、“颜色选择器”、&Green、255、&changeColor);
    cvCreateTrackbar(“蓝色”、“颜色选择器”、&Blue、255、&changeColor);
    //cvSetMouseCallback(“演示”,鼠标上的&0);
    cvWaitKey(0);
    }
    
    尝试在
    main
    的末尾添加
    cvWaitKey(0)
    。这样做了。无济于事。不显示输出窗口。这可能与编译命令有关吗?
    #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);
    }