1

私は今週末中ずっとこれを試しました-土曜日/日曜日と月曜日は数時間を費やしましたが、役に立ちませんでした。gstreamerプラグインライターガイド http://gstreamer.freedesktop.org/data/doc/gstreamer/head/pwg/html/section-boiler-project-stamp.htmlに従っています。gstreamerプラグインの手順を試す前に、gstreamer-0.10(sudo apt-get installメソッド)とOpenCV2.4がすでにインストールされていました。デフォルトのプレフィックスを使用しています(以前/usr/local/lib/gstreamer-0.10のプラグインテスト用)./configuresudo make && sudo make install

ボイラープレートコードを生成することができました。今私は次のようなcvcreateImageを追加しました

static GstFlowReturn
gst_cvtestfilter_chain (GstPad * pad, GstBuffer * buf)
{
Gstcvtestfilter *filter;
GstBuffer *outbuf;
IplImage* cvImage = cvCreateImage(cvSize(cvwidth,cvheight),cvdepth, cvchannels);
.
.
}

cvImage行にコメントを付けると、すべてがスムーズに機能します。すべてのテストはOKです。その行にコメントしないと、何らかの理由でOpenCVへのリンクが失敗します。

makefile.amsrcディレクトリにOpenCVフラグを次のように追加するように変更しました

 # Note: plugindir is set in configure

##############################################################################
# TODO: change libgstcvtestfilter.la to something else, e.g. libmysomething.la     #
##############################################################################
plugin_LTLIBRARIES = libgstcvtestfilter.la

##############################################################################
# TODO: for the next set of variables, name the prefix if you named the .la, #
#  e.g. libmysomething.la => libmysomething_la_SOURCES                       #
#                            libmysomething_la_CFLAGS                        #
#                            libmysomething_la_LIBADD                        #
#                            libmysomething_la_LDFLAGS                       #
##############################################################################

# sources used to compile this plug-in
libgstcvtestfilter_la_SOURCES = gstcvtestfilter.c gstcvtestfilter.h

# compiler and linker flags used to compile this plugin, set in configure.ac
libgstcvtestfilter_la_CFLAGS = $(GST_CFLAGS) $(OPENCV_CFLAGS)
libgstcvtestfilter_la_LIBADD = $(GST_LIBS) $(OPENCV_LIBS)
libgstcvtestfilter_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) 
libgstcvtestfilter_la_LIBTOOLFLAGS = --tag=disable-static

# headers we need but don't want installed
noinst_HEADERS = gstcvtestfilter.h

configure.ac親ディレクトリを追加して変更しました

 dnl *** opencv ***
translit(dnm, m, l) AM_CONDITIONAL(USE_OPENCV, true)

  dnl we specify a max. version too because we set CV_NO_BACKWARD_COMPATIBILITY
  dnl and don't want the build to break when a new opencv version comes out.
  dnl Need to adjust this upwards once we know that our code compiles fine with
  dnl a new version and the no-backward-compatibility define. (There doesn't
  dnl seem to be a switch to suppress the warnings the cvcompat.h header
  dnl causes.)
  PKG_CHECK_MODULES(OPENCV, opencv >= 2.0.0 opencv <= 3.1.0 , [
    AC_PROG_CXX
    AC_LANG_CPLUSPLUS
    OLD_CPPFLAGS=$CPPFLAGS
    CPPFLAGS=$OPENCV_CFLAGS
    AC_CHECK_HEADER(highgui.h, HAVE_HIGHGUI="yes", HAVE_HIGHGUI="no")
    AC_CHECK_HEADER(cvaux.h, HAVE_CVAUX="yes", HAVE_CVAUX="no")
    CPPFLAGS=$OLD_CPPFLAGS
    AC_LANG_C
    if test "x$HAVE_HIGHGUI" = "xno"; then
      AC_MSG_RESULT(highgui.h could not be found.)
      HAVE_OPENCV="no"
    elif test "x$HAVE_CVAUX" = "xno"; then
      AC_MSG_RESULT(cvaux.h could not be found.)
      HAVE_OPENCV="no"
    else
      HAVE_OPENCV="yes" 
      AC_SUBST(OPENCV_CFLAGS)
      AC_SUBST(OPENCV_LIBS)  
    fi
  ], [
    HAVE_OPENCV="no"
    AC_MSG_RESULT(no)
  ])

コンパイルは問題ありません-エラーはありません。

プラグインをパイプラインで実行すると、このメッセージが表示されます

(gst-plugin-scanner:6396): GStreamer-WARNING **: Failed to load plugin '/usr/local/lib/gstreamer-0.10/libgstcvtestfilter.so': /usr/local/lib/gstreamer-0.10/libgstcvtestfilter.so: undefined symbol: cvCreateImage

したがって、明らかに、にある私のopencv/usr/local/libは正しくリンクされていません。

sudo gedit /etc/bash.bashrc含む

#Added By me
PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/usr/local/lib/pkgconfig
export PKG_CONFIG_PATH

#Added By me
PATH=$PATH:/opt/Xilinx/13.4/ISE_DS/ISE/bin/lin
export PATH

GST_PLUGIN_PATH=$GST_PLUGIN_PATH:/usr/local/lib/gstreamer-0.10
export GST_PLUGIN_PATH

sudo gedit /etc/ld.so.conf.d/opencv.conf含む

/usr/local/lib

sudo gedit /etc/ld.so.conf.d/gst.conf含む

/usr/local/lib/gstreamer-0.10

sudo ldconfig -v

sudo gedit ~/.bashrc含む

export LD_LIBRARY_PATH=/usr/local/lib:/usr/local/lib/gstreamer-0.10

ldd /usr/local/lib/gstreamer-0.10/libgstcvtestfilter.so奇妙なopencv依存関係を与えません

linux-gate.so.1 =>  (0xb77b6000)
libgstreamer-0.10.so.0 => /usr/lib/i386-linux-gnu/libgstreamer-0.10.so.0 (0xb76b0000)
libgobject-2.0.so.0 => /usr/lib/i386-linux-gnu/libgobject-2.0.so.0 (0xb7661000)
libglib-2.0.so.0 => /lib/i386-linux-gnu/libglib-2.0.so.0 (0xb7567000)
libpthread.so.0 => /lib/i386-linux-gnu/libpthread.so.0 (0xb754c000)
libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0xb73a7000)
libgmodule-2.0.so.0 => /usr/lib/i386-linux-gnu/libgmodule-2.0.so.0 (0xb73a2000)
libxml2.so.2 => /usr/lib/i386-linux-gnu/libxml2.so.2 (0xb7255000)
libm.so.6 => /lib/i386-linux-gnu/libm.so.6 (0xb7228000)
librt.so.1 => /lib/i386-linux-gnu/librt.so.1 (0xb721f000)
libdl.so.2 => /lib/i386-linux-gnu/libdl.so.2 (0xb721a000)
libffi.so.6 => /usr/lib/i386-linux-gnu/libffi.so.6 (0xb7213000)
libpcre.so.3 => /lib/i386-linux-gnu/libpcre.so.3 (0xb71d7000)
/lib/ld-linux.so.2 (0xb77b7000)
libz.so.1 => /lib/i386-linux-gnu/libz.so.1 (0xb71c0000)

私のOSは32ビット12.04Ubuntuです。誰かが私を正しい方向に向けることができれば、私は感謝するでしょう。ありがとう。

更新:(2012年6月29日)

OpenCVの経験からヒントを得configure.acて、誰かが興味を持っている場合は、OpenGL用に変更しました

AC_CHECK_HEADER(
    GL/gl.h,
    AC_DEFINE(
        [HAVE_OPENGL],
        [],
        Define to 1 if you have the <GL/gl.h> header file.
        )
        OPENGL_LIBS="$X_LIBS -lGL -lGLU -lpthread -lglut -lGLEW"
        opengl=yes,
    AC_MSG_WARN([*** no GL/gl.h -- opengl and SDL support disabled])
)
AC_SUBST(OPENGL_CFLAGS)
AC_SUBST(OPENGL_LIBS)


dnl AC_ARG_WITH(
dnl     opengl-cflags,
dnl     [  --with-opengl-cflags=PATH    Specify OpenGL cflags],
dnl     OPENGL_CFLAGS="$withval", OPENGL_CFLAGS="")
dnl AC_ARG_WITH(
dnl     opengl-libs,
dnl     [  --with-opengl-libs=PATH      Specify OpenGL libs (default is -lGL -lGLU -lpthread)],
dnl     OPENGL_LIBS="$withval", OPENGL_LIBS="-lGL -lGLU -lpthread -lglut -lGLEW")
dnl AC_SUBST(OPENGL_CFLAGS)
dnl AC_SUBST(OPENGL_LIBS)
4

3 に答える 3

1

質問がGStreamerのバージョン0.1に関連していることは知っていますが、ソースからコンパイルするときにGStreamer v1.4.5で、またソースからコンパイルされたOpenCV2.4.10.1でも同様のエラーが発生しました。

私の場合、実行gst-inspect-1.0すると次のメッセージが出力されます。

(gst-plugin-scanner:7485):GStreamer-警告**:プラグイン'/usr/local/lib/gstreamer-1.0/libgstopencv.so'の読み込みに失敗しました:/usr/local/lib/gstreamer-1.0/libgstopencv。だから:未定義のシンボル:cvCloneImage
..。
..。
総数:196個のプラグイン(1個のブラックリストエントリは表示されていません)、1109個の機能

私のソリューションは、ここからのソリューション2に着想を得ていますが、ソースファイルを変更する代わりに、OPENCV_LIBS環境変数をautogen.shに渡すだけです。

OPENCV_LIBS = " -  lopencv_core -lopencv_imgproc -lopencv_highgui -lopencv_ml -lopencv_video -lopencv_features2d -lopencv_calib3d -lopencv_objdetect -lopencv_contrib -lopencv_legacy -lopencv_flann -lopencv_gpu -lopencv_legacy -lopencv_nonfree -lopencv_ocl -lopencv_photo -lopencv_stitching -lopencv_superres -lopencv_videostab" ./autogen.sh

使用するビルド構成によっては、ライブラリを調整する必要がある場合があります。

これが私の出力ですpkg-config --libs opencv

/usr/local/lib/libopencv_calib3d.so /usr/local/lib/libopencv_contrib.so /usr/local/lib/libopencv_core.so /usr/local/lib/libopencv_features2d.so /usr/local/lib/libopencv_flann.so /usr/local/lib/libopencv_gpu.so /usr/local/lib/libopencv_highgui.so /usr/local/lib/libopencv_imgproc.so /usr/local/lib/libopencv_legacy.so /usr/local/lib/libopencv_ml.so /usr/local/lib/libopencv_nonfree.so /usr/local/lib/libopencv_objdetect.so /usr/local/lib/libopencv_ocl.so /usr/local/lib/libopencv_photo.so /usr/local/lib/libopencv_stitching.so /usr/local/lib/libopencv_superres.so /usr/local/lib/libopencv_ts.a /usr/local/lib/libopencv_video.so /usr/local/lib/libopencv_videostab.so -lrt -lpthread -lm -ldl
于 2015-02-11T21:35:21.630 に答える
0

Makefile私は、srcディレクトリに醜いハックをしている友人に相談して、この問題を解決することができました。

解決策I

LIBS = 空だったので、次のようにOpenCVライブラリを追加する必要がありました。

LDFLAGS =
LIBOBJS =
LIBS = -lopencv_core -lopencv_highgui # One may add more OpenCV libraries as needed here
LIBTOOL = $(SHELL) $(top_builddir)/libtool

ソリューションII(より良いソリューションが登場-しかしそれでも醜い)

LIBS =空のままにしますが、で編集OPENCV_LIBS=Makefileます。

私の場合、私は持っていました

OPENCV_LIBS = /usr/local/lib/libopencv_highgui.so /usr/local/lib/libopencv_core.so ...

この行をに置き換えました

OPENCV_LIBS = -lopencv_highgui -lopencv_core ...などなど。

この行で必要に応じて、すべてのOpenCVライブラリでこれを置き換えれMakefileば、機能するはずです。

解決策III(推奨)次のように変更Makefile.amし、必要に応じてすべてのOpenCVライブラリを追加します。

 # Note: plugindir is set in configure

##############################################################################
# TODO: change libgstcvtestfilter.la to something else, e.g. libmysomething.la     #
##############################################################################
plugin_LTLIBRARIES = libgstcvtestfilter.la

##############################################################################
# TODO: for the next set of variables, name the prefix if you named the .la, #
#  e.g. libmysomething.la => libmysomething_la_SOURCES                       #
#                            libmysomething_la_CFLAGS                        #
#                            libmysomething_la_LIBADD                        #
#                            libmysomething_la_LDFLAGS                       #
##############################################################################

# sources used to compile this plug-in
libgstcvtestfilter_la_SOURCES = gstcvtestfilter.c gstcvtestfilter.h

# compiler and linker flags used to compile this plugin, set in configure.ac
libgstcvtestfilter_la_CFLAGS = $(GST_CFLAGS) $(OPENCV_CFLAGS)
libgstcvtestfilter_la_LIBADD = $(GST_LIBS) $(OPENCV_LIBS) -lopencv_highgui -lopencv_core
libgstcvtestfilter_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) 
libgstcvtestfilter_la_LIBTOOLFLAGS = --tag=disable-static

# headers we need but don't want installed
noinst_HEADERS = gstcvtestfilter.h

opencv2.3.1と2.4.0のインストール方法に違いがあります。/usr/local/lib/pkgconfig/opencv.pc

/usr/local/lib/pkgconfig/opencv.pcファイルは次のようになります:(このgstreameropencvプラグインがインストールされているPCは正常に動作します-Ubuntu10.04)

# Package Information for pkg-config

prefix=/usr/local
exec_prefix=${prefix}
libdir=${exec_prefix}/lib
includedir_old=${prefix}/include/opencv
includedir_new=${prefix}/include

Name: OpenCV
Description: Open Source Computer Vision Library
Version: 2.3.1
Libs: -L${libdir} -lopencv_core -lopencv_imgproc -lopencv_highgui -lopencv_ml -lopencv_video -lopencv_features2d -lopencv_calib3d -lopencv_objdetect -lopencv_contrib -lopencv_legacy -lopencv_flann
Cflags: -I${includedir_old} -I${includedir_new}

代わりに(このgstreamer opencvプラグインがインストールされているPCには、Makefileの変更が必要です-Ubuntu 12.04):

# Package Information for pkg-config

prefix=/usr/local
exec_prefix=${prefix}
libdir=
includedir_old=${prefix}/include/opencv
includedir_new=${prefix}/include

Name: OpenCV
Description: Open Source Computer Vision Library
Version: 2.4.0
Libs:  ${exec_prefix}/lib/libopencv_calib3d.so ${exec_prefix}/lib/libopencv_contrib.so ${exec_prefix}/lib/libopencv_core.so ${exec_prefix}/lib/libopencv_features2d.so ${exec_prefix}/lib/libopencv_flann.so ${exec_prefix}/lib/libopencv_gpu.so ${exec_prefix}/lib/libopencv_highgui.so ${exec_prefix}/lib/libopencv_imgproc.so ${exec_prefix}/lib/libopencv_legacy.so ${exec_prefix}/lib/libopencv_ml.so ${exec_prefix}/lib/libopencv_nonfree.so ${exec_prefix}/lib/libopencv_objdetect.so ${exec_prefix}/lib/libopencv_photo.so ${exec_prefix}/lib/libopencv_stitching.so ${exec_prefix}/lib/libopencv_ts.so ${exec_prefix}/lib/libopencv_video.so ${exec_prefix}/lib/libopencv_videostab.so
Cflags: -I${includedir_old} -I${includedir_new}

何か見つけたらもっと良い解決策を投稿します。

于 2012-06-19T15:40:27.580 に答える
0

configure runは実際にopencvライブラリを見つけましたか?config.logを確認してください。また、configure.acの部分で正確に何を変更しましたか?お気づきのとおり、生成されたmakefileには、これらの変数が展開されているはずです。

于 2012-06-19T16:03:21.647 に答える