1

我正在尝试做一个非常基本的 Gstreamer 元素,它打开一个带有图像的 OpenCV 窗口。

在我的元素中,我有一个仅调用名为 select_points() 的开窗函数的链函数,该函数位于 select_points.cpp 中。

链函数:

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(),其他一切都可以正常工作。

4

1 回答 1

1

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

其次,如果你想看到这个窗口,你必须在被调用cvWaitKey(0);之后添加一个调用cvShowImage()。否则,您最终将显示图像并立即破坏窗口,使其不显示任何内容。

:)

于 2012-05-03T23:08:32.813 回答