我使用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
答案 0 :(得分:2)
您的计划有几个问题。
首先未声明imgColor
,您需要:
IplImage* imgColor = cvCreateImage(cvSize(640, 480), IPL_DEPTH_8U, 3);
此外,在:
void changeColor(int pos)
{
cvSet(imgColor, CV_RGB(red, green, blue), NULL);
}
您既不能访问red
,也不能访问green
,也不能访问blue
,因为它们位于main的本地。我认为这只是一个概念证明示例,让我们声明这些全局。
现在为什么没有显示窗口。有两个原因:
这听起来很明显,但是好的,主要是回归,你的程序只是退出。正如sgar91已经指出的那样,你需要在main的末尾cvWaitKey(0);
,所以你的程序可以在那里处理gui事件。
这听起来也很明显,但你实际上并未指示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);
}
答案 1 :(得分: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);
}
}
答案 2 :(得分:0)
waitKey()的参考手册指出:
注意:此函数是HighGUI中唯一可以获取和处理事件的方法,因此需要定期调用它以进行正常的事件处理,除非在负责事件处理的环境中使用HighGUI。
因此,您必须在某些时候调用它来显示窗口并显示图像。
它还注意到:
注意:该功能仅在至少创建一个HighGUI窗口并且窗口处于活动状态时才有效。如果有多个HighGUI窗口,则其中任何一个都可以处于活动状态。
从您的示例中,似乎没有窗口处于活动状态,然后waitKey(0)将不执行任何操作。如在Radford Parker的回答中,您需要显示图像。