- 1. பிரித்தல் மற்றும் வரையறைகள்
- 2. வரிசைமுறை மற்றும் மீட்டெடுப்பு முறை
- 3. வரையறைகளை தோராயமாக்குதல் மற்றும் அவற்றின் குவிந்த ஹல் ஆகியவற்றைக் கண்டறிதல்
- 4. குவிந்த ஓல்
- 5. வடிவங்களால் பொருந்தக்கூடிய விளிம்பு
- 6. வடிவங்களை அடையாளம் காணுதல் (வட்டம், செவ்வகம், முக்கோணம், சதுரம், நட்சத்திரம்)
- 7. வரி கண்டறிதல்
- 8. குமிழ் கண்டறிதல்
- 9. வலைகளை வடிகட்டுதல் - வட்டங்கள் மற்றும் நீள்வட்டங்களை எண்ணுதல்
முந்தைய டுடோரியல்களில், அடிப்படை பட செயலாக்கத்திற்காக ஓபன்சிவியைப் பயன்படுத்தினோம் மற்றும் சில முன்கூட்டியே பட எடிட்டிங் செயல்பாடுகளைச் செய்துள்ளோம். நமக்குத் தெரிந்தபடி, ஓபன்சிவி என்பது ஓபன் சோர்ஸ் கம்யூட்டர் விஷன் நூலகமாகும், இது சி ++, பைதான் மற்றும் ஜாவா இடைமுகங்களைக் கொண்டுள்ளது மற்றும் விண்டோஸ், லினக்ஸ், மேக் ஓஎஸ், iOS மற்றும் ஆண்ட்ராய்டை ஆதரிக்கிறது. எனவே பைதான் மற்றும் லினக்ஸ் சூழலுடன் ராஸ்பெர்ரி பையில் இதை எளிதாக நிறுவ முடியும். முகம் கண்டறிதல், முகம் பூட்டு, பொருள் கண்காணிப்பு, கார் எண் தட்டு கண்டறிதல், வீட்டு பாதுகாப்பு அமைப்பு போன்ற பல நிகழ்நேர பட செயலாக்க பயன்பாடுகளை உருவாக்க ஓபன்சிவி மற்றும் இணைக்கப்பட்ட கேமரா கொண்ட ராஸ்பெர்ரி பை பயன்படுத்தப்படலாம். இந்த டுடோரியலில் எப்படி செய்வது என்று கற்றுக்கொள்வோம் OpenCV ஐப் பயன்படுத்தி படப் பிரிவு. நாங்கள் செய்யவிருக்கும் செயல்பாடுகள் கீழே பட்டியலிடப்பட்டுள்ளன:
- பிரித்தல் மற்றும் வரையறைகள்
- வரிசைமுறை மற்றும் மீட்டெடுப்பு முறை
- வரையறைகளை தோராயமாக மதிப்பிடுவது மற்றும் அவற்றின் குவிந்த ஹல் ஆகியவற்றைக் கண்டறிதல்
- கோனெக்ஸ் ஹல்
- பொருந்தும் விளிம்பு
- வடிவங்களை அடையாளம் காணுதல் (வட்டம், செவ்வகம், முக்கோணம், சதுரம், நட்சத்திரம்)
- வரி கண்டறிதல்
- குமிழ் கண்டறிதல்
- வலைகளை வடிகட்டுதல் - வட்டங்கள் மற்றும் நீள்வட்டங்களை எண்ணுதல்
1. பிரித்தல் மற்றும் வரையறைகள்
படப் பிரிவு என்பது ஒரு செயல்முறையாகும், இதன் மூலம் படங்களை வெவ்வேறு பகுதிகளாகப் பிரிக்கிறோம். அதே சமயம் வரையறைகள் ஒரு படத்தில் ஒரு பொருளின் முழு எல்லையையும் பிணைக்கும் அல்லது மறைக்கும் தொடர்ச்சியான கோடுகள் அல்லது வளைவுகள். மேலும், இங்கே ஒரு படத்தின் பகுதிகளைப் பிரித்தெடுக்க வரையறைகள் எனப்படும் படப் பிரிவு நுட்பத்தைப் பயன்படுத்துவோம்.
வரையறைகளும் மிகவும் முக்கியம்
- பொருள் கண்டறிதல்
- வடிவ பகுப்பாய்வு
நிஜ உலக பட பகுப்பாய்வு முதல் எம்.ஆர்.ஐ போன்ற மருத்துவ பட பகுப்பாய்வு வரை அவை மிகவும் பரந்த பயன்பாட்டுத் துறையைக் கொண்டுள்ளன
சதுரங்களின் வரையறைகளை பிரித்தெடுப்பதன் மூலம், ஓபன்சிவியில் வரையறைகளை எவ்வாறு செயல்படுத்தலாம் என்பதை அறிவோம்.
cv2 import numpy ஐ np ஆக இறக்குமதி செய்க
3 கருப்பு சதுரங்களுடன் ஒரு எளிய படத்தை ஏற்றுவோம்
image = cv2.imread ('squares.jpg') cv2.imshow ('உள்ளீட்டு படம்', படம்) cv2.waitKey (0)
கிரேஸ்கேல்
சாம்பல் = cv2.cvtColor (படம், cv2.COLOR_BGR2GRAY)
கேனி விளிம்புகளைக் கண்டறியவும்
edged = cv2.Canny (சாம்பல், 30,200) cv2.imshow ('கேனி விளிம்புகள்', முனைகள்) cv2.waitKey (0)
வரையறைகளை கண்டறிதல்
# உங்கள் படத்தின் நகலைப் பயன்படுத்தவும், எ.கா. - edged.copy (), வரையறைகளை கண்டுபிடிப்பதால் படத்தை மாற்றுவதால் # நாம் சேர்க்க வேண்டும் _, ஓபன்சிவி பதிப்பு _, வரையறைகள், வரிசைமுறை = சி.வி 2 ஆகியவற்றை மேம்படுத்துவதன் காரணமாக வரையறைகளை ஒரு வெற்று வாதமாக முன். .findContours (முனைகள், cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE) cv2.imshow ('வரையறைக்குப் பின் கன்னி விளிம்புகள்', முனைகள்) cv2.nightKey (0)
வரையறைகளை உள்ளடக்கியது என்ன என்பதை அறிய விளிம்பு கோப்பை அச்சிடுதல்
அச்சு (வரையறைகளை) அச்சு ('வரையறைகளின் எண்ணிக்கை =' + str (லென் (வரையறைகள்)))
அனைத்து வரையறைகளையும் வரையவும்
#v -1 அனைத்து வரையறைகளையும் வரைய 3 வது அளவுருவாக cv2.drawContours (படம், வரையறைகள், -1, (0,255,0), 3) cv2.imshow ('வரையறைகள்', படம்) cv2.nightKey (0) cv2. destAllWindows ()

கன்சோல் வெளியீடு -],],], …,],],]], dtype = int32), வரிசை (],],
], …,
],],]], dtype = int32), வரிசை (],],], …,],],]], dtype = int32)]
வரையறைகளின் எண்ணிக்கை = 3. எனவே மொத்தம் மூன்று வரையறைகளை நாங்கள் கண்டறிந்துள்ளோம்.
இப்போது, மேலே உள்ள குறியீட்டை உள்ள நாங்கள் பயன்படுத்தி எல்லைக்கோடு கோப்பு அச்சிடப்பட்டன had , எப்படி மேலே கன்சோல் வெளியீடு அச்சிடப்பட்ட போல் இந்த வரையறைகளை தோற்றம், இந்த கோப்பு சொல்கிறது.
மேலே உள்ள கன்சோல் வெளியீட்டில் x, y புள்ளிகளின் ஆயத்தொலைவுகள் போல ஒரு அணி உள்ளது. ஓபன்சிவி பட்டியல்களின் பட்டியலில் வரையறைகளை சேமிக்கிறது. மேலே உள்ள கன்சோல் வெளியீட்டை நாம் பின்வருமாறு காட்டலாம்:
CONTOUR 1 CONTOUR 2 CONTOUR 3
], வரிசை (], வரிசை (],],],],],],],
…,…,…,],],],],],],]], dtype = int32),]], dtype = int32),]], dtype = int32)]
இப்போது, விளிம்பு கோப்பில் நீள செயல்பாட்டைப் பயன்படுத்தும்போது, நீளத்தை 3 க்கு சமமாகப் பெறுகிறோம், அதாவது அந்த கோப்பில் மூன்று பட்டியல்கள் உள்ளன, அதாவது மூன்று வரையறைகள் உள்ளன.
இப்போது, CONTOUR 1 என்பது அந்த வரிசையில் முதல் உறுப்பு என்று கற்பனை செய்து பாருங்கள், அந்த பட்டியலில் அனைத்து ஆயங்களின் பட்டியலும் உள்ளது, மேலும் இந்த ஆயத்தொலைவுகள் பச்சை செவ்வக பெட்டிகளாக நாம் பார்த்த வரையறைகளில் உள்ள புள்ளிகள்.
இந்த ஆயங்களை சேமிக்க வெவ்வேறு முறைகள் உள்ளன, இவை தோராயமான முறைகள் என்று அழைக்கப்படுகின்றன, அடிப்படையில் தோராய முறைகள் இரண்டு வகைகளாகும்
- cv2.CHAIN_APPROX_NONE
- cv2.CHAIN_APPROX_SIMPLE
cv2.CHAIN_APPROX_NONE அனைத்து எல்லை புள்ளிகளையும் சேமிக்கிறது, ஆனால் நமக்கு எல்லா எல்லை புள்ளிகளும் தேவையில்லை, புள்ளி ஒரு நேர் கோட்டை உருவாக்கினால், அந்த வரியில் தொடக்க புள்ளி மற்றும் முடிவு புள்ளி மட்டுமே நமக்கு தேவை.
cv2.CHAIN_APPROX_SIMPLE அதற்கு பதிலாக எல்லை வரையறைகளின் தொடக்க மற்றும் இறுதி புள்ளிகளை மட்டுமே வழங்குகிறது, இதன் விளைவாக விளிம்பு தகவல்களை மிகவும் திறமையாக சேமிக்கிறது.
_, வரையறைகள், வரிசைமுறை = cv2.findContours (முனைகள், cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)
மேலே உள்ள குறியீட்டை இல் cv2.RETR_EXTERNAL போது மீட்பு முறை ஆகும் cv2.CHAIN_APPROX_NONE உள்ளது
தோராயமான முறை.
எனவே வரையறைகளை மற்றும் தோராயமான முறையைப் பற்றி நாங்கள் கற்றுக்கொண்டோம், இப்போது வரிசைமுறை மற்றும் மீட்டெடுப்பு பயன்முறையை ஆராய்வோம்.
2. வரிசைமுறை மற்றும் மீட்டெடுப்பு முறை
மீட்டெடுப்பு பயன்முறை துணை வரையறைகள், அல்லது வெளிப்புற விளிம்பு அல்லது அனைத்து வரையறைகளும் போன்ற வரையறைகளில் வரிசைமுறையை வரையறுக்கிறது.
இப்போது படிநிலை வகைகளில் வரிசைப்படுத்தப்பட்ட நான்கு மீட்டெடுப்பு முறைகள் உள்ளன.
cv2.RETR_LIST - அனைத்து வரையறைகளையும் மீட்டெடுக்கிறது.
cv2.RETR_EXTERNAL - வெளிப்புற அல்லது வெளிப்புற வரையறைகளை மட்டுமே பெறுகிறது.
cv2.RETR_CCOMP - அனைத்தையும் 2-நிலை வரிசைக்கு மீட்டெடுக்கிறது.
cv2.RETR_TREE - அனைத்தையும் முழு வரிசைக்கு மீட்டெடுக்கிறது.
வரிசைமுறை பின்வரும் வடிவத்தில் சேமிக்கப்படுகிறது
இப்போது முதல் இரண்டு மீட்டெடுப்பு முறைகள், cv2.RETR_LIST மற்றும் cv2.RETR_EXTERNAL ஆகியவற்றுக்கு இடையிலான வித்தியாசத்தை விளக்குவோம்.
cv2 import numpy ஐ np ஆக இறக்குமதி செய்க
3 கருப்பு சதுரங்களுடன் எளிய படத்தை ஏற்றலாம்
image = cv2.imread ('square donut.jpg') cv2.imshow ('உள்ளீட்டு படம்', படம்) cv2.waitKey (0)
கிரேஸ்கேல்
சாம்பல் = cv2.cvtColor (படம், cv2.COLOR_BGR2GRAY)
கேனி விளிம்புகளைக் கண்டறியவும்
edged = cv2.Canny (சாம்பல், 30,200) cv2.imshow ('கேனி விளிம்புகள்', முனைகள்) cv2.waitKey (0)
வரையறைகளை கண்டறிதல்
# உங்கள் படத்தின் நகலைப் பயன்படுத்தவும், எ.கா. - edged.copy (), வரையறைகளை கண்டுபிடிப்பதால் படத்தை மாற்றுவதால் # நாம் சேர்க்க வேண்டும் _, திறந்த சி.வி பதிப்பை மேம்படுத்துவதன் காரணமாக வரையறைகளை ஒரு வெற்று வாதமாக முன் _, வரையறைகள், வரிசைமுறை = cv2.findContours (முனைகள், cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE) cv2.imshow ('வரையறைக்குப் பிறகு கேனி விளிம்புகள்', முனைகள்) cv2.nightKey (0)
வரையறைகளை உள்ளடக்கியது என்ன என்பதை அறிய விளிம்பு கோப்பை அச்சிடுதல்.
அச்சு (வரையறைகளை) அச்சு ('வரையறைகளின் எண்ணிக்கை =' + str (லென் (வரையறைகள்)))
அனைத்து வரையறைகளையும் வரையவும்
#v -1 அனைத்து வரையறைகளையும் வரைய 3 வது அளவுருவாக cv2.drawContours (படம், வரையறைகள், -1, (0,255,0), 3) cv2.imshow ('வரையறைகள்', படம்) cv2.nightKey (0) cv2. destAllWindows

cv2 import numpy ஐ np ஆக இறக்குமதி செய்க
3 கருப்பு சதுரங்களுடன் எளிய படத்தை ஏற்றலாம்
image = cv2.imread ('square donut.jpg') cv2.imshow ('உள்ளீட்டு படம்', படம்) cv2.waitKey (0)
கிரேஸ்கேல்
சாம்பல் = cv2.cvtColor (படம், cv2.COLOR_BGR2GRAY)
கேனி விளிம்புகளைக் கண்டறியவும்
edged = cv2.Canny (சாம்பல், 30,200) cv2.imshow ('கேனி விளிம்புகள்', முனைகள்) cv2.waitKey (0)
வரையறைகளை கண்டறிதல்
# உங்கள் படத்தின் நகலைப் பயன்படுத்தவும், எ.கா. - edged.copy (), வரையறைகளை கண்டுபிடிப்பதால் படத்தை மாற்றுவதால் # நாம் சேர்க்க வேண்டும் _, திறந்த சி.வி பதிப்பை மேம்படுத்துவதன் காரணமாக வரையறைகளை ஒரு வெற்று வாதமாக முன் _, வரையறைகள், வரிசைமுறை = cv2.findContours (முனைகள், cv2.RETR_LIST, cv2.CHAIN_APPROX_NONE) cv2.imshow (முனைகள் 'புத்திசாலித்தனமான புது விளிம்புகள் contouring பிறகு') cv2.waitKey (0)
வரையறைகளை உள்ளடக்கியது என்ன என்பதை அறிய விளிம்பு கோப்பை அச்சிடுதல்.
அச்சு (வரையறைகளை) அச்சு ('வரையறைகளின் எண்ணிக்கை =' + str (லென் (வரையறைகள்)))
அனைத்து வரையறைகளையும் வரையவும்
#v -1 அனைத்து வரையறைகளையும் வரைய 3 வது அளவுருவாக cv2.drawContours (படம், வரையறைகள், -1, (0,255,0), 3) cv2.imshow ('வரையறைகள்', படம்) cv2.nightKey (0) cv2. destAllWindows ()

எனவே மேலே உள்ள குறியீடுகளின் ஆர்ப்பாட்டத்தின் மூலம் cv2.RETR_LIST மற்றும் cv2.RETR_EXTERNNAL ஆகியவற்றுக்கு இடையேயான வித்தியாசத்தை cv2.RETR_EXTERNNAL இல் தெளிவாகக் காணலாம். உள் வரையறைகளை புறக்கணிக்கும்போது வெளிப்புற வரையறைகளை மட்டுமே கணக்கில் எடுத்துக்கொள்கிறோம்.
படிக்கும் பொழுதே cv2.RETR_LIST உள் வரையறைகளை கணக்கில் எடுத்துக் வருகின்றன.
3. வரையறைகளை தோராயமாக்குதல் மற்றும் அவற்றின் குவிந்த ஹல் ஆகியவற்றைக் கண்டறிதல்
தோராயமான வரையறைகளில், ஒரு விளிம்பு வடிவம் மற்றொரு விளிம்பு வடிவத்தின் மீது தோராயமாக மதிப்பிடப்படுகிறது, இது முதல் விளிம்பு வடிவத்துடன் ஒத்ததாக இருக்காது.
தோராயமாக, கீழே விவரிக்கப்பட்டுள்ள ஓபன்சிவியின் தோராயமான பாலிடிபி செயல்பாட்டைப் பயன்படுத்துகிறோம்
cv2.approxPolyDP (விளிம்பு, தோராய துல்லியம், மூடப்பட்டது)
அளவுருக்கள்:
- விளிம்பு - நாம் தோராயமாக விரும்பும் தனிப்பட்ட விளிம்பு.
- தோராயமான துல்லியம் - தோராயத்தின் துல்லியத்தை தீர்மானிப்பதில் முக்கியமான அளவுரு, சிறிய மதிப்பு துல்லியமான தோராயத்தை அளிக்கிறது, பெரிய மதிப்புகள் அதிக பொதுவான தகவல்களைத் தருகின்றன. ஒரு நல்ல கட்டைவிரல் விதி விளிம்பு சுற்றளவுக்கு 5% க்கும் குறைவாக உள்ளது.
- மூடப்பட்டது - தோராயமான விளிம்பு திறந்ததா அல்லது மூடப்பட்டதா என்பதைக் குறிக்கும் பூலியன் மதிப்பு.
ஒரு வீட்டின் எளிய உருவத்தை தோராயமாக மதிப்பிட முயற்சிப்போம்
இறக்குமதி numpy NP போன்ற இறக்குமதி CV2
படத்தை ஏற்றவும், நகலை வைக்கவும்
image = cv2.imread ('house.jpg') orig_image = image.copy () cv2.imshow ('அசல் படம்', Orig_image) cv2.nightKey (0)
படத்தை கிரேஸ்கேல் மற்றும் பைனரைஸ் செய்யுங்கள்
சாம்பல் = cv2.cvtColor (படம், cv2.COLOR_BGR2GRAY) ret, thresh = cv2.threshold (சாம்பல், 127,255, cv2.THRESH_BINARY_INV)
வரையறைகளை கண்டுபிடி
_, வரையறைகள், வரிசைமுறை = cv2.findContours (thresh.copy (), cv2.RETR_LIST, cv2.CHAIN_APPROX_NONE)
ஒவ்வொரு விளிம்பு வழியாகவும், அவற்றின் எல்லை செவ்வகத்தை கணக்கிடுங்கள்
வரையறைகளில் c க்கு: x, y, w, h = cv2.boundingRect (c) cv2.rectangle (orig_image, (x, y), (x + w, y + h), (0,0,255), 2) cv2.imshow ('Bounding rect', orig_image) cv2.nightKey (0)
ஒவ்வொரு விளிம்பு வழியாகவும், தோராயமாக வரையவும்
வரையறைகளில் c க்கு:
# விளிம்பு சுற்றளவு துல்லியத்தின் சதவீதமாக துல்லியத்தை கணக்கிடுங்கள் = 0.03 * cv2.arcLength (c, உண்மை) தோராயமாக = cv2.approxPolyDP (c, துல்லியம், உண்மை) cv2.drawContours (படம்,, 0, (0,255,0), 2) cv2.imshow ('தோராயமான பாலிடிபி', படம்) cv2.waitKey (0) cv2.destroyAllWindows ()

4. குவிந்த ஓல்
குவிந்த ஹல் என்பது அடிப்படையில் வெளிப்புற விளிம்புகள், கொடுக்கப்பட்ட உருவத்தின் மீது கோடுகள் வரைவதன் மூலம் குறிக்கப்படுகிறது.
இது பொருளைச் சுற்றிலும் பொருந்தக்கூடிய மிகச்சிறிய பலகோணமாக இருக்கலாம்.
cv2 இறக்குமதி எண்ணை np image = cv2.imread ('star.jpg') சாம்பல் = cv2.cvtColor (படம், cv2.COLOR_BGR2GRAY) cv2.imshow ('அசல் படம்', படம்) cv2.waitKey (0)
படத்தை வாசல்
ret, thresh = cv2.threshold (சாம்பல், 176,255,0)
வரையறைகளை கண்டறியவும்
_, வரையறைகள், வரிசைமுறை = cv2.findContours (thresh.copy (), cv2.RETR_LIST, cv2.CHAIN_APPROX_NONE)
வரையறைகளை பரப்பளவில் வரிசைப்படுத்தி, பின்னர் மிகப்பெரிய பிரேம் விளிம்பை அகற்றவும்
n = லென் (வரையறைகள்) -1 வரையறைகள் = வரிசைப்படுத்தப்பட்டவை (வரையறைகள், விசை = cv2.contourArea, தலைகீழ் = தவறு)
வரையறைகளை கடந்து மீண்டும் குவிந்த ஹல் வரையவும்
வரையறைகளில் c க்கு:
hull = cv2.convexHull (c) cv2.drawContours (படம்,, 0, (0,255,0), 2) cv2.imshow ('குவிந்த ஹல்', படம்) cv2.waitKey (0) cv2.destroyAllWindows ()
5. வடிவங்களால் பொருந்தக்கூடிய விளிம்பு
cv2.matchShapes (விளிம்பு வார்ப்புரு, விளிம்பு முறை, முறை அளவுரு)
வெளியீடு - போட்டி மதிப்பு (குறைந்த மதிப்பு என்பது நெருக்கமான பொருத்தம் என்று பொருள்)
விளிம்பு வார்ப்புரு - இது ஒரு புதிய படத்தில் கண்டுபிடிக்க முயற்சிக்கும் எங்கள் குறிப்பு விளிம்பு.
விளிம்பு - நாங்கள் எதிர்நோக்கும் தனிப்பட்ட விளிம்பு.
முறை - விளிம்பு பொருத்தத்தின் வகை (1,2,3).
முறை அளவுரு - 0.0 என தனியாக விட்டு விடுங்கள் (பைதான் ஓபன்சிவியில் பயன்படுத்தப்படவில்லை)
cv2 import numpy ஐ np ஆக இறக்குமதி செய்க
வடிவ வார்ப்புரு அல்லது குறிப்பு படத்தை ஏற்றவும்
வார்ப்புரு = cv2.imread ('star.jpg', 0) cv2.imshow ('வார்ப்புரு', வார்ப்புரு) cv2.waitKey (0)
நாம் பொருத்த முயற்சிக்கும் வடிவங்களுடன் இலக்கு படத்தை ஏற்றவும்
target = cv2.imread ('shapestomatch.jpg') சாம்பல் = cv2.cvtColor (இலக்கு, cv2.COLOR_BGR2GRAY)
Cv2.findContours ஐப் பயன்படுத்துவதற்கு முன்பு இரு படங்களையும் த்ரெஷோல்ட் செய்யுங்கள்
ret, thresh1 = cv2.threshold (வார்ப்புரு, 127,255,0) ret, thresh2 = cv2.threshold (சாம்பல், 127,255,0)
வார்ப்புருவில் வரையறைகளை கண்டறியவும்
_ .
பட அவுட்லைன்
sorted_contours = வரிசைப்படுத்தப்பட்ட (வரையறைகள், விசை = cv2.contourArea, தலைகீழ் = உண்மை) # நாங்கள் இரண்டாவது பெரிய வரையறைகளை பிரித்தெடுக்கிறோம், இது எங்கள் வார்ப்புரு விளிம்பாக இருக்கும் tempelate_contour = வரையறைகளை # இரண்டாவது இலக்கு படத்திலிருந்து வரையறைகளை _, வரையறைகளை, வரிசைமுறை = cv2.findContours (thresh2, cv2.RETR_CCOMP, cv2.CHAIN_APPROX_SIMPLE) வரையறைகளில்: # இலக்கு படத்தில் ஒவ்வொரு வரையறையையும் படித்து, cv2.matchShape ஐப் பயன்படுத்தி விளிம்பு வடிவ பொருத்தத்தை ஒப்பிட்டுப் பார்க்கவும் = cv2.matchShapes (tempelate_contour, c, 1,0.0) அச்சு ("பொருத்தம்") #if பொருந்தினால் மதிப்பு 0.15 க்கும் குறைவாக இருந்தால் <0.16: close_contour = c else: closeest_contour = cv2.drawContours (இலக்கு,, - 1, (0,255,0), 3) cv2.imshow ('வெளியீடு', இலக்கு) cv2.waitKey (0) cv2.destroyAllWindows ()

கன்சோல் வெளியீடு -
0.16818605122199104
0.19946910256158912
0.18949760627309664
0.11101058276281539
வெவ்வேறு கணித செயல்பாட்டுடன் மூன்று வெவ்வேறு முறைகள் உள்ளன, 1,2 மற்றும் 3 இலிருந்து மாறுபடும் cv2.matchShapes (tempelate_contour, c, 1, 0.0) முறை மதிப்புகளை மாற்றுவதன் மூலம் ஒவ்வொரு முறையிலும் நாம் பரிசோதனை செய்யலாம், ஒவ்வொரு மதிப்புக்கும் நீங்கள் வெவ்வேறு பொருத்தத்தைப் பெறுவீர்கள் கன்சோல் வெளியீட்டில் மதிப்புகள்.
6. வடிவங்களை அடையாளம் காணுதல் (வட்டம், செவ்வகம், முக்கோணம், சதுரம், நட்சத்திரம்)
படத்திலிருந்து பல்வேறு வகையான வடிவங்களை தானாகக் கண்டறிய ஓபன்சிவி பயன்படுத்தப்படலாம். கீழே உள்ள குறியீட்டைப் பயன்படுத்துவதன் மூலம், படத்திலிருந்து வட்டம், செவ்வகம், முக்கோணம், சதுரம் மற்றும் நட்சத்திரங்களைக் கண்டறிய முடியும்.
cv2 import numpy ஐ np ஆக இறக்குமதி செய்க
ஏற்றவும் பின்னர் சாம்பல் அளவிலான படங்கள்
படத்தை = cv2.imread ('shapes.jpg') சாம்பல் = cv2.cvtColor (படம், cv2.COLOR_BGR2GRAY) cv2.imshow ('வடிவங்கள் அடையாளம்', படத்தை) cv2.waitKey (0) RET, போரடித்தீர் = cv2.threshold (சாம்பல், 127,255,1)
வரையறைகளை பிரித்தெடுக்கவும்
_, வரையறைகள், வரிசைமுறை = cv2.findContours (thresh.copy (), cv2.RETR_LIST, cv2.CHAIN_APPROX_NONE)
வரையறைகளில் cnt க்கு:
தோராயமான பாலிகான்களின் பெற சுமார் = cv2.approxPolyDP (CNT, 0.01 * cv2.arcLength (CNT, ட்ரூ), ட்ரூ) லென் என்றால் (தோராயமாக) == 3: shape_name = "முக்கோணம்" cv2.drawContours (பட,, 0, (0,255, 0), - 1)
மையத்தில் உரையை வைக்க விளிம்பு மையத்தைக் கண்டறியவும்
M = cv2.moments (cnt) cx = int (M / M) cy = int (M / M) cv2.putText (படம், வடிவம்_பெயர், (cx-50, cy), cv2.FONT_HERSHEY_SIMPLEX, 1, (0,0, 0), 1) எலிஃப் லென் (தோராயமாக) == 4: x, y, w, h = cv2.boundingRect (cnt) M = cv2.moments (cnt) cx = int (M / M) cy = int (M / எம்)
அந்த நான்கு பக்க பலகோணம் சதுரமா அல்லது செவ்வகமா என்பதைப் பார்க்கவும்
# cv2.boundingRect இடது அகலத்தையும் உயரத்தையும் பிக்சல்களில் திருப்பி, மேல் # இடது மூலையில் இருந்து தொடங்கி , சதுரத்திற்கு ஏபிஎஸ் (wh) <= 3: shape_name = "சதுரம்" # உரையை வைக்க சரும மையத்தைக் கண்டறிந்தால் அது கிட்டத்தட்ட ஒரே மாதிரியாக இருக்கும் . சென்டர் cv2.drawContours (பட,, 0, (0,125,255), - 1) cv2.putText (படம், shape_name (CX -50, CY), cv2.FONT_HERSHEY_SIMPLEX, 1, (0,0,0), 1) வேறு: shape_name = "Reactangle" # cv2.drawContours (படம்,, 0, (0,0,255), - 1) M = cv2.moments (cnt) cx = int (M / M) cy = int (M / M) cv2.putText (படம், வடிவம்_பெயர், (cx-50, cy), cv2.FONT_HERSHEY_SIMPLEX, 1, (0,0,0), 1) எலிஃப் லென் (தோராயமாக) == 10: shape_name = 'நட்சத்திரம்' cv2.drawContours (படம்,, 0, (255,255,0), - 1) M = cv2.moments (cnt) cx = int (M / M) cy = int (M / M) cv2.putText (படம், வடிவம்_பெயர், (cx-50, cy), cv2.FONT_HERSHEY_SIMPLEX, 1, (0,0,0), 1) elif len (தோராயமாக)> = 15: shape_name = 'வட்டம்' cv2.drawContours (படம்,, 0, (0,255,255), -1) M = cv2.moments (cnt) cx = int (M / M) cy = int (M / M) cv2.putText (படம், வடிவம்_பெயர், (cx-50, cy), cv2.FONT_HERSHEY_SIMPLEX, 1, (0,0,0), 1) cv2.imshow ('அடையாளம் வடிவங்கள்', படத்தை) cv2.waitKey (0) cv2.destroyAllWindows ()

7. வரி கண்டறிதல்
வரி கண்டறிதல் என்பது ஓபன்சிவியில் மிக முக்கியமான கருத்தாகும், மேலும் இது உண்மையான உலகில் நம்பிக்கைக்குரிய பயன்பாட்டைக் கொண்டுள்ளது. தன்னாட்சி கார்கள் பாதைகள் மற்றும் சாலைகளைக் கண்டறிவதற்கு வரி கண்டறிதல் வழிமுறைகளைப் பயன்படுத்துகின்றன.
வரி கண்டறிதலில் நாம் இரண்டு வழிமுறைகளைக் கையாள்வோம்,
- ஹஃப் லைன் அல்காரிதம்
- புரோபலிஸ்டிக் ஹஃப் லைன் அல்காரிதம்.

உயர்நிலைப் பள்ளி கணிதத்திலிருந்து y = mx + c என்ற சமன்பாட்டின் மூலம் வரியின் பிரதிநிதித்துவத்தை நீங்கள் நினைவில் வைத்திருக்கலாம் .
இருப்பினும், ஓபன்சிவி வரிசையில் மற்றொரு வழி குறிப்பிடப்படுகிறது

Ρ = xcosӨ + ysincosӨ க்கு மேலே உள்ள சமன்பாடு என்பது வரியின் ஓபன்சிவி பிரதிநிதித்துவம் ஆகும், இதில் origin என்பது தோற்றத்திலிருந்து கோட்டின் செங்குத்தாக உள்ள தூரம் மற்றும் line என்பது இந்த வரியின் இயல்பான தோற்றத்திற்கு உருவாகும் கோணம் (ரேடியன்களில் அளவிடப்படுகிறது, இதில் 1pi ரேடியன்கள் / 180 = 1 டிகிரி).
வரியைக் கண்டறிவதற்கான ஓபன்சிவி செயல்பாடு இவ்வாறு கொடுக்கப்பட்டுள்ளது
cv2.HoughLines (பைனரைஸ் செய்யப்பட்ட படம், ρ துல்லியம், Ө துல்லியம், வாசல்), இதில் வாசல் ஒரு வரியாகக் கருதப்படுவதற்கான குறைந்தபட்ச வாக்கு.
இப்போது ஓபன்சிவியின் ஹஃப் லைன் செயல்பாட்டின் உதவியுடன் ஒரு பெட்டி படத்திற்கான வரிகளைக் கண்டுபிடிப்போம்.
cv2 இறக்குமதி எண்ணை np image = cv2.imread ('box.jpg') ஆக இறக்குமதி செய்க
கிரேஸ்கேல் மற்றும் கேனி விளிம்புகள் பிரித்தெடுக்கப்பட்டன
சாம்பல் = cv2.cvtColor (படம், cv2.COLOR_BGR2GRAY) விளிம்புகள் = cv2.Canny (சாம்பல், 100,170, துளை அளவு = 3)
1 பிக்சலின் rho துல்லியத்தைப் பயன்படுத்தி ஹஃப் வரிகளை இயக்கவும்
1 டிகிரி # லைன் வாசலில் உள்ள (np.pi / 180) இன் துல்லியம் 240 (வரியில் உள்ள புள்ளிகளின் எண்ணிக்கை) கோடுகள் = cv2.HoughLines (விளிம்புகள், 1, np.pi / 180, 240) #we iterate ஒவ்வொரு வரியின் வழியாகவும், # வரம்பில் (0, லென் (கோடுகள்)) cv2.lines (அதாவது இறுதி புள்ளிகள் தேவை) ஆல் வடிவமைக்கப்பட்ட # வடிவமாக மாற்றவும் : ரோ, தீட்டா வரிகளில்: a = np.cos (theta) b = np.sin (தீட்டா) x0 = a * rho y0 = b * rho x1 = int (x0 + 1000 * (- b)) y1 = int (y0 + 1000 * (a)) x2 = int (x0-1000 * (-b)) y2 = int (y0-1000 * (a)) cv2.line (படம், (x1, y1), (x2, y2), (0,255,0), 2) cv2.imshow ('ஹஃப் கோடுகள்', படம்) cv2.waitKey (0) cv2.destroyAllWindows ()
இப்போது நிகழ்தகவு ஹஃப் வரியின் பிற வழிமுறைகளுடன் வரி கண்டறிதலுக்கு மேலே மீண்டும் செய்வோம்.
வரிக் கண்டறிதலுக்குப் போதுமான புள்ளிகளின் சீரற்ற துணைக்குழுவை எடுத்துக்கொள்வதே நிகழ்தகவு ஹஃப் கோட்டின் பின்னால் உள்ள யோசனை.
நிகழ்தகவு ஹஃப் கோடுக்கான ஓபன்சிவி செயல்பாடு cv2 ஆக குறிப்பிடப்படுகிறது. HoughLinesP (பைனரைஸ் செய்யப்பட்ட படம், ρ துல்லியம், Ө துல்லியம், வாசல், குறைந்தபட்ச வரி நீளம், அதிகபட்ச வரி இடைவெளி)
இப்போது நிகழ்தகவு ஹஃப் கோடுகளின் உதவியுடன் பெட்டி வரிகளைக் கண்டுபிடிப்போம்.
cv2 import numpy ஐ np ஆக இறக்குமதி செய்க
கிரேஸ்கேல் மற்றும் கேனி விளிம்புகள் பிரித்தெடுக்கப்பட்டன
image = cv2.imread ('box.jpg') சாம்பல் = cv2.cvtColor (படம், cv2.COLOR_BGR2GRAY) விளிம்புகள் = cv2.Canny (சாம்பல், 50,150, துளை அளவு = 3) # நாம் அதே ரோ மற்றும் தீட்டா துல்லியங்களைப் பயன்படுத்துகிறோம், குறைந்தபட்ச வாக்குகளை (வரியுடன் pts) 100 # மற்றும் நிமிட வரி நீளம் 5 பிக்சல்கள் மற்றும் 10 பிக்சல்கள் வரிகளின் வரிகளுக்கு இடையில் அதிகபட்ச இடைவெளி = cv2 . i க்கான அதிகபட்ச இடைவெளியை குறிப்பிடுகிறோம். வரம்பில் (0, லென் (கோடுகள்)): கோடுகளில் x1, y1, x2, y2 க்கு: cv2.line (படம், (x1, y1), (x2, y2), (0,255,0), 3) cv2. imshow ('probalistic hough lines', image) cv2.waitKey (0) cv2.destroyAllWindows

8. குமிழ் கண்டறிதல்
இணைக்கப்பட்ட பிக்சல்களின் குழுவாக வலைப்பதிவுகள் விவரிக்கப்படலாம், அவை அனைத்தும் பொதுவான சொத்தைப் பகிர்ந்து கொள்கின்றன. OpenCV குமிழ் கண்டுபிடிப்பாளரைப் பயன்படுத்துவதற்கான முறை இந்த ஓட்ட விளக்கப்படத்தின் மூலம் விவரிக்கப்பட்டுள்ளது.

முக்கிய புள்ளிகளை வரைய நாம் பின்வரும் வாதங்களை எடுக்கும் cv2.drawKeypoints ஐப் பயன்படுத்துகிறோம்.
cv2.drawKeypoints (உள்ளீட்டு படம், முக்கிய புள்ளிகள், வெற்று_அவுட்_அரே, நிறம், கொடிகள்)
கொடிகளில் இருக்க முடியும்
cv2.DRAW_MATCHES_FLAGS_DEFAULT
cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS
cv2.DRAW_MATCHES_FLAGS_DRAW_OVER_OUTIMG
cv2.DRAW_MATCHES_FLAGS_NOT_DRAW_SINGLE_POINTS
மற்றும் வெற்று இங்கே பூஜ்ஜியங்களைக் ஒன்று அணியின் மூலம் அழகான பெரிதாக ஒன்றும் ஆனால் ஒன்றாகும்
இப்போது சூரியகாந்திகளின் ஒரு படத்தில் குமிழ் கண்டறிதலைச் செய்வோம், அங்கு பூக்கள் பூவின் மையப் பகுதிகளாக இருக்கும், ஏனெனில் அவை எல்லா பூக்களுக்கும் பொதுவானவை.
cv2 இறக்குமதி எண்ணை np image = cv2.imread ('Sunflowers.jpg', cv2.IMREAD_GRAYSCALE) ஆக இறக்குமதி செய்க
இயல்புநிலை அளவுருக்களுடன் கண்டறிதலை அமைக்கவும்
கண்டறிதல் = cv2.SimpleBlobDetector_create ()
குமிழ்களைக் கண்டறியவும்
keypoints = detor.detect (படம்)
கண்டறியப்பட்ட வலைகளை சிவப்பு வட்டங்களாக வரையவும்
# cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS உறுதி குமிழ் அளவு வட்டத்தின் பொருந்துகிறது இன் #size வெற்று = np.zeros ((1,1)) துளிகளை = cv2.drawKeypoints (படம், keypoints, வெற்று (0,255,255), cv2.DRAW_MATCHES_FLAGS_DEFAULT)
முக்கிய புள்ளிகளைக் காட்டு
cv2.imshow ('blobs', blobs) cv2.waitKey (0) cv2.destroyAllWindows ()

குறியீடு நன்றாக வேலை செய்தாலும், பூக்களின் சீரற்ற அளவுகள் காரணமாக சில குமிழ்கள் தவறவிடப்படுகின்றன, ஏனெனில் முன்னால் உள்ள பூக்கள் இறுதியில் பூக்களுடன் ஒப்பிடும்போது பெரியவை.
9. வலைகளை வடிகட்டுதல் - வட்டங்கள் மற்றும் நீள்வட்டங்களை எண்ணுதல்
குமிழ்கள் அவற்றின் வடிவம், அளவு மற்றும் வண்ணத்திற்கு ஏற்ப வடிகட்டுவதற்கு அளவுருக்களைப் பயன்படுத்தலாம். குமிழ் கண்டறிதலுடன் அளவுருக்களைப் பயன்படுத்துவதற்கு, ஓபன்சிவியின் செயல்பாட்டைப் பயன்படுத்துகிறோம்
cv2.SimpleBlobDetector_Params ()
கீழே பட்டியலிடப்பட்டுள்ள இந்த நான்கு அளவுருக்கள் மூலம் குமிழ்களை வடிகட்டுவதைக் காண்போம்:
பரப்பளவு
params.filterByArea = உண்மை / தவறான params.minArea = பிக்சல்கள் params.maxArea = பிக்சல்கள்
சுற்றறிக்கை
params.filterByCircularity = உண்மை / தவறான params.minCircularity = 1 சரியானதாக இருப்பது, 0 எதிர்மாறாக இருப்பது
குவிவு - குமிழ் பரப்பளவு / குவிந்த ஓல் பகுதி
params.filterByConvexity = உண்மை / தவறான params.minConvexity = பகுதி

மந்தநிலை
params.filterByInertia = உண்மை / தவறான params.minInertiaRatio = 0.01

இப்போது மேலே குறிப்பிட்ட அளவுருக்கள் மூலம் குமிழ்களை வடிகட்ட முயற்சிப்போம்
cv2 இறக்குமதி எண்ணை np image = cv2.imread ('blobs.jpg') cv2.imshow ('அசல் படம்', படம்) cv2.waitKey (0)
இயல்புநிலை அளவுருக்களைப் பயன்படுத்தி கண்டுபிடிப்பாளரைத் தொடங்கவும்
கண்டறிதல் = cv2.SimpleBlobDetector_create ()
குமிழ்களைக் கண்டறியவும்
keypoints = detor.detect (படம்)
சிவப்பு வட்டங்களாக எங்கள் படத்தில் குமிழ்களை வரையவும்
blank = np.zeros ((1,1)) blobs = cv2.drawKeypoints (படம், முக்கிய புள்ளிகள், வெற்று, (0,0,255), cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS) number_of_blobs = len ( " முக்கிய புள்ளிகள்) உரை = (len (keypoints)) cv2.putText (blobs, text, (20,550), cv2.FONT_HERSHEY_SIMPLEX, 1, (100,0,255), 2)
குமிழ் விசை புள்ளிகளுடன் படத்தைக் காண்பி
cv2.imshow ('இயல்புநிலை அளவுருக்களைப் பயன்படுத்தி குமிழ்', குமிழ்கள்) cv2.waitKey (0)
எங்கள் வடிகட்டுதல் அளவுருக்களை அமைக்கவும்
# cv2.SimpleBlobDetector params = cv2.SimpleBlobDetector_Params () ஐப் பயன்படுத்தி அளவுரு அமைப்பைத் தொடங்கவும்
பகுதி வடிகட்டுதல் அளவுருக்களை அமைக்கவும்
params.filterByArea = உண்மை params.minArea = 100
சுற்றறிக்கை வடிகட்டுதல் அளவுருக்களை அமைக்கவும்
params.filterByCircularity = உண்மை params.minCircularity = 0.9
குவிவு வடிகட்டுதல் அளவுருவை அமைக்கவும்
params.filterByConvexity = தவறான params.minConvexity = 0.2
நிலைமாற்ற வடிகட்டுதல் அளவுருவை அமைக்கவும்
params.filterByInertia = உண்மை params.minInertiaRatio = 0.01
அளவுருவுடன் டிடெக்டரை உருவாக்கவும்
கண்டறிதல் = cv2.SimpleBlobDetector_create (அளவுருக்கள்)
குமிழ்களைக் கண்டறியவும்
keypoints = detor.detect (படம்)
படங்களை சிவப்பு வட்டங்களாக வரையவும்
blank = np.zeros ((1,1)) blobs = cv2.drawKeypoints (படம், முக்கிய புள்ளிகள், வெற்று, (0,255,0), cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS) number_of_blobs = len ( blobs nobsou + வட்டங்கள்) str (len (keypoints)) cv2.putText (blobs, text, (20,550), cv2.FONT_HERSHEY_SIMPLEX, 1, (0,100,255), 2)
குமிழிகளைக் காட்டு
cv2.imshow ('வட்டக் குமிழ்களை வடிகட்டுதல்', குமிழ்கள்) cv2.waitKey (0) cv2.destroyAllWindows ()

எனவே பைதான்-ஓபன்சிவியில் படப் பிரிவு எவ்வாறு செய்ய முடியும். கணினி பார்வை மற்றும் ஓபன்சிவி பற்றிய நல்ல புரிந்துணர்வைப் பெற, முந்தைய கட்டுரைகளைப் பாருங்கள் (பைதான் ஓபன்சிவியில் பைதான் ஓபன்சிவி மற்றும் பட கையாளுதல்களுடன் தொடங்கவும், நீங்கள் கணினி பார்வை மூலம் குளிர்ச்சியாக ஏதாவது செய்ய முடியும்.
