Skip to content

OpenCV:Troubleshooting

Not found QTKit

macOS로 업데이트 할 경우 OpenCV 3.1.0 버전에서 QTKit을 찾을 수 없다는 에러가 발생한다.

/Users/your/Project/tparty/tmp/build/opencv-3.1.0/3rdparty/zlib/inflate.c:1507:61: warning: shifting a negative signed value is undefined
      [-Wshift-negative-value]
    if (strm == Z_NULL || strm->state == Z_NULL) return -1L << 16;
                                                        ~~~ ^
1 warning generated.
/Library/Developer/CommandLineTools/usr/bin/ranlib: file: ../lib/liblibtiff.a(tif_jbig.c.o) has no symbols
/Library/Developer/CommandLineTools/usr/bin/ranlib: file: ../lib/liblibtiff.a(tif_jpeg_12.c.o) has no symbols
/Library/Developer/CommandLineTools/usr/bin/ranlib: file: ../lib/liblibtiff.a(tif_jpeg.c.o) has no symbols
/Library/Developer/CommandLineTools/usr/bin/ranlib: file: ../lib/liblibtiff.a(tif_lzma.c.o) has no symbols
/Library/Developer/CommandLineTools/usr/bin/ranlib: file: ../lib/liblibtiff.a(tif_ojpeg.c.o) has no symbols
/Library/Developer/CommandLineTools/usr/bin/ranlib: file: ../lib/liblibtiff.a(tif_jbig.c.o) has no symbols
/Library/Developer/CommandLineTools/usr/bin/ranlib: file: ../lib/liblibtiff.a(tif_jpeg_12.c.o) has no symbols
/Library/Developer/CommandLineTools/usr/bin/ranlib: file: ../lib/liblibtiff.a(tif_jpeg.c.o) has no symbols
/Library/Developer/CommandLineTools/usr/bin/ranlib: file: ../lib/liblibtiff.a(tif_lzma.c.o) has no symbols
/Library/Developer/CommandLineTools/usr/bin/ranlib: file: ../lib/liblibtiff.a(tif_ojpeg.c.o) has no symbols
/Library/Developer/CommandLineTools/usr/bin/ranlib: file: ../lib/libIlmImf.a(IlmThread.cpp.o) has no symbols
/Library/Developer/CommandLineTools/usr/bin/ranlib: file: ../lib/libIlmImf.a(IlmThreadMutex.cpp.o) has no symbols
/Library/Developer/CommandLineTools/usr/bin/ranlib: file: ../lib/libIlmImf.a(IlmThreadSemaphore.cpp.o) has no symbols
/Library/Developer/CommandLineTools/usr/bin/ranlib: file: ../lib/libIlmImf.a(IlmThreadSemaphorePosixCompat.cpp.o) has no symbols
/Library/Developer/CommandLineTools/usr/bin/ranlib: file: ../lib/libIlmImf.a(IlmThread.cpp.o) has no symbols
/Library/Developer/CommandLineTools/usr/bin/ranlib: file: ../lib/libIlmImf.a(IlmThreadMutex.cpp.o) has no symbols
/Library/Developer/CommandLineTools/usr/bin/ranlib: file: ../lib/libIlmImf.a(IlmThreadSemaphore.cpp.o) has no symbols
/Library/Developer/CommandLineTools/usr/bin/ranlib: file: ../lib/libIlmImf.a(IlmThreadSemaphorePosixCompat.cpp.o) has no symbols
/Users/your/Project/tparty/tmp/build/opencv-3.1.0/modules/videoio/src/cap_qtkit.mm:46:9: fatal error: 'QTKit/QTKit.h' file not found
#import <QTKit/QTKit.h>
        ^
1 error generated.
make[2]: *** [modules/videoio/CMakeFiles/opencv_videoio.dir/src/cap_qtkit.mm.o] Error 1
make[2]: *** Waiting for unfinished jobs....
make[1]: *** [modules/videoio/CMakeFiles/opencv_videoio.dir/all] Error 2
make[1]: *** Waiting for unfinished jobs....
make: *** [all] Error 2

최신버전으로 업데이트하면 된다.

Unable to stop the stream: Inappropriate ioctl for device

OpenCV3에서 아래와 같은 에러가 나타날 수 있다.

Unable to stop the stream: Inappropriate ioctl for device

VideoCapture 등에서 발생될 수 있는 에러이며, FFmpeg과 함께 다시 컴파일 하면 된다.

아래와 같이 CMake옵션을 추가하면 된다.

-DBUILD_PNG=1
-DBUILD_JPEG=1
-DWITH_CUDA=1
-DWITH_FFMPEG=1

waitKey 에서 방향키 입력

waitKey()를 사용할 경우 방향키 입력시 0이 반환된다. waitKeyEx()를 사용해 보자.

HIGHGUI ERROR: V4L/V4L2: VIDIOC_S_CROP

== Assertion failed (p.checkVector(2, CV_32S) >= 0) in polylines ==

OpenCV Error: Assertion failed (p.checkVector(2, CV_32S) >= 0) in polylines, file /tmp/buildd/ros-fuerte-opencv2-2.4.2-1precise-20130312-1306/modules/core/src/d rawing.cpp, line 2065

The problem in my case was that numpy.array created int64-bit numbers by default. So I had to explicitly convert it to int32:

points = np.array([[910, 641], [206, 632], [696, 488], [458, 485]])
# points.dtype => 'int64'
cv2.polylines(img, np.int32([points]), 1, (255,255,255))

(Looks like a bug in cv2 python binding, it should've verified dtype)

unsafe use of relative rpath

MacOSX에서 OpenCV-Python을 사용하기 위해 import cv2를 입력한 순간 아래와 같은 에러 메시지가 출력될 수 있다.

>>> import cv2
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ImportError: dlopen(/usr/local/lib/python2.7/site-packages/cv2.so, 2): Library not loaded: lib/libopencv_shape.3.0.dylib
  Referenced from: /usr/local/lib/python2.7/site-packages/cv2.so
  Reason: unsafe use of relative rpath lib/libopencv_shape.3.0.dylib in /usr/local/lib/python2.7/site-packages/cv2.so with restricted binary

이 경우, cmake -DBUILD_SHARED_LIBS=OFF를 사용하여 정적 라이브러리로 다시 컴파일 하면 된다.

libdc1394 error

import cv;시점에 아래와 같은 에러가 발생할 수 있다.

root@7be8cca34837:/# python
Python 2.7.6 (default, Jun 22 2015, 17:58:13)
[GCC 4.8.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import cv
libdc1394 error: Failed to initialize libdc1394

아래와 같이 해결할 수 있다.

sudo ln /dev/null /dev/raw1394

libGL.so.1: cannot open shared object file

다음과 같은 에러가 출력되면

ImportError: libGL.so.1: cannot open shared object file: No such file or directory

OpenGL 라이브러리를 설치하면 된다.

sudo apt-get install libgl1-mesa-glx

서버에서 돌린다면 opencv-python 패키지 대신 opencv-python-headless 패키지를 설치하면 된다.

PyCharm에서 심볼을 찾을 수 없는 문제

몇 가지 해결 방법이 있다.

4.5.4.60 버전으로 다운그레이드 하거나,

pip install -U opencv-python==4.5.4.60

cv2.cv2 모듈을 사용하거나, (이 방법은 심볼을 찾아지나 정상적으로 실행되지 않을 수 있다)

from cv2 import cv2

pyi 파일을 직접 만들어, site-packages/cv2에 넣는 방법이 있다. 이 방법은 PEP 484#Stub Files 항목을 참조.

미리 만들어진 pyi파일을 사용하고 싶다면, python-type-stubs에서 직접 다운받는 방법도 있다.

# you can set it to "pipenv" or "poetry"
_pip=poetry
# _pip=pipenv
curl -sSL https://raw.githubusercontent.com/microsoft/python-type-stubs/main/cv2/__init__.pyi \
    -o $($_pip run python -c 'import cv2, os; print(os.path.dirname(cv2.__file__))')/__init__.pyi
unset _pip

좀 더 쓸만한(?) 스크립트 버전:

#!/usr/bin/env bash

ROOT_DIR=$(cd "$(dirname "${BASH_SOURCE[0]}")" || exit; pwd)

function print_error
{
    # shellcheck disable=SC2145
    echo -e "\033[31m$@\033[0m" 1>&2
}

function print_message
{
    # shellcheck disable=SC2145
    echo -e "\033[32m$@\033[0m"
}

trap 'cancel_black' INT

function cancel_black
{
    print_error "An interrupt signal was detected."
    exit 1
}

if "$ROOT_DIR/python" -m pip show -q opencv-python &> /dev/null; then
    print_error "Not found cv2 package"
    exit 1
fi

DOWNLOAD_URL="https://raw.githubusercontent.com/microsoft/python-type-stubs/main/cv2/__init__.pyi"
DEST_DIR=$("$ROOT_DIR/python" -c 'import cv2, os; print(os.path.dirname(cv2.__file__))')

curl -sSL "$DOWNLOAD_URL" -o "$DEST_DIR/__init__.pyi"

High-level GUI 호출시 Freezing 발생

OpenCV의 High-level GUI 중 하나 (e.g. cv2.namedWindow, cv2.imshow, etc ...) 를 호출하면 프로그램이 프리징(Freezing)되는 현상이 발생될 수 있다.

이 경우 (보통) Video 관련 라이브러리가 출돌날 수 있다.

확인된 충돌나는 라이브러리 목록은 다음과 같다:

  • torchvision
  • pyav를 import 했다면 ffmpeg DLL 로드 문제일 수 있다.

tkinter를 사용하는 방식 등 다른 방식을 시도해 보자. 관련 예제는 OpenCV:Example:Tkinter 항목을 참조.

또는 cv2.namedWindow 를 프로그램 시작하자 호출해 버리자.

import cv2
cv2.namedWindow(WINDOW_TITLE, WINDOW_FLAGS)
## 이후 문제가 되는 라이브러리 import
import torchvision

import 코드가 스크립트의 상단에 몰려있다면 __init__.py 으로 인해 자신도 모르게 호출될 수 있다. 주의하자.

imshow 에서 화면이 멎어버리는 현상

상위 항목, #High-level GUI 호출시 Freezing 발생 항목 참조. 페이지 참조로 인해 남겨둔다.

cv2.namedWindow() 호출시 멈추는 현상

상위 항목, #High-level GUI 호출시 Freezing 발생 항목 참조. 페이지 참조로 인해 남겨둔다.

정리된 루틴

손쉬운 복붙을 위한 Python 코드 스텁:

window_title = getattr(args, "window_title", WINDOW_TITLE)
window_flags = getattr(args, "window_flags", WINDOW_FLAGS)

assert isinstance(args.no_preload_highgui, bool)
if not args.headless and not args.no_preload_highgui:
    import cv2

    # noinspection SpellCheckingInspection
    """
    [IMPORTANT]
    There are many libraries that conflict with OpenCV's highgui module.
    In this case, freezing may occur in functions such as `cv2.imshow`.
    To prevent this problem, highgui-related modules are imported first.
    """
    cv2.namedWindow(window_title, window_flags)

영문 부분의 번역:

[중요]
OpenCV의 highgui 모듈과 충돌하는 라이브러리가 많이 있습니다.
이 경우 `cv2.imshow` 등의 함수에서 프리징 현상이 발생할 수 있습니다.
이 문제를 방지하기 위해 highgui 관련 모듈을 먼저 임포트 합니다.

qt.qpa.xcb: could not connect to display

qt.qpa.xcb: could not connect to display
qt.qpa.plugin: Could not load the Qt platform plugin "xcb" in "/home/bbb/Project/ddrm/.venv/lib/python3.11/site-packages/cv2/qt/plugins" even though it was found.
This application failed to start because no Qt platform plugin could be initialized. Reinstalling the application may fix this problem.

Available platform plugins are: xcb.

./python: line 345: 3747217 Aborted                 (core dumped) PYTHONPATH="$ROOT_DIR:$PYTHONPATH" "$PYTHON_EXE" "$@"

x11 DISPLAY 연결 안된듯.

See also