【问题标题】:Unable to display window via cv::imshow(). What am I missing?无法通过 cv::imshow() 显示窗口。我错过了什么?
【发布时间】:2021-02-10 08:36:55
【问题描述】:

我正在使用简单的介绍 OpenCV 程序。我在 Virtualbox 中运行(作为 Ubuntu 20.04)。 C++/VS 代码。 LLDB 调试器。如果我在 MacOS 或 Windows 上运行 virtualbox,也会出现同样的错误。

---main.cpp---

#include <opencv2/opencv.hpp>     // Catch all for all libraries within OpenCV

int main()
{
  cv::VideoCapture cap; //initialize capture
  cap.open(0);
  if (!cap.isOpened()) // check if succeeded to connect to the camera
    CV_Assert("Cam open failed");
  cap.set(cv::CAP_PROP_FRAME_WIDTH, 1280);
  cap.set(cv::CAP_PROP_FRAME_HEIGHT, 720);
  // cv::namedWindow("window", 1); //create window to show image

  while (1)
  {
    cv::Mat image; //Create Matrix to store image
    cap >> image;  //copy webcam stream to image

    // If the frame is empty, break immediately
    if (image.empty())
      break;

    cv::imshow("window", image); //print image to screen. <-- fail here.
    cv::waitKey(33);             //delay 33ms
  }
  return 0;
}

---CMakeLists.txt---

# https://gist.github.com/UnaNancyOwen/5061d8c966178b753447e8a9f9ac8cf1
cmake_minimum_required(VERSION 3.0.0)
set(CMAKE_TOOLCHAIN_FILE "/home/vagrant/Desktop/vcpkg/scripts/buildsystems/vcpkg.cmake")
project(openCV_test VERSION 0.1.0)
add_executable(${PROJECT_NAME} main.cpp)

set(OpenCV_DIR "/home/vagrant/Desktop/vcpkg/installed/x64-linux/share/opencv")
# set(WITH_GTK "ON")    # testing here...
# set(WITH_QT "OFF")

find_package(OpenCV REQUIRED)

# Display some variables
message(STATUS "OpenCV library status:")
message(STATUS "    version: ${OpenCV_VERSION}")
message(STATUS "    libraries: ${OpenCV_LIBS}")
message(STATUS "    include path: ${OpenCV_INCLUDE_DIRS}")

if( OpenCV_FOUND )
  # Additional Include Directories
  include_directories( ${OpenCV_INCLUDE_DIRS} )

  # Additional Library Directories
  link_directories( ${OpenCV_LIB_DIR} )

  # Additional Dependencies
  target_link_libraries( ${PROJECT_NAME} ${OpenCV_LIBS} )
endif()

注意,我尝试从 git repo 手动构建 OpenCV 包,并使用 VCPKG 包管理器。无论哪种方式,结果都相同。同样失败。请注意,相机在 virtualbox 中效果很好。通过在 html5 网站上的 virtualbox 浏览器中进行测试,以测试相机的使用。当我逐步执行代码时,我可以看到相机 LED 在适当的时间亮起。系统炸弹始终在 cv::imshow() 代码行。

错误消息状态:

在抛出 'cv::Exception' 实例后调用终止
什么():OpenCV(4.5.1-dev) /home/vagrant/opencv-master/modules/highgui/src/window.cpp:679:错误: (-2:未指定的错误)该功能未实现。重建 带有 Windows、GTK+ 2.x 或 Cocoa 支持的库。如果你在 Ubuntu 或 Debian,安装 libgtk2.0-dev 和 pkg-config,然后重新运行 cmake 或 在函数'cvShowImage'中配置脚本

这是 imshow() 函数的类信息:

void cv::imshow(const cv::String &winname, cv::InputArray mat) +1 过载

在指定窗口中显示图像。函数显示 在指定窗口中显示图像。如果创建了窗口 使用 cv::WINDOW_AUTOSIZE 标志,图像显示为 原始尺寸,但它仍然受到屏幕分辨率的限制。 否则,将缩放图像以适合窗口。该功能可能 缩放图像,取决于其深度: - 如果图像是 8 位 无符号,按原样显示。 - 如果图像是 16 位无符号或 32位整数,像素除以256。即值 范围 [0,255

参数: winname – 窗口的名称。 mat – 要显示的图像。

我已经完成了 libgtk2.0-dev 和 pkg-config 的所有安装组合,但没有结果。我什至在构建具有一致(失败)结果的 OpenCV 库之前安装了这些库。我知道一年前我在一个虚拟机上成功地使用了这个例子。完全不清楚错误消息是否准确表示失败。

【问题讨论】:

  • 我看到你评论了创建窗口的行?
  • 我不知道流是如何工作的。我个人习惯打电话:bool success = cap.read(image);
  • 你能在imshow之前加一个检查器吗?比如:if(image.data)

标签: c++ opencv ubuntu virtualbox vcpkg


【解决方案1】:

所以这里是一步一步调试时出现的错误的屏幕截图。那个错误说明函数没有实现。使用 Windows、GTK+ 2.x 或 Cocoa 支持重建库。如果您使用的是 Ubuntu 或 Debian,请安装 libgtk2.0-dev 和 pkg-config,然后重新运行 cmake 或在函数 'cvShowImage' 中配置脚本 对我来说毫无意义。但请仔细查看绿色圆圈中的注释。哪个highgui.h是哪个?哎哟。这些双目录是在尝试通过 VCPKG 包管理器安装 OpenCV 之后创建的(并且 CMakeLists.txt 严重失败)。所以我然后通过 github repo 做了一个额外的安装。我没有删除 VCPKG 的东西。这是一团糟。

解决办法?删除整个 virtualbox 并从头开始。我按照https://linuxize.com/post/how-to-install-opencv-on-debian-10/ 中概述的步骤从 github 源代码成功构建了 OpenCV

$ sudo apt install build-essential cmake git pkg-config libgtk-3-dev \
libavcodec-dev libavformat-dev libswscale-dev libv4l-dev \
libxvidcore-dev libx264-dev libjpeg-dev libpng-dev libtiff-dev \
gfortran openexr libatlas-base-dev python3-dev python3-numpy \
libtbb2 libtbb-dev libdc1394-22-dev

$ mkdir ~/opencv_build && cd ~/opencv_build
$ git clone https://github.com/opencv/opencv.git
$ git clone https://github.com/opencv/opencv_contrib.git

$ cd ~/opencv_build/opencv
$ mkdir build && cd build

$ cmake -D CMAKE_BUILD_TYPE=RELEASE \
-D CMAKE_INSTALL_PREFIX=/usr/local \
-D INSTALL_C_EXAMPLES=ON \
-D INSTALL_PYTHON_EXAMPLES=ON \
-D OPENCV_GENERATE_PKGCONFIG=ON \
-D OPENCV_EXTRA_MODULES_PATH=~/opencv_build/opencv_contrib/modules \
-D BUILD_EXAMPLES=ON ..

$ make -j4                            # Start the compilation process (long time!)

$ sudo make install                   # Install OpenCV

$ pkg-config --modversion opencv4     # test the install
--> 4.5.1 

我仍然没有完全理解 rebuild the library... GTK.. pkg-config 的全部内容,但我怀疑根本问题是混淆了支持库的位置。此处发布的信息以防其他人遇到错误消息。

还有一点说明——这是我最终的 CMakeLists.txt 文件,它与从源代码构建的库完全兼容:

cmake_minimum_required(VERSION 3.0.0)
project(openCV_test VERSION 0.1.0)
add_executable(${PROJECT_NAME} main.cpp)
set(OpenCV_DIR "/usr/local/lib")   # per github install of OpenCV
find_package(OpenCV REQUIRED)
target_include_directories(${PROJECT_NAME} PRIVATE ${OpenCV_INCLUDE_DIRS})

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多