اذهب إلى المحتوى
  • 0

AttributeError: 'numpy.ndarray' object has no attribute 'split'

Zeina Almakdisi

السؤال

مرحبا...

يظهر الخطأ التالي

  output_image_path = "object-detection-" +image_path.split('.')[0] + ".jpg"
AttributeError: 'numpy.ndarray' object has no attribute 'split'

في الجزء من الكود:

   output_image_path = "object-detection-" +image_path.split('.')[0] + ".jpg"
    cv2.imwrite(output_image_path, image)
    cv2.destroyAllWindows()   

وعند تحويل image_path الى سلسلة نصية str(image_path)

يظهر الخطأ التالي:

cv2.error: OpenCV(4.8.0): -1 :   error: (-5:Bad argument) in function 'imwrite'
> Overload resolution failed:
>  - img is not a numpy array, neither a scalar

>  - Expected Ptr<cv::UMat> for argument 'img'

جربت العديد من الحلول ولم ينجح :( 

تم التعديل في بواسطة Zeina Almakdisi
رابط هذا التعليق
شارك على الشبكات الإجتماعية

Recommended Posts

  • 0

أنتِ تستخدمين مصفوفة NumPy لـ image_path، ومصفوفات NumPy ليس لديها خاصية split().

لذلك، عليك تحويل image_path إلى سلسلة نصية قبل استخدامها في str.split() كالتالي:

image_path = str(image_path)
output_image_path = "object-detection-" + image_path.split('.')[0] + ".jpg"

من أجل تحويل image_path إلى سلسلة نصية، ثم سيستخدمها str.split() لإنشاء سلسلة جديدة تتكون من اسم الملف بدون الامتداد.

وسبب ظهور الخطأ الثاني هو أنّك تحاولين استخدام cv2.imwrite() لكتابة مصفوفة NumPy كصورة، في الوقت الذي تتوقع فيه cv2.imwrite() إشارة OpenCV UMat كصورة، عليك إجراء التعديل التالي:

image = cv2.imread(image_path)
cv2.imwrite(output_image_path, image)

حتى يتم قراءة الصورة من image_path إلى إشارة OpenCV UMat ثم سيستخدم cv2.imwrite() تلك الإشارة لكتابة الصورة إلى ملف.

رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 0
بتاريخ 11 ساعة قال Mustafa Suleiman:

أنتِ تستخدمين مصفوفة NumPy لـ image_path، ومصفوفات NumPy ليس لديها خاصية split().

لذلك، عليك تحويل image_path إلى سلسلة نصية قبل استخدامها في str.split() كالتالي:

image_path = str(image_path)
output_image_path = "object-detection-" + image_path.split('.')[0] + ".jpg"

من أجل تحويل image_path إلى سلسلة نصية، ثم سيستخدمها str.split() لإنشاء سلسلة جديدة تتكون من اسم الملف بدون الامتداد.

وسبب ظهور الخطأ الثاني هو أنّك تحاولين استخدام cv2.imwrite() لكتابة مصفوفة NumPy كصورة، في الوقت الذي تتوقع فيه cv2.imwrite() إشارة OpenCV UMat كصورة، عليك إجراء التعديل التالي:

image = cv2.imread(image_path)
cv2.imwrite(output_image_path, image)

حتى يتم قراءة الصورة من image_path إلى إشارة OpenCV UMat ثم سيستخدم cv2.imwrite() تلك الإشارة لكتابة الصورة إلى ملف.

شكرا لك 

بعد تطبيق التعديلات ظهر الخطأ التالي

    cv2.imwrite(output_image_path, image)
cv2.error: OpenCV(4.8.0) D:\a\opencv-python\opencv-python\opencv\modules\imgcodecs\src\loadsave.cpp:787: error: (-215:Assertion failed) !_img.empty() in function 'cv::imwrite'

 

علما أنه عند طباعة 

    print(image_path)     يظهر الخرج على شكل مصفوفات 

    image = cv2.imread(image_path)

    print(image)   يظهر الخرج none فقط

    cv2.imwrite(output_image_path, image)

رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 0
بتاريخ 15 ساعة قال Zeina Almakdisi:

جربت العديد من الحلول ولم ينجح :( 

انت تقومين باستخدام مكتبة numpy array في image_path لذلك يجب عليكِ أن تتأكدي من القيمة التي تم تعينيها في image_path يجب أن لا تكون array numpy حتى لو استطعنا تحويلها ب str، يعتبر حل صحيح ولكن هذا خاطئ منطقيا لأنه سوف يأثر على جودة الكود الخاص بك وسوف تظهر اخطاء في الكود عندما مراجعة الكود الخاص بك، من المتوقع إيضا بالكود الخاص بك أنك تقومي بإسناد الصورة إلى image_path ومسار الصورة إلى image لذلك  يظهر خطأ

img is not a numpy array

اذا كان image بالفعل هو مصفوفة معبرة عن الصورة تستطيعِ تحويلها إلى مصفوفة numpy لكي تناسب تابع imwrite كالتالي

import numpy as np
output_image_path = "path/to/new_image"
cv2.imwrite(output_image_path, np.array(image))
cv2.destroyAllWindows()

طبعا يتم ذلك بعد أن تقومي بالتعديل على المسار الخاص بالصورة

رابط هذا التعليق
شارك على الشبكات الإجتماعية

انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أجب على هذا السؤال...

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

  • إعلانات

  • تابعنا على



×
×
  • أضف...