在gstreamer元素中打开OpenCV窗口

时间:2012-05-02 15:29:55

标签: c++ opencv gstreamer

我正在尝试使用一个非常基本的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(),其他一切都可以正常工作。

1 个答案:

答案 0 :(得分:1)

首先,在激活gstreamer管道之前,将cvNamedWindow()移出select_points()并移至main()函数。

第二次,如果您想要查看该窗口,则必须在调用cvWaitKey(0);后添加对cvShowImage()的调用。否则,您将最终显示图像并立即摧毁窗口,使其不显示任何内容。

:)