# Re: why this code loop forever after a draw a rectangle

```On 2016-09-16 20:14, Gary Herron wrote:
```
```On 09/16/2016 04:24 AM, meInvent bbird wrote:
```
```im = img.copy()
cntcounter = 0
for cnt in contours:
epsilon = 0.1*cv2.arcLength(cnt,True)
approx = cv2.approxPolyDP(cnt,epsilon,True)
#peri = cv2.arcLength(cnt, True)
#approx = cv2.approxPolyDP(c, 0.5 * peri, True)
#print("len(approx)="+str(len(approx)))
if len(approx) == 4:
print("approx=" + str(approx))
cntcounter = cntcounter + 1
print("here1")
x,y,w,h = cv2.boundingRect(cnt)
print("here2")
while im is None:
time.sleep(1)
if im is not None:
print("here3")
im = cv2.rectangle(im.copy(), (x,y), (x+w, y+h), (0,255,0), 2)
#im = cv2.line(im,(x,y),(x+w,y),(0,255,0),2)
#im = cv2.line(im,(x+w,y),(x+w,y+h),(0,255,0),2)
#im = cv2.line(im,(x,y+h),(x+w,y+h),(0,255,0),2)
#im = cv2.line(im,(x,y),(x,y+h),(0,255,0),2)```
```

cv2.imwrite(r'C:\Users\tester\Documents\masda.png',im)
```
```

These two lines:

while im is None:
time.sleep(1)

are an infinite loop if im is None;

Since you haven't told us what im (or img, contours, cv2) are, I can't
tell how im might become None, but it does look like you (confusingly)
use im for two different things:  an img.copy() and a cv2.rectangle,
whatever those may be.

Pure guesswork:  if cv2.rectangle draws a rectangle, what does it
return?  If it doesn't return anything, the line
im = cv2.rectangle(...)
is how im gets the value of None.

```
```It looks like the OP is using OpenCV.

You're right about cv2.rectangle; it does return None.

The line:

im = cv2.rectangle(im.copy(), (x,y), (x+w, y+h), (0,255,0), 2)

```
makes a copy of the image im, draws a rectangle on it, and then binds None to im.
```
```
The copied rectangle is discarded because there's no reference to it, so the entire line in pointless.
```
It basically does the same thing as:

im = None

only slower!

--
https://mail.python.org/mailman/listinfo/python-list
```