Search code examples
c++opencvconan

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:

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:

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

In order to satisfy conan and automatically generated cmake files you should build static libjpeg-turbo library.

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.

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. But python has the following section:

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

This is logging after 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

Solution

  • As I wrote before I use conan script to build 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).

    After that in section of cv::getBuildInformation() I have the following:

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

    And voila!