【Python】cv2.error: OpenCV(4.8.0) :-1: error: 'cvtColor' 함수의 (-5:잘못된 인수) > Overload res

코드 조각은 다음과 같습니다.

# 将图片转换为灰度图
image1 = cv2.cvtColor(origin_iamge, cv2.COLOR_BGR2GRAY)
image2 = cv2.cvtColor(sp_image, cv2.COLOR_BGR2GRAY)
image3 = cv2.cvtColor(sp1_image, cv2.COLOR_BGR2GRAY)

mse_1 = mse(image1, image2)
mse_2 = mse(image1, image3)

ssim_1 = ssim(image1, image2)
ssim_2 = ssim(image1, image3)

내 코드에 오류가 있습니다:

(PyTorch) D:\CodeProject>D:/Anaconda/envs/PyTorch/python.exe d:/CodeProject/2023_SZ_Cup/Problem_1/evaluate.py
Traceback (most recent call last):
  File "d:\CodeProject\2023_SZ_Cup\Problem_1\evaluate.py", line 20, in <module>
    image1 = cv2.cvtColor(origin_iamge, cv2.COLOR_BGR2GRAY)
cv2.error: OpenCV(4.8.0) :-1: error: (-5:Bad argument) in function 'cvtColor'
> Overload resolution failed:
>  - src is not a numpy array, neither a scalar
>  - Expected Ptr<cv::UMat> for argument 'src'

여기에 이미지 설명을 삽입하세요

이미지가 원래 경로에서 로드되어 회색조로 변환될 때 cv2.cvtColor에 전달된 매개 변수가 올바르지 않기 때문에 'cvtColor' 함수에서 cv2.error: (-5:Bad 인수)라는 오류 메시지가 표시됩니다.

코드를 수정하세요:

image1 = cv2.imread(origin_image_path, cv2.IMREAD_GRAYSCALE)
image2 = cv2.imread(sp_image_path, cv2.IMREAD_GRAYSCALE)
image3 = cv2.imread(sp1_image_path, cv2.IMREAD_GRAYSCALE)

주요 변경 사항은 다음과 같습니다.

  1. 이미지 경로를 매개변수로 cv2.imread 함수에 전달하여 이미지를 올바르게 로드합니다.
  2. 이미지가 회색조 이미지로 읽히도록 하려면 cv2.IMREAD_GRAYSCALE 플래그를 사용하십시오.

그러나 코드는 여전히 오류를 보고합니다.

(PyTorch) D:\CodeProject>D:/Anaconda/envs/PyTorch/python.exe d:/CodeProject/2023_SZ_Cup/Problem_1/evaluate.py
[ WARN:0@0.328] global loadsave.cpp:248 cv::findDecoder imread_('./2023_SZ_Cup/datasets/B棰?Traceback (most recent call last):
  File "d:\CodeProject\2023_SZ_Cup\Problem_1\evaluate.py", line 21, in <module>
    mse_1 = mse(image1, image2)
  File "d:\CodeProject\2023_SZ_Cup\Problem_1\evaluate.py", line 7, in mse
    err = np.sum((imageA.astype("float") - imageB.astype("float")) ** 2)
AttributeError: 'NoneType' object has no attribute 'astype'

여기에 이미지 설명을 삽입하세요

이 오류 메시지는 이미지를 읽을 때 문제가 있음을 나타내며, 이미지가 올바르게 로드되지 않아 후속 이미지 처리 시 오류가 발생할 수 있음을 나타냅니다.

이미지를 읽은 후 오류 검사를 추가하여 이미지가 성공적으로 로드되었는지 확인할 수 있습니다. 더 나은 디버깅을 위해 오류 검사 및 인쇄가 추가된 수정된 코드는 다음과 같습니다.

    # 读取图片并转换为灰度图
    image1 = cv2.imread(origin_image_path, cv2.IMREAD_GRAYSCALE)
    image2 = cv2.imread(sp_image_path, cv2.IMREAD_GRAYSCALE)
    image3 = cv2.imread(sp1_image_path, cv2.IMREAD_GRAYSCALE)

    if image1 is None or image2 is None or image3 is None:
        print("无法加载图像")
    else:
        mse_1 = mse(image1, image2)
        mse_2 = mse(image1, image3)

        ssim_1 = ssim(image1, image2)
        ssim_2 = ssim(image1, image3)

        print("-----调包-----")
        print('MSE:', mse_1)
        print('ssim:', ssim_1)

        print("-----算法-----")
        print('MSE:', mse_2)
        print('ssim:', ssim_2)

코드는 결국 문제를 지적하게 됩니다.

[ WARN:0@0.312] global loadsave.cpp:248 cv::findDecoder imread_('./2023_SZ_Cup/datasets/B棰?无法加载图像

이름만 바꾸세요! 더 이상 오류가 없습니다.

추천

출처blog.csdn.net/wzk4869/article/details/132584614