तो मैं एक स्थिर पृष्ठभूमि के साथ 2 छवियों की तुलना करने के लिए ओपनसीवी का उपयोग करके एक ट्यूटोरियल का पालन करने की कोशिश कर रहा हूं लेकिन मैं 2 मार्करों को थोड़ा सा स्थानांतरित करता हूं। कोड को मार्कर के परिवर्तनों को पहचानना चाहिए, लेकिन यह किसी कारण से ऐसा नहीं कर रहा है। यह इस त्रुटि को वापस करना जारी रखता है। मैं यह जानने की कोशिश कर रहा हूं कि परिवर्तनों को पहचानने के इस लक्ष्य को पूरा करने के लिए एब्सडिफ फ़ंक्शन का उपयोग कैसे करें, लेकिन मैंने इसे त्रुटि को ठीक करने के प्रयास में टिप्पणी की, जो असफल रही।

ट्यूटोरियल: https://www.authentise.com/ पोस्ट/कैसे-टू-ट्रैक-ऑब्जेक्ट्स-साथ-स्थिर-पृष्ठभूमि

File "/Users/Starpool13/Desktop/OpenCV/compare.py", line 26, in <module>
    cv2.drawContours(image_sub, contours, -1, (100, 0, 255),2)
cv2.error: OpenCV(4.5.1) /private/var/folders/nz/vv4_9tw56nv9k3tkvyszvwg80000gn/T/pip-req-build-yaf6rry6/opencv/modules/imgproc/src/drawing.cpp:2501: error: (-215:Assertion failed) npoints > 0 in function 'drawContours'

नीचे मेरा पूरा कोड है

import cv2
import numpy

image1 = cv2.imread('Photos/Before.png')
image2 = cv2.imread('Photos/After.png')
'''
destination_image = cv2.absdiff(image1, image2)
'''
def preprocess_image(image):
    bilateral_filtered_image = cv2.bilateralFilter(image, 7, 150, 150)
    gray_image = cv2.cvtColor(bilateral_filtered_image, cv2.COLOR_BGR2GRAY)
    return gray_image

preprocessed_image1 = preprocess_image(image1)
preprocessed_image2 = preprocess_image(image2)

image_sub = cv2.absdiff(preprocessed_image1, preprocessed_image2)

kernel = numpy.ones((5,5),numpy.uint8)
close_operated_image = cv2.morphologyEx(image_sub, cv2.MORPH_CLOSE, kernel)
_, thresholded = cv2.threshold(close_operated_image, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)

median = cv2.medianBlur(thresholded, 5)

_, contours = cv2.findContours(image_sub, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
cv2.drawContours(image_sub, contours, -1, (100, 0, 255),2)

_, _, angle = cv2.fitEllipse(contour)

कृपया मुझे इस त्रुटि के किसी भी संभावित समाधान के बारे में बताएं, अग्रिम धन्यवाद!

-1
Zachary Weinbrum 22 मार्च 2021, 17:39
क्या आप लेन (समोच्च) को प्रिंट करने का प्रयास कर सकते हैं और सुनिश्चित कर सकते हैं कि यह शून्य से अधिक है? यह भी जांचें कि cv2.imshow () का उपयोग करके image_sub सही दिखता है
 – 
Ian Chu
22 मार्च 2021, 17:46
एक सशर्त if(len(contours)>=5): cv2.fitEllipse(contour) का उपयोग करने का प्रयास करें और उस लूप के अंदर 3 डालें for contour in contours:
 – 
Samantha Cruz
23 मार्च 2021, 15:24

1 उत्तर

सबसे बढ़िया उत्तर

मैं देख रहा हूँ कि आपका opencv संस्करण 4.5.1 है। ऐसा लगता है कि आप opencv के पुराने संस्करण के लिए एक ट्यूटोरियल का अनुसरण कर रहे हैं जहां यह बताता है,

_, contours, _ = cv2.findContours(median, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)

findContours के दस्तावेज़ीकरण के आधार पर यह पहला वैरिएबल होना चाहिए जिसमें समोच्च हो। आपके मामले में यह अंदर आ रहा है, _ जैसा कि आप कर रहे हैं,

_, contours = cv2.findContours(image_sub, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)

इसके बजाय इसे आजमाएं,

contours, _ = cv2.findContours(image_sub, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)

ओपनसीवी 4.5.1 के लिए दस्तावेज़ीकरण,

https://docs.opencv.org/4.5.1/d4/d73/tutorial_py_contours_begin.html

एक अन्य विकल्प है ट्यूटोरियल के साथ पुराने ओपनसीवी संस्करण का उपयोग करके देखें। आपके द्वारा प्रदान किया गया लिंक। यहां आप _, contours, _ का उपयोग कर पाएंगे।

1
B200011011 22 मार्च 2021, 18:05
बहुत अच्छा काम किया, अपने सभी सीवी चर में 2 जोड़ना पड़ा क्योंकि मैंने सीवी के रूप में आयात नहीं किया था, लेकिन अन्यथा बहुत उपयोगी था। लेकिन, मैं ओपनसीवी में उतना अच्छा नहीं हूं, और अब मुझे एक त्रुटि मिल रही है File "/Users/Starpool13/Desktop/OpenCV/compare.py", line 28, in <module> _, _, angle = cv2.fitEllipse(contour) NameError: name 'contour' is not defined Zachs-MacBook:OpenCV Starpool13$ संपादित करें: मुझे लगता है कि यह एक साधारण फिक्स है, लेकिन मैं इसे किसी भी तरह से देख रहा हूं।
 – 
Zachary Weinbrum
22 मार्च 2021, 18:13
आपका चर नाम contours होना चाहिए जैसा कि पहले परिभाषित किया गया है।
 – 
B200011011
22 मार्च 2021, 21:03