我正在尝试使用一个非常基本的Gstreamer元素来打开带有图像的OpenCV窗口。
在我的元素中,我有一个链函数只能调用名为select_points()的窗口打开函数,该函数位于select_points.cpp中。
chain_function:
static GstFlowReturn
gst_georeg_chain (GstPad * pad, GstBuffer * buf)
{
GstGeoreg *filter;
georeg_val gvals;
filter = GST_GEOREG (GST_OBJECT_PARENT (pad));
get_data(&gvals);
select_points(&gvals);
return gst_pad_push (filter->srcpad, buf);
}
现在在我的select_points.cpp中,我有以下代码
#include <stdio.h>
#include "datasetup.h"
#include <opencv/cv.h>
#include <opencv/highgui.h>
using namespace cv;
extern "C" void select_points(georeg_val *gvals) //plugin is in C
{
IplImage* img=0;
img=cvLoadImage(gvals->imageName,1);
if(!img)
{
printf("Could not load image file: \n$%s$\n",gvals->imageName);
}
else
{
printf("Image was loaded\n");
cvNamedWindow("Select", CV_WINDOW_AUTOSIZE);
cvMoveWindow("Select", 200, 200); // offset from the UL corner of the screen
cvShowImage("Select",img);
cvDestroyWindow("Select");
cvReleaseImage(&img);
}
}
问题是,当我使用我的元素运行管道时,它会在调用cvNamedWindow时挂起。有什么建议?如果我注释掉select_points(),其他一切都可以正常工作。
答案 0 :(得分:1)
首先,在激活gstreamer管道之前,将cvNamedWindow()
移出select_points()
并移至main()
函数。
第二次,如果您想要查看该窗口,则必须在调用cvWaitKey(0);
后添加对cvShowImage()
的调用。否则,您将最终显示图像并立即摧毁窗口,使其不显示任何内容。
:)