OpenCV 4.9.0 C++代码运行报错:highgui模块函数未实现,求解决
问题:OpenCV 4.9.0 C++调用摄像头显示时提示cvNamedWindow未实现
我用C++17编写了调用摄像头实时显示画面的代码,通过CMake管理依赖,CMakeLists.txt配置了从官网源码编译的OpenCV 4.9.0路径。运行版本检测代码可正常输出版本信息,但运行摄像头显示代码时抛出异常,提示cvNamedWindow函数未实现,要求重建库并添加Windows/GTK+2.x/Cocoa支持,Ubuntu/Debian系统需安装libgtk2.0-dev和pkg-config后重新编译。
我已安装上述依赖并重新编译OpenCV,甚至重新解压源码编译、修改CMakeLists.txt中的OpenCV路径、清理重建项目,但问题仍未解决。不过Python/Java版本的同类摄像头显示代码可正常运行。
相关代码与配置
1. 摄像头显示代码
#include <opencv4/opencv2/opencv.hpp> #include <iostream> int main() { cv::VideoCapture cap(0); if (!cap.isOpened()) { std::cerr << "Error: Could not open camera" << std::endl; return -1; } cv::Mat frame; cv::namedWindow("Camera Output", cv::WINDOW_AUTOSIZE); while (true) { cap >> frame; if (frame.empty()) { std::cerr << "Error: Could not capture frame" << std::endl; break; } cv::imshow("Camera Output", frame); if (cv::waitKey(1) == 'q') break; } cap.release(); cv::destroyAllWindows(); return 0; }
2. CMakeLists.txt配置
cmake_minimum_required(VERSION 3.27) project(opencv_4_9_0_test) set(CMAKE_CXX_STANDARD 17) set(OpenCV_DIR "/home/me/opencv-4.9.0/build/opencv2") find_package(OpenCV REQUIRED) message(STATUS "OpenCV library status:") message(STATUS " version: ${OpenCV_VERSION}") message(STATUS " libraries: ${OpenCV_LIBS}") message(STATUS " include path: ${OpenCV_INCLUDE_DIRS}") include_directories(${OpenCV_INCLUDE_DIRS}) add_executable(opencv_4_9_0_test main.cpp) target_link_libraries(opencv_4_9_0_test ${OpenCV_LIBS})
3. 报错信息
/home/me/CppProjects/opencv_4_9_0_test/cmake-build-debug/opencv_4_9_0_test terminate called after throwing an instance of 'cv::Exception' what(): OpenCV(4.9.0) /home/me/opencv-4.9.0/modules/highgui/src/window.cpp:1255: error: (-2:Unspecified error) The function is not implemented. Rebuild the library with Windows, GTK+ 2.x or Cocoa support. If you are on Ubuntu or Debian, install libgtk2.0-dev and pkg-config, then re-run cmake or configure script in function 'cvNamedWindow' Process finished with exit code 134 (interrupted by signal 6:SIGABRT)
解决思路与方案
1. 重新编译OpenCV并启用GUI后端
Python/Java版本正常运行说明系统GUI依赖没问题,问题出在C++版OpenCV编译时未正确启用GUI后端:
- 删除原build目录,新建并进入:
rm -rf /home/me/opencv-4.9.0/build mkdir -p /home/me/opencv-4.9.0/build && cd /home/me/opencv-4.9.0/build - 运行CMake时显式指定GTK后端(优先GTK2,也可尝试GTK3):
cmake -D CMAKE_BUILD_TYPE=RELEASE \ -D CMAKE_INSTALL_PREFIX=/usr/local \ -D WITH_GTK=ON \ -D WITH_GTK2=ON \ -D BUILD_opencv_highgui=ON \ .. - 编译安装:
make -j$(nproc) sudo make install
2. 修正CMakeLists.txt的OpenCV路径
OpenCV_DIR需指向包含OpenCVConfig.cmake的目录,通常是编译后的build根目录,修改为:
set(OpenCV_DIR "/home/me/opencv-4.9.0/build")
3. 验证编译配置
查看CMake缓存确认GUI后端已启用:
grep -i "WITH_GTK" /home/me/opencv-4.9.0/build/CMakeCache.txt
确保输出中WITH_GTK:BOOL=ON和WITH_GTK2:BOOL=ON。
4. 清理项目缓存重建
删除项目编译目录后重新构建:
rm -rf /home/me/CppProjects/opencv_4_9_0_test/cmake-build-debug cd /home/me/CppProjects/opencv_4_9_0_test cmake . make
内容的提问来源于stack exchange,提问作者SFriendly
相关产品推荐
相关产品推荐

