Проблемы декодирования с изображениями из микроскопа, снятого с помощью OpenCV - PullRequest
0 голосов
/ 13 ноября 2018

Я пытаюсь получить изображения с микроскопа EVOCAM II от Vision Engineering с использованием OpenCV. В руководстве говорится, что его можно подключить к компьютеру с помощью кабеля USB 3.0, а затем использовать как обычную веб-камеру.

Поэтому я использую этот очень простой фрагмент для захвата изображений с камеры:

import cv2
camera = cv2.VideoCapture(0)
ret, frame = camera.read()
if ret:
   cv2.imwrite('./test.png', frame)

Однако, когда я должен получить 1920px x 1080px RGB-изображений, я получаю 640px x 480px изображений со странными артефактами:

640px x 480px image with weird artifacts

Я пытался протестировать камеру на другом программном обеспечении, таком как VLC или AMCap , но я либо получаю 640px x 480px черное изображение, либо программное обеспечение даже не может начать захват.

Мне интересно, является ли это проблемой кодирования или это может быть связано с тем, как камера объявляет о себе на компьютере.

Можно ли решить эту проблему, изменив некоторые параметры в OpenCV или это что-то другое?

Большое спасибо за ваше время,

РЕДАКТИРОВАТЬ 1 :

Вывод opencv_version -v в моей среде conda:

General configuration for OpenCV 3.4.2 =====================================
  Version control:               unknown

  Extra modules:
    Location (extra):            /opt/conda/conda-bld/opencv-suite_1533641454250/work/opencv_contrib-3.4.2/modules
    Version control (extra):     unknown

  Platform:
    Timestamp:                   2018-08-07T11:32:43Z
    Host:                        Linux 2.6.32-696.10.1.el6.x86_64 x86_64
    CMake:                       3.12.0
    CMake generator:             Unix Makefiles
    CMake build tool:            /usr/bin/gmake
    Configuration:               Release

  CPU/HW features:
    Baseline:                    SSE SSE2 SSE3
      requested:                 SSE3
    Dispatched code generation:  SSE4_1 SSE4_2 FP16 AVX AVX2 AVX512_SKX
      requested:                 SSE4_1 SSE4_2 AVX FP16 AVX2 AVX512_SKX
      SSE4_1 (3 files):          + SSSE3 SSE4_1
      SSE4_2 (1 files):          + SSSE3 SSE4_1 POPCNT SSE4_2
      FP16 (1 files):            + SSSE3 SSE4_1 POPCNT SSE4_2 FP16 AVX
      AVX (5 files):             + SSSE3 SSE4_1 POPCNT SSE4_2 AVX
      AVX2 (9 files):            + SSSE3 SSE4_1 POPCNT SSE4_2 FP16 FMA3 AVX AVX2
      AVX512_SKX (1 files):      + SSSE3 SSE4_1 POPCNT SSE4_2 FP16 FMA3 AVX AVX2 AVX_512F AVX512_SKX

  C/C++:
    Built as dynamic libs?:      YES
    C++11:                       YES
    C++ Compiler:                /opt/conda/conda-bld/opencv-suite_1533641454250/_build_env/bin/x86_64-conda_cos6-linux-gnu-c++  (ver 7.2.0)
    C++ flags (Release):         -fvisibility-inlines-hidden -std=c++11 -fmessage-length=0 -march=nocona -mtune=haswell -ftree-vectorize -fPIC -fstack-protector-strong -fno-plt -O2 -pipe -I/home/lucas/anaconda3/envs/p35_gpu_jupyter/include -fdebug-prefix-map=${SRC_DIR}=/usr/local/src/conda/${PKG_NAME}-${PKG_VERSION} -fdebug-prefix-map=${PREFIX}=/usr/local/src/conda-prefix   -fsigned-char -W -Wall -Werror=return-type -Werror=non-virtual-dtor -Werror=address -Werror=sequence-point -Wformat -Werror=format-security -Wmissing-declarations -Wundef -Winit-self -Wpointer-arith -Wshadow -Wsign-promo -Wuninitialized -Winit-self -Wno-narrowing -Wno-delete-non-virtual-dtor -Wno-comment -Wimplicit-fallthrough=3 -Wno-strict-overflow -fdiagnostics-show-option -Wno-long-long -pthread -fomit-frame-pointer -ffunction-sections -fdata-sections  -msse -msse2 -msse3 -fopenmp -O3 -DNDEBUG  -DNDEBUG
    C++ flags (Debug):           -fvisibility-inlines-hidden -std=c++11 -fmessage-length=0 -march=nocona -mtune=haswell -ftree-vectorize -fPIC -fstack-protector-strong -fno-plt -O2 -pipe -I/home/lucas/anaconda3/envs/p35_gpu_jupyter/include -fdebug-prefix-map=${SRC_DIR}=/usr/local/src/conda/${PKG_NAME}-${PKG_VERSION} -fdebug-prefix-map=${PREFIX}=/usr/local/src/conda-prefix   -fsigned-char -W -Wall -Werror=return-type -Werror=non-virtual-dtor -Werror=address -Werror=sequence-point -Wformat -Werror=format-security -Wmissing-declarations -Wundef -Winit-self -Wpointer-arith -Wshadow -Wsign-promo -Wuninitialized -Winit-self -Wno-narrowing -Wno-delete-non-virtual-dtor -Wno-comment -Wimplicit-fallthrough=3 -Wno-strict-overflow -fdiagnostics-show-option -Wno-long-long -pthread -fomit-frame-pointer -ffunction-sections -fdata-sections  -msse -msse2 -msse3 -fopenmp -g  -DDEBUG -D_DEBUG
    C Compiler:                  /opt/conda/conda-bld/opencv-suite_1533641454250/_build_env/bin/x86_64-conda_cos6-linux-gnu-cc
    C flags (Release):           -march=nocona -mtune=haswell -ftree-vectorize -fPIC -fstack-protector-strong -fno-plt -O2 -pipe -I/home/lucas/anaconda3/envs/p35_gpu_jupyter/include -fdebug-prefix-map=${SRC_DIR}=/usr/local/src/conda/${PKG_NAME}-${PKG_VERSION} -fdebug-prefix-map=${PREFIX}=/usr/local/src/conda-prefix   -fsigned-char -W -Wall -Werror=return-type -Werror=non-virtual-dtor -Werror=address -Werror=sequence-point -Wformat -Werror=format-security -Wmissing-declarations -Wmissing-prototypes -Wstrict-prototypes -Wundef -Winit-self -Wpointer-arith -Wshadow -Wuninitialized -Winit-self -Wno-narrowing -Wno-comment -Wimplicit-fallthrough=3 -Wno-strict-overflow -fdiagnostics-show-option -Wno-long-long -pthread -fomit-frame-pointer -ffunction-sections -fdata-sections  -msse -msse2 -msse3 -fopenmp -O3 -DNDEBUG  -DNDEBUG
    C flags (Debug):             -march=nocona -mtune=haswell -ftree-vectorize -fPIC -fstack-protector-strong -fno-plt -O2 -pipe -I/home/lucas/anaconda3/envs/p35_gpu_jupyter/include -fdebug-prefix-map=${SRC_DIR}=/usr/local/src/conda/${PKG_NAME}-${PKG_VERSION} -fdebug-prefix-map=${PREFIX}=/usr/local/src/conda-prefix   -fsigned-char -W -Wall -Werror=return-type -Werror=non-virtual-dtor -Werror=address -Werror=sequence-point -Wformat -Werror=format-security -Wmissing-declarations -Wmissing-prototypes -Wstrict-prototypes -Wundef -Winit-self -Wpointer-arith -Wshadow -Wuninitialized -Winit-self -Wno-narrowing -Wno-comment -Wimplicit-fallthrough=3 -Wno-strict-overflow -fdiagnostics-show-option -Wno-long-long -pthread -fomit-frame-pointer -ffunction-sections -fdata-sections  -msse -msse2 -msse3 -fopenmp -g  -DDEBUG -D_DEBUG
    Linker flags (Release):      -Wl,-O2 -Wl,--sort-common -Wl,--as-needed -Wl,-z,relro -Wl,-z,now -Wl,-rpath,/home/lucas/anaconda3/envs/p35_gpu_jupyter/lib -L/home/lucas/anaconda3/envs/p35_gpu_jupyter/lib   
    Linker flags (Debug):        -Wl,-O2 -Wl,--sort-common -Wl,--as-needed -Wl,-z,relro -Wl,-z,now -Wl,-rpath,/home/lucas/anaconda3/envs/p35_gpu_jupyter/lib -L/home/lucas/anaconda3/envs/p35_gpu_jupyter/lib   
    ccache:                      NO
    Precompiled headers:         YES
    Extra dependencies:          dl m pthread rt
    3rdparty dependencies:

  OpenCV modules:
    To be built:                 aruco bgsegm bioinspired calib3d ccalib core datasets dnn dnn_objdetect dpm face features2d flann freetype fuzzy hdf hfs highgui img_hash imgcodecs imgproc java java_bindings_generator line_descriptor ml objdetect optflow phase_unwrapping photo plot python2 python3 python_bindings_generator reg rgbd saliency shape stereo stitching structured_light superres surface_matching text tracking video videoio videostab xfeatures2d ximgproc xobjdetect xphoto
    Disabled:                    js world
    Disabled by dependency:      -
    Unavailable:                 cnn_3dobj cudaarithm cudabgsegm cudacodec cudafeatures2d cudafilters cudaimgproc cudalegacy cudaobjdetect cudaoptflow cudastereo cudawarping cudev cvv matlab ovis sfm ts viz
    Applications:                apps
    Documentation:               NO
    Non-free algorithms:         NO

  GUI: 

  Media I/O: 
    ZLib:                        /home/lucas/anaconda3/envs/p35_gpu_jupyter/lib/libz.so (ver 1.2.11)
    JPEG:                        /home/lucas/anaconda3/envs/p35_gpu_jupyter/lib/libjpeg.so (ver 90)
    WEBP:                        build (ver encoder: 0x020e)
    PNG:                         /home/lucas/anaconda3/envs/p35_gpu_jupyter/lib/libpng.so (ver 1.6.34)
    TIFF:                        /home/lucas/anaconda3/envs/p35_gpu_jupyter/lib/libtiff.so (ver 42 / 4.0.9)
    JPEG 2000:                   /home/lucas/anaconda3/envs/p35_gpu_jupyter/lib/libjasper.so (ver 2.0.14)
    OpenEXR:                     build (ver 1.7.1)
    HDR:                         YES
    SUNRASTER:                   YES
    PXM:                         YES

  Video I/O:
    DC1394:                      NO
    FFMPEG:                      YES
      avcodec:                   YES (ver 58.18.100)
      avformat:                  YES (ver 58.12.100)
      avutil:                    YES (ver 56.14.100)
      swscale:                   YES (ver 5.1.100)
      avresample:                YES (ver 4.0.0)
    GStreamer:                   NO
    libv4l/libv4l2:              NO
    v4l/v4l2:                    linux/videodev.h linux/videodev2.h
    gPhoto2:                     NO

  Parallel framework:            OpenMP

  Trace:                         YES (with Intel ITT)

  Other third-party libraries:
    Intel IPP:                   2017.0.3 [2017.0.3]
           at:                   /opt/conda/conda-bld/opencv-suite_1533641454250/work/build/3rdparty/ippicv/ippicv_lnx
    Intel IPP IW:                sources (2017.0.3)
              at:                /opt/conda/conda-bld/opencv-suite_1533641454250/work/build/3rdparty/ippicv/ippiw_lnx
    Lapack:                      NO
    Eigen:                       YES (ver 3.3.3)
    Custom HAL:                  NO
    Protobuf:                    /home/lucas/anaconda3/envs/p35_gpu_jupyter/lib/libprotobuf.so (3.5.1)

  Python 2:
    Interpreter:                 /opt/conda/conda-bld/opencv-suite_1533641454250/work/py2/bin/python (ver 2.7.15)
    Libraries:                   /opt/conda/conda-bld/opencv-suite_1533641454250/work/py2/lib/libpython2.7m.so (ver 2.7.15)
    numpy:                       /opt/conda/conda-bld/opencv-suite_1533641454250/work/py2/lib/python2.7/site-packages/numpy/core/include (ver 1.11.3)
    packages path:               /opt/conda/conda-bld/opencv-suite_1533641454250/work/py2/lib/python2.7/site-packages

  Python 3:
    Interpreter:                 /opt/conda/conda-bld/opencv-suite_1533641454250/work/py3/bin/python (ver 3.7)
    Libraries:                   /opt/conda/conda-bld/opencv-suite_1533641454250/work/py3/lib/libpython3.7m.so (ver 3.7.0)
    numpy:                       /opt/conda/conda-bld/opencv-suite_1533641454250/work/py3/lib/python3.7/site-packages/numpy/core/include (ver 1.11.3)
    packages path:               /opt/conda/conda-bld/opencv-suite_1533641454250/work/py3/lib/python3.7/site-packages

  Python (for build):            /opt/conda/conda-bld/opencv-suite_1533641454250/work/py2/bin/python

  Java:                          
    ant:                         /usr/bin/ant (ver 1.7.1)
    JNI:                         /usr/lib/jvm/java/include /usr/lib/jvm/java/include/linux /usr/lib/jvm/java/include
    Java wrappers:               YES
    Java tests:                  NO

  Install to:                    /home/lucas/anaconda3/envs/p35_gpu_jupyter
-----------------------------------------------------------------

Ответы [ 2 ]

0 голосов
/ 07 января 2019

TL; DR Используемый кабель был USB 2.0, его замена на USB 3.0 решила проблему захвата в Windows.

Да, я знаю, это звучит довольно глупо, но причина, по которой я получил это странное изображение, заключается в том, что USB-кабель был 2.0, а не 3.0. Поскольку кабель уже был подключен к камере, я не стал проверять его, но изменив его на 3.0, он мгновенно заработал в приложении Windows на камере. Компания также подтвердила, что EVO Cam II генерирует сигнал в формате DirectShow .

Однако, сравнивая изображения, сохраненные на USB-накопителе камерой, и снимок, сделанный с помощью USB-кабеля, я понял, что качество не одинаковое. И особенно в моем случае качество изображений, снятых с помощью USB-кабеля, недостаточно хорошее. Поэтому я больше не буду преследовать это направление.

Однако для тех, кто хотел бы продолжить с того места, где я его оставил, вот несколько ссылок, которые мне предоставила поддержка Vision Engineering для захвата изображений с помощью OpenCV в Linux:

  1. Страница свойств веб-камеры DirectShow на Python
  2. http://videocapture.sourceforge.net/

На данный момент у них нет прямого решения для этого.

0 голосов
/ 19 ноября 2018

Различные виды USB-передачи

На странице, на которую вы ссылались, не говорится, что устройство можно «подключить к компьютеру с помощью кабеля USB 3.0 и затем использовать в качестве обычной веб-камеры». На странице сказано только, что у нее интерфейс usb 3.0. Единственный ресурс, доступный на странице, на которую вы ссылались, - это брошюра, в которой также не говорится, что она «подключи и работай».

В области устройств зрения и устройств обработки изображений общим интерфейсом над USB является стандарт "USB зрения" . Поставщики, которые делают такие устройства, предоставляют специализированные драйверы и обычно предоставляют пример кода о том, как взаимодействовать с популярными библиотеками, такими как openCV. Использование устройств с этим стандартом обеспечивает повышенную скорость передачи данных, меньшее время задержки и более низкое использование процессора по сравнению с технологией plug-and-play. Часто драйвер plug-and-play также предоставляется, но у вас нет гарантии. Если такой драйвер plug-and-play будет доступен в дополнение к usb vision, вам следует вместо этого использовать драйвер usb vision, так как он будет наиболее вероятным.

Тот факт, что продавец ничего не говорит о том, что это за драйвер, сразу вызывает у меня подозрение. Я связался бы с ними перед любой покупкой, и они объяснили бы, почему это не упомянуто (или возможно это скрыто где-нибудь на их веб-странице?)

В linux (в комментариях вы говорите, что запускаете ubuntu 18.04), эта функциональность plug-and-play доступна через video-for-linux "v4l". Если вы хотите использовать свое устройство, как показано выше, вам необходимо убедиться, что поставщик предоставляет драйвер v4l, который подходит для вашей версии Linux.

Версия Ubuntu

На момент написания этой статьи (19 ноября 2018 г.) Ubuntu 18.04 существовал недостаточно долго, чтобы ожидать стабильности необычных сценариев использования. Если поставщик этого устройства формирования изображений предоставляет драйверы интерфейса v4l, существует разумная вероятность его нестабильности. Попробуйте использовать Ubuntu 16, если это возможно. Если вы обнаружите, что он работает с Ubuntu 16, даже если ваши драйверы должны работать для Ubuntu 18, обязательно сообщите разработчикам, что вы нашли ошибку.

...