Skip to main content

How to Resolve OpenCV Error: "(-215:Assertion failed) !_src.empty() in function 'cvtColor'"

The OpenCV error cv2.error: ... error: (-215:Assertion failed) !_src.empty() in function 'cvtColor' is a common runtime exception. It typically indicates that the image you attempted to pass to the cv2.cvtColor() function (for color space conversion) was not loaded correctly and is essentially empty or None.

This guide explains the primary causes and how to fix them.

Understanding the Error: !_src.empty()

The core of the error message (-215:Assertion failed) !_src.empty() in function 'cvtColor' lies in the assertion !_src.empty(). In OpenCV's C++ backend (src often refers to the source image), this checks if the input image (_src) is not empty. The assertion fails (triggering the error) when the source image is empty.

When using the Python cv2 bindings, this usually means the variable holding your image (often loaded via cv2.imread or captured from a video stream) is None. The cv2.cvtColor function can not perform color conversion on a non-existent image.

Common Cause: Image Loading Failure (cv2.imread)

The most frequent reason for this error is that cv2.imread() failed to load the image file. This happens if:

  • The file path provided is incorrect.
  • The file does not exist at the specified path.
  • The file exists but is corrupted or empty.
  • The file format is not supported or readable by OpenCV's backend.
import cv2

# Example: Path points to a non-existent file
img_path = 'non_existent_image.jpg'

img = cv2.imread(img_path)

# imread returns None if loading fails
print(img) # Output: None

try:
# ⛔️ cv2.error: OpenCV(...) error: (-215:Assertion failed) !_src.empty() in function 'cvtColor'
# Passing None to cvtColor causes the error
img_hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
print(img_hsv)
except cv2.error as e:
print(f"OpenCV Error: {e}")

Solution: Verify Image Path and Loading

Before calling cv2.cvtColor, you must ensure the image has been loaded successfully.

Checking if the File Path Exists

Use Python's os module to check if the file path is valid before attempting to read it.

import cv2
import os

img_path = 'path/to/your/image.png' # Use the correct path to your image

if os.path.exists(img_path):
print(f"Path exists: {img_path}")
img = cv2.imread(img_path)
# Proceed only if path exists... (further checks needed, see 3.2)
else:
print(f"Path does NOT exist: {img_path}")
img = None # Ensure img is None if path doesn't exist

# ... rest of your code needs to handle img potentially being None ...

Checking if the Image Loaded Successfully

Even if the path exists, cv2.imread() might still return None (e.g., due to file corruption or permissions). Always check if the returned object is None after calling cv2.imread() and before passing it to other OpenCV functions like cv2.cvtColor.

import cv2
import os

# Use the correct path to your image, or an invalid one to test the 'else' block
img_path = 'path/to/your/image.png'
# img_path = 'invalid_path.jpg'

img = cv2.imread(img_path)

# ✅ Crucial Check: Ensure img is not None before using it
if img is not None:
print("Image loaded successfully.")
try:
# Now it's safe to call cvtColor
img_hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
print("Color conversion successful.")
# print(img_hsv) # You can now use img_hsv
except cv2.error as e:
print(f"OpenCV Error during conversion: {e}")
else:
print(f"Failed to load image from path: {img_path}")
# Handle the error gracefully - perhaps log it or exit

Troubleshooting Other Scenarios

If verifying the path and image loading doesn't resolve the issue, consider these other possibilities:

Webcam Issues

If you are reading frames from a webcam (cv2.VideoCapture):

  • Camera In Use: Ensure the webcam isn't actively used by another application (Zoom, Skype, etc.). Close other programs using the camera.
  • Drivers: Check if your webcam drivers are up-to-date.
  • Connection: Verify the physical camera connection is stable.

File Path Formatting and Location

  • Raw Strings (Windows): On Windows, backslashes (\) in paths can be misinterpreted as escape characters. Use raw strings (r'...') or forward slashes (/).
    # ✅ Good practice on Windows
    img_path_raw = r'C:\Users\YourUser\Desktop\image.png'
    img_path_forward = 'C:/Users/YourUser/Desktop/image.png'
  • Special Characters: Avoid special characters, spaces, or non-standard symbols (like umlauts) in file paths or names if possible, as they can sometimes cause issues.
  • Working Directory: If you only provide the filename (e.g., 'image.png'), ensure your Python script is running from the same directory where the image file is located. Otherwise, provide the full or relative path.
  • Extension: Double-check that the file extension (e.g., .jpg, .png, .webp) is included in the path and is correct.

cv2.VideoCapture Index

When initializing webcam capture with cv2.VideoCapture(index), the correct index can vary:

  • Windows: Often 0 for the default built-in camera.
    # Windows Example
    cap = cv2.VideoCapture(0)
  • Linux: Often 0, but sometimes -1 or other indices might be necessary depending on the system configuration.
    # Linux Example (try 0 first, then -1 if needed)
    cap = cv2.VideoCapture(0)
    # cap = cv2.VideoCapture(-1)
    Always check if cap.isOpened() returns True after initialization.

File Permissions

Ensure your script has the necessary read permissions for the image file and the directory it resides in. Operating system restrictions or specific file ACLs could prevent access. Similarly, ensure your application has permission to access the camera if using a webcam.

Alternative: Using skimage.io.imread

Occasionally, OpenCV's imread might struggle with certain image formats or variations where other libraries succeed. You can try using scikit-image to load the image and then pass the resulting NumPy array to OpenCV functions.

First, install scikit-image:

pip install scikit-image
# Or if using pip3
pip3 install scikit-image

Then, use it in your code:

import cv2
from skimage import io
import numpy as np # Usually needed with skimage

img_path = 'path/to/your/image.png' # Use the correct path

try:
# Load image using scikit-image
img_sk = io.imread(img_path)

# ✅ Check if loading succeeded (skimage might raise an error on failure)
print("Image loaded successfully with scikit-image.")

# OpenCV often expects BGR, skimage loads as RGB (usually). Convert if needed.
# Check img_sk.shape, if it has 3 channels, it's likely RGB.
if len(img_sk.shape) == 3 and img_sk.shape[2] == 3:
img_bgr = cv2.cvtColor(img_sk, cv2.COLOR_RGB2BGR)
elif len(img_sk.shape) == 3 and img_sk.shape[2] == 4: # Handle RGBA if necessary
img_bgr = cv2.cvtColor(img_sk, cv2.COLOR_RGBA2BGR)
else:
img_bgr = img_sk # Grayscale or other format

# Now use the image (img_bgr) with OpenCV functions
img_hsv = cv2.cvtColor(img_bgr, cv2.COLOR_BGR2HSV)
print("OpenCV color conversion successful.")
# print(img_hsv)

except FileNotFoundError:
print(f"scikit-image Error: File not found at {img_path}")
except Exception as e:
print(f"An error occurred: {e}") # Catch other potential errors from skimage or cv2

Conclusion

The OpenCV (-215:Assertion failed) !_src.empty() error in cvtColor almost always points to an empty or None image being used as input.

  • The primary solution is to rigorously check your image loading process: verify the file path (os.path.exists), ensure cv2.imread() does not return None, and handle potential None values gracefully before calling cv2.cvtColor.
  • Consider other factors like webcam issues, path formatting, permissions, and alternative loading libraries like scikit-image if the basic checks don't resolve the problem.