简体   繁体   English

opencv VideoCapture() 无法在 c++ 上打开,由 python 打开

[英]opencv VideoCapture() couldn't open on c++ by opened by python

Good day,再会,

c++

I installed opencv/4.5.2 from conan (by cmake macro ) and try a simple piece of code :我从柯南(通过 cmake )安装了opencv/4.5.2并尝试了一段简单的代码

cv::VideoCapture cap(0, cv::CAP_MSMF);
if (!cap.isOpened()) {
    cerr << "couldn't open\n";
    return -1; // <<-- stop here
}
// ...
# ...
conan_cmake_run(
            REQUIRES
            ${CONAN_EXTRA_REQUIRES}
            opencv/4.5.2
            OPTIONS
            ${CONAN_EXTRA_OPTIONS}
            BASIC_SETUP
            CMAKE_TARGETS # individual targets to link to
            BUILD
            missing)

The same result in debug and release building an executable.调试和发布构建可执行文件的结果相同。

hardware硬件

$ls -ltrh /dev/video*                                                                                                                                                                    
crw-rw----+ 1 root video 81, 1 июн 27 22:26 /dev/video1
crw-rw----+ 1 root video 81, 0 июн 27 22:26 /dev/video0

python

Same code on python works fine: python 上的相同代码可以正常工作:

import cv2


c = cv2.VideoCapture(0, 0)

while(True):
    r, frame = c.read()
    cv2.imshow('p', frame)

    if cv2.waitKey(1) & 0xFF == ord('q'):
        break
        

c.release()
cv2.destroyAllWindows()

Fix static libjpeg-turbo dependency修复 static libjpeg-turbo依赖

In order to satisfy conan and automatically generated cmake files you should build static libjpeg-turbo library.为了满足柯南和自动生成的conan文件,您应该构建 static libjpeg-turbo库。

git clone https://github.com/libjpeg-turbo/libjpeg-turbo.git
cd libjpeg-turbo
cmake -B build -DCMAKE_BUILD_TYPE=Release .
sudo cmake --install build --prefix /usr/

OS操作系统

$uname -a
Linux omen 5.10.41-1-MANJARO #1 SMP PREEMPT Fri May 28 19:10:32 UTC 2021 x86_64 GNU/Linux

PS附言

Add user to video group or run ./main as root didn't have any benefits.将用户添加到video组或以 root 身份运行./main没有任何好处。

UPD1 UPD1

cv::utils::logging::setLogLevel(cv::utils::logging::LOG_LEVEL_VERBOSE);
std::cout << cv::getBuildInformation();
return 0;

The both logs for release|debug build Video I/O sections are empty. release|debug build Video I/O部分的两个日志都是空的。 But python has the following section:但是 python 有以下部分:

Video I/O:
    DC1394:                      NO
    FFMPEG:                      YES
      avcodec:                   YES (58.109.100)
      avformat:                  YES (58.61.100)
      avutil:                    YES (56.60.100)
      swscale:                   YES (5.8.100)
      avresample:                NO
    GStreamer:                   NO
    v4l/v4l2:                    YES (linux/videodev2.h)

UPD2 UPD2

This is logging after VideoCapture cap(0, cv::CAP_ANY)这是在VideoCapture cap(0, cv::CAP_ANY)之后记录的

[DEBUG:0] global /home/user/.conan/data/opencv/4.5.2/_/_/build/82e231b59ebe3f3bd9c050e2b1b60042669442a6/source_subfolder/modules/videoio/src/videoio_registry.cpp (191) VideoBackendRegistry VIDEOIO: Builtin backends(7): FFMPEG(1000); GSTREAMER(990); INTEL_MFX(980); MSMF(970); CV_IMAGES(960); CV_MJPEG(950); UEYE(940)
[DEBUG:0] global /home/user/.conan/data/opencv/4.5.2/_/_/build/82e231b59ebe3f3bd9c050e2b1b60042669442a6/source_subfolder/modules/videoio/src/videoio_registry.cpp (215) VideoBackendRegistry VIDEOIO: Available backends(7): FFMPEG(1000); GSTREAMER(990); INTEL_MFX(980); MSMF(970); CV_IMAGES(960); CV_MJPEG(950); UEYE(940)
[ INFO:0] global /home/user/.conan/data/opencv/4.5.2/_/_/build/82e231b59ebe3f3bd9c050e2b1b60042669442a6/source_subfolder/modules/videoio/src/videoio_registry.cpp (217) VideoBackendRegistry VIDEOIO: Enabled backends(7, sorted by priority): FFMPEG(1000); GSTREAMER(990); INTEL_MFX(980); MSMF(970); CV_IMAGES(960); CV_MJPEG(950); UEYE(940)
[ INFO:0] global /home/user/.conan/data/opencv/4.5.2/_/_/build/82e231b59ebe3f3bd9c050e2b1b60042669442a6/source_subfolder/modules/videoio/src/backend_plugin.cpp (324) getPluginCandidates VideoIO plugin (GSTREAMER): glob is 'libopencv_videoio_gstreamer*.so', 1 location(s)
[ INFO:0] global /home/user/.conan/data/opencv/4.5.2/_/_/build/82e231b59ebe3f3bd9c050e2b1b60042669442a6/source_subfolder/modules/videoio/src/backend_plugin.cpp (331) getPluginCandidates     - ./cmake-build-debug/bin: 0
[ INFO:0] global /home/user/.conan/data/opencv/4.5.2/_/_/build/82e231b59ebe3f3bd9c050e2b1b60042669442a6/source_subfolder/modules/videoio/src/backend_plugin.cpp (335) getPluginCandidates Found 0 plugin(s) for GSTREAMER
[ INFO:0] global /home/user/.conan/data/opencv/4.5.2/_/_/build/82e231b59ebe3f3bd9c050e2b1b60042669442a6/source_subfolder/modules/videoio/src/backend_plugin.cpp (324) getPluginCandidates VideoIO plugin (MSMF): glob is 'libopencv_videoio_msmf*.so', 1 location(s)
[ INFO:0] global /home/user/.conan/data/opencv/4.5.2/_/_/build/82e231b59ebe3f3bd9c050e2b1b60042669442a6/source_subfolder/modules/videoio/src/backend_plugin.cpp (331) getPluginCandidates     - ./cmake-build-debug/bin: 0
[ INFO:0] global /home/user/.conan/data/opencv/4.5.2/_/_/build/82e231b59ebe3f3bd9c050e2b1b60042669442a6/source_subfolder/modules/videoio/src/backend_plugin.cpp (335) getPluginCandidates Found 0 plugin(s) for MSMF
[ INFO:0] global /home/user/.conan/data/opencv/4.5.2/_/_/build/82e231b59ebe3f3bd9c050e2b1b60042669442a6/source_subfolder/modules/videoio/src/backend_plugin.cpp (324) getPluginCandidates VideoIO plugin (UEYE): glob is 'libopencv_videoio_ueye*.so', 1 location(s)
[ INFO:0] global /home/user/.conan/data/opencv/4.5.2/_/_/build/82e231b59ebe3f3bd9c050e2b1b60042669442a6/source_subfolder/modules/videoio/src/backend_plugin.cpp (331) getPluginCandidates     - ./cmake-build-debug/bin: 0
[ INFO:0] global /home/user/.conan/data/opencv/4.5.2/_/_/build/82e231b59ebe3f3bd9c050e2b1b60042669442a6/source_subfolder/modules/videoio/src/backend_plugin.cpp (335) getPluginCandidates Found 0 plugin(s) for UEYE

As I wrote before I use conan script to build opencv :正如我在使用柯南脚本构建conan之前opencv

macro(run_conan)
    # Download automatically, you can also just copy the conan.cmake file
    if (NOT EXISTS "${CMAKE_BINARY_DIR}/conan.cmake")
        message(STATUS "Downloading conan.cmake from https://github.com/conan-io/cmake-conan")
        file(DOWNLOAD "https://github.com/conan-io/cmake-conan/raw/v0.15/conan.cmake" "${CMAKE_BINARY_DIR}/conan.cmake")
    endif ()

    include(${CMAKE_BINARY_DIR}/conan.cmake)

    conan_add_remote(
            NAME
            bincrafters
            URL
            https://api.bintray.com/conan/bincrafters/public-conan)

    conan_cmake_run(
            REQUIRES
            ${CONAN_EXTRA_REQUIRES}
            opencv/4.5.2
            fmt/8.0.0
            OPTIONS
            ${CONAN_EXTRA_OPTIONS}
            BASIC_SETUP
            CMAKE_TARGETS # individual targets to link to
            BUILD
            missing)
endmacro()

In Linux (manjaro in my case) you should install pacman -S v4l-utils and add somewhere in CMakeLists.txt instruction: set(CONAN_EXTRA_OPTIONS ${CONAN_EXTRA_OPTIONS} opencv:with_v4l=True) .在 Linux(在我的例子中是 manjaro)中,您应该安装pacman -S v4l-utils并在CMakeLists.txt指令中的某处添加: set(CONAN_EXTRA_OPTIONS ${CONAN_EXTRA_OPTIONS} opencv:with_v4l=True)

After that in section of cv::getBuildInformation() I have the following:cv::getBuildInformation()部分之后,我有以下内容:

Video I/O:
    v4l/v4l2:                    YES (linux/videodev2.h)

And voila!瞧!

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM