mở cv lỗi: (-215) scn == 3 || scn == 4 trong hàm cvtColor


89

Tôi hiện đang sử dụng Ubuntu 14.04, sử dụng python 2.7 và cv2.

Khi tôi chạy mã này:

import numpy as np
import cv2

img = cv2.imread('2015-05-27-191152.jpg',0)
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

nó trở lại:

 File "face_detection.py", line 11, in <module>
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
cv2.error: /home/arthurckl/Desktop/opencv-3.0.0-rc1/modules/imgproc/src/color.cpp:7564: error: (-215) scn == 3 || scn == 4 in function cvtColor

Tôi đã tìm kiếm ở đây và một câu trả lời nói rằng tôi có thể tải ảnh của mình sai cách, vì ảnh phải có 3 kích thước: hàng, cột và chiều sâu.

Khi tôi in img.shape, nó chỉ trả về hai số, vì vậy tôi phải làm sai. Nhưng tôi không biết cách phù hợp để tải ảnh của mình.


11
img = cv2.imread('2015-05-27-191152.jpg',0)tham số 0 đã tải hình ảnh của bạn dưới dạng hình ảnh thang độ xám 1 kênh. Vì vậy, hãy thử img = cv2.imread('2015-05-27-191152.jpg')hoặc gray = cv2.imread('2015-05-27-191152.jpg',0)xem các cờ khác nhau trên: docs.opencv.org/modules/highgui/doc/…
Micka

Tôi cũng gặp sự cố này, nhưng hóa ra là có khoảng trắng ( .../eclipse\ footage/...) trong đường dẫn của tôi. Vì vậy, thêm một ...,0)không sửa chữa nó.
Cody

Câu trả lời:


102

Cung cấp đường dẫn đầy đủ của hình ảnh với dấu gạch chéo. Nó đã giải quyết được lỗi cho tôi.

Ví dụ

import numpy as np
import cv2

img = cv2.imread('C:/Python34/images/2015-05-27-191152.jpg')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

Ngoài ra, nếu bạn cung cấp 0tham số thứ hai trong khi tải hình ảnh bằng cách sử dụng cv2.imreadmà không cần phải chuyển đổi hình ảnh bằng cách sử dụng cvtColor, nó đã được tải dưới dạng hình ảnh thang độ xám, ví dụ.

import numpy as np
import cv2

gray = cv2.imread('C:/Python34/images/2015-05-27-191152.jpg',0)

6
Trong trường hợp bạn đang lấy hình ảnh từ máy ảnh: bạn gặp lỗi này nếu máy ảnh không truy cập được.
ger.s.brett

... hoặc nếu bạn cung cấp sai đường dẫn đến tệp video của mình; P Tôi đã gặp sự cố này và tôi đã làm sai đường dẫn cửa sổ chết tiệt (viết c: / thay vì C: //)
fanny

17

Vui lòng đặt như bên dưới

img = cv2.imread('2015-05-27-191152.jpg',1)     // Change Flag As 1 For Color Image
                                                //or O for Gray Image So It image is 
                                                //already gray

6
img = cv2.imread('2015-05-27-191152.jpg',0)

Dòng mã trên đọc hình ảnh của bạn ở mô hình màu thang độ xám, vì số 0 được nối ở cuối. Và nếu bạn lại cố gắng chuyển đổi một hình ảnh đã có màu xám sang hình ảnh màu xám, nó sẽ hiển thị lỗi đó.

Vì vậy, hãy sử dụng kiểu trên hoặc thử mã được đề cập dưới đây:

img = cv2.imread('2015-05-27-191152.jpg')
gray_img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)


4

Điều đầu tiên bạn nên kiểm tra là hình ảnh có tồn tại trong thư mục gốc hay không. Điều này chủ yếu là do hình ảnh có chiều cao = 0. Có nghĩa cv2.imread(imageName)là không đọc hình ảnh.


Câu trả lời này giải quyết được vấn đề của tôi - Tôi đọc video, video không tự động dừng khi video kết thúc, vì vậy tôi gặp lỗi tương tự khi cố gắng cv2.cvtColorcho khung trống.
Mikhail_Sam

2

Tôi đã có thông báo lỗi này hiển thị, vì những lý do hoàn toàn không liên quan đến cờ 0 hoặc 1 được đề cập trong các câu trả lời khác. Bạn cũng có thể nhìn thấy nó vì cv2.imreadsẽ không xảy ra lỗi nếu chuỗi đường dẫn bạn chuyển nó không phải là hình ảnh:

In [1]: import cv2
   ...: img = cv2.imread('asdfasdf')  # This is clearly not an image file
   ...: gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
   ...:

OpenCV Error: Assertion failed (scn == 3 || scn == 4) in cv::cvtColor, file C:\projects\opencv-python\opencv\modules\imgproc\src\color.cpp, line 10638
---------------------------------------------------------------------------
error                                     Traceback (most recent call last)
<ipython-input-4-19408d38116b> in <module>()
      1 import cv2
      2 img = cv2.imread('asdfasdf')  # This is clearly not an image file
----> 3 gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

error: C:\projects\opencv-python\opencv\modules\imgproc\src\color.cpp:10638: error: (-215) scn == 3 || scn == 4 in function cv::cvtColor

Vì vậy, bạn đang nhìn thấy một cvtColorthất bại trong khi thực tế đó là một imreadlỗi im lặng . Hãy ghi nhớ điều đó vào lần tới khi bạn lãng phí một giờ trong đời với phép ẩn dụ khó hiểu đó .

Giải pháp

Bạn có thể cần kiểm tra xem chuỗi đường dẫn của mình có đại diện cho một tệp hợp lệ hay không trước khi chuyển nó đến cv2.imread:

import os


def read_img(path):
    """Given a path to an image file, returns a cv2 array

    str -> np.ndarray"""
    if os.path.isfile(path):
        return cv2.imread(path)
    else:
        raise ValueError('Path provided is not a valid file: {}'.format(path))


path = '2015-05-27-191152.jpg'
img = read_img(path)
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

Viết theo cách này, mã của bạn sẽ không thành công.


1

Câu trả lời này nếu những người gặp phải vấn đề tương tự đang cố gắng truy cập vào máy ảnh.

import numpy as np
import cv2

cap = cv2.VideoCapture(0)

while(True):
    # Capture frame-by-frame
    ret, frame = cap.read()

    # Our operations on the frame come here
    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
    # Display the resulting frame
    cv2.imshow('frame',gray)
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

# When everything done, release the capture
cap.release()
cv2.destroyAllWindows()

Sử dụng Linux:

Nếu bạn đang cố gắng truy cập máy ảnh từ máy tính của mình, rất có thể có vấn đề về quyền, hãy thử chạy tập lệnh python với sudo, nó sẽ khắc phục được sự cố.

sudo python python_script.py

Để kiểm tra xem máy ảnh có thể truy cập được hay không, hãy chạy lệnh sau.

ffmpeg -f v4l2 -framerate 25 -video_size 640x480 -i /dev/video0 output.mkv 

1
cv2.error: /home/arthurckl/Desktop/opencv-3.0.0-rc1/modules/imgproc/src/color.cpp:7564: error: (-215) scn == 3 || scn == 4 in function cvtColor

Lỗi trên là kết quả của tên hình ảnh không hợp lệ hoặc nếu tệp không tồn tại trong thư mục cục bộ.

img = cv2.imread('2015-05-27-191152.jpg',0)
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

Ngoài ra, nếu bạn đang sử dụng đối số thứ 2 của cv2.imread () là '0', thì nó đã được chuyển đổi thành hình ảnh thang độ xám.

Sự khác biệt giữa việc chuyển đổi hình ảnh bằng cách chuyển 0 làm tham số và áp dụng như sau:

img = cv2.cvtCOLOR(img, cv2.COLOR_BGR2GRAY) 

có nghĩa là, trong trường hợp img = cv2.cvtCOLOR(img, cv2.COLOR_BGR2GRAY), hình ảnh là hình ảnh loại 8uC1 và 32sC1.


1

Mã này dành cho những người đang gặp sự cố tương tự khi cố gắng truy cập vào máy ảnh có thể được viết với một kiểm tra an toàn.

if ret is True:
   gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
else:
   continue

HOẶC trong trường hợp bạn muốn đóng máy ảnh / ngừng nếu có vấn đề gì đó với chính khung hình

if ret is True:
   gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
else:
   break

Để tham khảo https://github.com/HackerShackOfficial/AI-Smart-Mirror/issues/36


0

Đây là những gì tôi quan sát được khi tôi sử dụng bộ hình ảnh của riêng mình ở .jpgđịnh dạng. Trong tập lệnh mẫu có sẵn trong tài liệu Opencv , hãy lưu ý rằng nó có các dòng undistortcrop the imagenhư sau:

# undistort
dst = cv2.undistort(img, mtx, dist, None, newcameramtx)

# crop the image
x,y,w,h = roi
dst = dst[y:y+h, x:x+w]
cv2.imwrite('calibresult.jpg',dst)

Vì vậy, khi chúng tôi chạy mã lần đầu tiên, nó sẽ thực hiện dòng cv2.imwrite('calibresult.jpg',dst)lưu hình ảnh calibresult.jpgtrong thư mục hiện tại. Vì vậy, khi tôi chạy mã vào lần tiếp theo, cùng với bộ ảnh mẫu mà tôi đã sử dụng để hiệu chỉnh máy ảnh ở định dạng jpg, mã cũng cố gắng xem xét hình ảnh mới được thêm này calibresult.jpgdo lỗi xuất hiện.

error: C:\builds\master_PackSlaveAddon-win64-vc12-static\opencv\modules\imgproc\src\color.cpp:7456: error: (-215) scn == 3 || scn == 4 in function cv::ipp_cvtColor

Những gì tôi đã làm là: Tôi chỉ đơn giản là xóa hình ảnh mới tạo đó sau mỗi lần chạy hoặc thay đổi loại hình ảnh để nói pnghoặc tiffnhập. Điều đó đã giải quyết vấn đề. Kiểm tra xem bạn có đang nhập và viết calibresultcùng một kiểu hay không. Nếu vậy, chỉ cần thay đổi loại.


0

Trên OS XI nhận ra rằng trong khi cv2.imread có thể xử lý "filename.jpg" thì nó không thể xử lý "file.name.jpg". Là một người mới làm quen với python, tôi vẫn chưa thể đề xuất giải pháp, nhưng như François Leblanc đã viết, đó là một lỗi im lặng khi đọc.

Vì vậy, nó có vấn đề với một dấu chấm bổ sung trong tên tệp và các dấu hiệu dễ thấy khác, cũng như với "" (Dấu cách) hoặc "%", v.v.


0

Tôi cũng phát hiện ra nếu webcam của bạn không đóng đúng hoặc có thứ gì đó đang sử dụng nó, thì CV2 sẽ báo lỗi tương tự. Tôi đã phải khởi động lại máy tính của mình để nó hoạt động trở lại.


0

Giải pháp đơn giản nhất để loại bỏ lỗi đó là chạy lệnh

cap.release()
cv2.closeAllWindows()

Điều đó phù hợp với tôi và đôi khi cần khởi động lại hạt nhân do các tiến trình cũ đang chạy trong nền.

Nếu hình ảnh không có trong thư mục làm việc thì nó cũng sẽ không hoạt động, hãy thử đặt tệp hình ảnh trong pwd trong cùng một thư mục vì có mã khác, hãy cung cấp đường dẫn đầy đủ đến tệp hình ảnh hoặc thư mục.

Để tránh sự cố này trong tương lai, hãy thử viết mã với cách xử lý đặc biệt để nếu việc kết thúc không chính xác xảy ra vì một lý do ngẫu nhiên nào đó, thiết bị chụp sẽ được giải phóng sau khi chương trình kết thúc.


0

2015-05-27-191152.jpg << Nhìn lại định dạng hình ảnh của bạn, tôi thỉnh thoảng nhầm lẫn giữa .png và .jpg và gặp phải lỗi tương tự.


0

Tôi nghĩ rằng nó bởi vì cv2.imreadkhông thể đọc .jpghình ảnh, bạn cần phải thay đổi .jpgthành .png.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.