opencv:windows下调用cvShowImage等窗口显示函数报错:The function is not implement

自己在windows下用cmake成功编译了opencv 2.4.13.2,但在实际调用cvShowImage函数时报错了:

OpenCV Error: Unspecified error (The function is not implemented. Rebuild the library with Windows, GTK+ 2.x or Carbon support. If you are on Ubuntu or Debian, install libgtk2.0-dev and pkg-config, then re-run cmake or configure script) in cvNamedWindow, file D:\caffe-static\source\opencv-2.4.13.2\modules\highgui\src\window.cpp, line 501
terminate called after throwing an instance of ‘cv::Exception’

这个错误提示的意思就是cvShowImage这个函数没有被实现。
查看了opencv-2.4.13.2\modules\highgui\src\window.cpp源码,才明白这个文件只是没有函数实现的虚代码。windows下的真正实现代码是同文件夹下的windows_w32.cpp。应该是编译开关问题造成没有编译windows_w32.cpp
于是在opencv-2.4.13.2\modules\highgui\CMakeLists.txt中找到如下代码 ,可以看到HAVE_WIN32UI用于控制是否编译windows_w32.cpp

elseif(HAVE_WIN32UI)
  list(APPEND highgui_srcs src/window_w32.cpp)
elseif(HAVE_GTK)
  list(APPEND highgui_srcs src/window_gtk.cpp)
elseif(HAVE_CARBON)
  list(APPEND highgui_srcs src/window_carbon.cpp)
  list(APPEND HIGHGUI_LIBRARIES "-framework Carbon" "-framework QuickTime")
elseif(HAVE_COCOA)
  list(APPEND highgui_srcs src/window_cocoa.mm)
  list(APPEND HIGHGUI_LIBRARIES "-framework Cocoa")
endif()

进一步在opencv-2.4.13.2\CMakeLists.txt下找到了控制HAVE_WIN32UI的开关选项WITH_WIN32UI,如下:

else()
  if(DEFINED WITH_QT)
    status("    QT:" NO)
  endif()
  if(DEFINED WITH_WIN32UI)
    status("    Win32 UI:" HAVE_WIN32UI THEN YES ELSE NO)
  else()
    if(APPLE)
      if(WITH_CARBON)
        status("    Carbon:" YES)
      else()
        status("    Cocoa:"  YES)
      endif()
    else()
      status("    GTK+ 2.x:" HAVE_GTK      THEN "YES (ver ${ALIASOF_gtk+-2.0_VERSION})"     ELSE NO)
      status("    GThread :" HAVE_GTHREAD  THEN "YES (ver ${ALIASOF_gthread-2.0_VERSION})"  ELSE NO)
      status("    GtkGlExt:" HAVE_GTKGLEXT THEN "YES (ver ${ALIASOF_gtkglext-1.0_VERSION})" ELSE NO)
    endif()
  endif()
endif()

至此找到原因:编译opencv的时候设置了WITH_WIN32UI=off导致cmake没有编译windows_w32.cpp最终导致运行时调用cvShowImage出错。
解决办法也很简单,在cmake生成Makefile的命令行参数中添加-DWITH_WIN32UI=on指定编译加入UI函数支持。
以下是我编译opencv的完整命令行参数(注意最后一行):

cmake .. -G "MinGW Makefiles" \
	-DCMAKE_BUILD_TYPE:STRING=release \
	-DCMAKE_C_FLAGS="-m64  " \
	-DCMAKE_CXX_FLAGS="-m64  " \
	-DCMAKE_EXE_LINKER_FLAGS="-static -static-libstdc++ -static-libgcc  " \
	-DCMAKE_INSTALL_PREFIX="D:\caffe-static\release\opencv_windows_gcc520_x86_64" \
	-DBUILD_DOCS=off \
	-DBUILD_SHARED_LIBS=off \
	-DBUILD_PACKAGE=on \
	-DBUILD_PERF_TESTS=off \
	-DBUILD_FAT_JAVA_LIB=off \
	-DBUILD_TESTS=off \
	-DBUILD_TIFF=on \
	-DBUILD_JASPER=on \
	-DBUILD_JPEG=on \
	-DBUILD_OPENEXR=on \
	-DBUILD_PNG=on \
	-DBUILD_ZLIB=on \
	-DBUILD_opencv_apps=off \
	-DBUILD_opencv_calib3d=off \
	-DBUILD_opencv_contrib=off \
	-DBUILD_opencv_features2d=off \
	-DBUILD_opencv_flann=off \
	-DBUILD_opencv_gpu=off \
	-DBUILD_opencv_java=off \
	-DBUILD_opencv_legacy=off \
	-DBUILD_opencv_ml=off \
	-DBUILD_opencv_nonfree=off \
	-DBUILD_opencv_objdetect=off \
	-DBUILD_opencv_ocl=off \
	-DBUILD_opencv_photo=off \
	-DBUILD_opencv_python=off \
	-DBUILD_opencv_stitching=off \
	-DBUILD_opencv_superres=off \
	-DBUILD_opencv_ts=off \
	-DBUILD_opencv_video=off \
	-DBUILD_opencv_videostab=off \
	-DBUILD_opencv_world=off \
	-DBUILD_opencv_lengcy=off \
	-DWITH_DSHOW=off \
	-DWITH_JASPER=on \
	-DWITH_JPEG=on \
	-DWITH_1394=off \
	-DWITH_OPENEXR=on \
	-DWITH_PNG=on \
	-DWITH_TIFF=on \
	-DWITH_1394=off \
	-DWITH_EIGEN=off \
	-DWITH_FFMPEG=off \
	-DWITH_GIGEAPI=off \
	-DWITH_GSTREAMER_0_10=off \
	-DWITH_PVAPI=off -DWITH_CUDA=off \
	-DWITH_CUFFT=off \
	-DWITH_OPENCL=off \
	-DWITH_OPENCLAMDBLAS=off \
	-DWITH_OPENCLAMDFFT=off \
	-DWITH_QT=off \
	-DWITH_VFW=off \
	-DWITH_VTK=off \
	-DWITH_XIMEA=off \
	-DWITH_WIN32UI=on
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
### 回答1: 错误:(-2:未指定错误)该函数未实现。请使用Windows、GTK+ 2.x或Cocoa支持重新构建库。 这个错误通常是由于缺少必要的库或库版本不兼容导致的。建议重新安装或更新相关的库,并确保使用的库版本与程序要求的版本相匹配。如果问题仍然存在,请尝试使用其他库或框架来解决问题。 ### 回答2: 这个错误提示是由于你的程序引用了某个没有被实现的函数,而这个函数所依赖的库没有启用相关的支持。具体来说,可能是你正在使用的库缺乏 Windows、 GTK 2.x 或 Cocoa 支持,需要重新构建这个库。 通常,这个错误会出现在你在编译或运行程序时。如果你使用的是第三方库,可以在库的官方网站或者文档中找到是否需要额外的设置或参数来启用相应的支持。 如果你正在开发自己的库或程序,避免出现这个错误的方式是更好地设计你的代码和依赖关系,确保你所使用的函数都已经被实现了,而且你所依赖的库文件都已经正确地安装和配置好了。 总之,如果出现这个错误,需要仔细检查本地环境和相关库文件是否正确配置,并根据具体情况进行调整和修复。 ### 回答3: 这个错误提示是由于代码中使用了某个函数或库,但该函数或库的实现并没有被找到。提示信息中给出了两种可能的解决方法:重新编译库加入Windows、GTK 2.x或Cocoa支持。 Windows、GTK和Cocoa都是不同的图形用户界面(GUI)开发工具包,用于在不同的操作系统上创建可视化用户界面。如果代码使用了某个GUI相关函数或库但并没有正确地链接它,那么就会出现该错误。 如果你的代码中确实需要使用GUI相关库或函数,那么你需要重新编译该库,并加入Windows、GTK 2.x或Cocoa支持。具体的操作方法要根据该库的文档或示例代码来确定,通常需要对编译器和链接器的设置进行调整。 另一种可能的情况是,在代码中使用了某个不支持的函数或库。如果确实如此,那么你需要重新编写代码,换用支持的函数或库。如果你不确定代码中使用了哪些库或函数,可以使用调试器等工具来寻找并解决这个问题。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

10km

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值