Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Error on ContourAreas #3

Open
thelwyn opened this issue Nov 5, 2019 · 2 comments
Open

Error on ContourAreas #3

thelwyn opened this issue Nov 5, 2019 · 2 comments

Comments

@thelwyn
Copy link

thelwyn commented Nov 5, 2019

Hi,

While initially playing your code i was running into this error:

`
File "C:/Users/thinkpad/Desktop/read_serial.py", line 56, in
if cv2.contourArea(c) < 300:

error: OpenCV(4.0.1-dev) C:\Users\thinkpad\Documents\openCV4Win\opencv-master\opencv\modules\imgproc\src\shapedescr.cpp:274: error: (-215:Assertion failed) npoints >= 0 && (depth == CV_32F || depth == CV_32S) in function 'cv::contourArea'`

I fixed it by adding one variable in this line:

#cnts = cv2.findContours(dilate.copy(), cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE) cnts,hierarchy = cv2.findContours(edged.copy(), cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)

It seens related to how different versions of OpenCv need different numbers of parameters for findContours.

I would have thought that the next line would cover for that, but apparently not:
cnts = cnts[0] if imutils.is_cv2() else cnts[1]

Anyway, I got it working, and I actually post this issue because I didn't find another way to thank you and send my greetings :)
Cheers!

@shanmugamani96
Copy link

hai i am using your given code:
import cv2
import numpy as np
import imutils
import pytesseract

read image from disk

image = cv2.imread('images/test1.jpg')

make it gray

img = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

blur it to remove noise

img = cv2.GaussianBlur(img, (7,7), 0)

perform edge detection, then perform a dilation + erosion to

close gaps in between object edges

edged = cv2.Canny(img, 40, 90)
dilate = cv2.dilate(edged, None, iterations=2)

perform erosion if necessay, it completely depends on the image

erode = cv2.erode(dilate, None, iterations=1)

create an empty masks

mask = np.ones(img.shape[:2], dtype="uint8") * 255

find contours

cnts = cv2.findContours(dilate.copy(), cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)[0]

cnts = cv2.findContours(dilate.copy(), cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)

cnts,hierarchy = cv2.findContours(edged.copy(), cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)
print(cnts)

cnts = cnts[0] if imutils.is_cv2() else cnts[1]

cnts = cnts[0] if imutils.is_cv2() else cnts[1]

orig = img.copy()
for c in cnts:
# if the contour is not sufficiently large, ignore it
if cv2.contourArea(c) < 300:
cv2.drawContours(mask, [c], -1, 0, -1)

x,y,w,h = cv2.boundingRect(c)

# filter more contours if nessesary
if(w>h):
    cv2.drawContours(mask, [c], -1, 0, -1)

newimage = cv2.bitwise_and(dilate.copy(), dilate.copy(), mask=mask)
img2 = cv2.dilate(newimage, None, iterations=3)
ret2,th1 = cv2.threshold(img2 ,0, 255, cv2.THRESH_BINARY_INV | cv2.THRESH_OTSU)

Tesseract OCR on the image

temp = pytesseract.image_to_string(th1)

Write results on the image

cv2.putText(image, temp, (100,100), cv2.FONT_HERSHEY_SIMPLEX, 1.8, (0,255,255), 3)

show the outputs

cv2.imshow('Original image', cv2.resize(image,(640,480)))
cv2.imshow('Dilated', cv2.resize(dilate,(640,480)))
cv2.imshow('New Image', cv2.resize(newimage,(640,480)))
cv2.imshow('Inverted Threshold', cv2.resize(th1,(640,480)))

cv2.waitKey(0)
cv2.destroyAllWindows()
but i didnt get results;
here i attached result image ,kindly check it,
Screenshot from 2022-11-17 16-52-47
cv2.destroyAllWindows()
but i didnt get results;

@shanmugamani96
Copy link

Is the accuracy level low, so is there any method to improve?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants