0

I'm making python script that can do img to text
but main problem is same pic, same python script

can run successfully on PC python 3.9.12 , Ubuntu 22.04.1

but faced ValueError: not enough values to unpack (expected 3, got 2)
on nvidia TX2 python3 3.6.9 , python 2.7.17 , Ubuntu 18.04.1

and TX2 , I used "python3 my_script.py" to run

import os
import cv2
import numpy as np
from PIL import Image
from PIL import ImageDraw
from PIL import ImageFont
import pytesseract



image_2x2 = cv2.imread("/home/jetson/Desktop/test_12.26/original_duplicate.png")
x = 0
y = 0
small_w = 250
small_h = 334
new_crop_for_2x2_xy_distance = image_2x2[y:y+small_h, x:x+small_w]
cv2.imwrite(f"/home/jetson/Desktop/test_12.26/2x2_xy_distance.png",new_crop_for_2x2_xy_distance)

gray = cv2.cvtColor(new_crop_for_2x2_xy_distance, cv2.COLOR_BGR2GRAY)


ret, thresh = cv2.threshold(gray, 60, 255, cv2.THRESH_BINARY_INV)
blur = cv2.medianBlur(thresh, 1)
kernel = np.ones((10, 20), np.uint8)
img_dilation = cv2.dilate(blur, kernel, iterations=1)
im2, ctrs, hier = cv2.findContours(img_dilation.copy(), cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)

sorted_ctrs = sorted(ctrs, key=lambda ctr: cv2.boundingRect(ctr)[0])

xy_list = []
listOfElems = []
listOfDuplicate = []
list_for_duplicate_x_and_y = [ ]

for i, ctr in enumerate(sorted_ctrs):
    # Get bounding box
    x, y, w, h = cv2.boundingRect(ctr)
    roi = new_crop_for_2x2_xy_distance[y:y + h, x:x + w]
    if (h > 50 and w > 50) and h < 200:

        cv2.rectangle(new_crop_for_2x2_xy_distance, (x, y), (x + w, y + h), (255, 255, 255), 1)        
        
        print("= = = = = = = =   ")
        print("左上 右下" )        
        print(x , y )            # 左上 (x , y ) 
        print(x + w , y + h )    # 右下 (x , y ) = (x + w , y + h )


# (x,y)標準化
        for xc in (45,150,255,360,465,570):
            if xc-20 < x < xc+20:
                x = xc + 26
                break
        else:
            x = 0
                    
        for yc in (132, 243,586,357,470):
            if yc-20 < y < yc+20:
                y = yc + 48
                break
             
        else:
            y = 0           
        
        print("new number" , x , y )
        
        tem_list_x_and_y = [ ] 
        tem_list_for_duplicate_x_and_y = [ ] 

        if (x != 0) and (y != 0):
            # cv2.imwrite(f"/home/joy/桌面/optimization_11_10/output_11_10__001/output_y:{y}_x:{x}.png", roi)
            tem_list_x_and_y.append(x)
            tem_list_x_and_y.append(y)
            
            xy_list.append(tem_list_x_and_y)

print(xy_list)    
sorted_xy_list = (sorted(xy_list , key=lambda k: [k[1], k[0]]))   
print(sorted_xy_list)   

first_xy= sorted_xy_list[0]
second_xy= sorted_xy_list[1]
third_xy= sorted_xy_list[2]
fourth_xy= sorted_xy_list[3]

# each x
first_xy_x = first_xy[0]
second_xy_x = second_xy[0]
third_xy_x = third_xy[0]
fourth_xy_x = fourth_xy[0]

# each y
first_xy_y = first_xy[1] 
second_xy_y = second_xy[1]
third_xy_y = third_xy[1]
fourth_xy_y = fourth_xy[1]

x_distance = ((second_xy_x - first_xy_x) + (fourth_xy_x - third_xy_x) )/2
y_distance = ((third_xy_y - first_xy_y) + (fourth_xy_y - second_xy_y) )/2

print(x_distance)
print(y_distance)


predict_xy_list = []
tem_predict_xy_list = [ ] 

tem_predict_xy_list.append(first_xy_x)
tem_predict_xy_list.append(first_xy_y)
predict_xy_list.append(tem_predict_xy_list)

last_x = first_xy_x
last_y = first_xy_y

tem_predict_xy_list = [ ] 
for y in range(4):
    tem_predict_xy_list = [ ] 
    last_y = int(last_y) + int(y_distance)
    tem_predict_xy_list.append(first_xy_x)
    tem_predict_xy_list.append(last_y)
    predict_xy_list.append(tem_predict_xy_list)

for x in range(5):
    tem_predict_xy_list = [ ] 
    last_x = int(last_x) + int(x_distance)
    tem_predict_xy_list.append(last_x)
    tem_predict_xy_list.append(first_xy_y)
    predict_xy_list.append(tem_predict_xy_list)

print(predict_xy_list)
print(len(predict_xy_list))
print("= = = = = ")

for x in range(5):
    tem_predict_xy_list = [ ] 
    last_x = int(last_x) + int(x_distance)
    last_y = first_xy_y
    for y in range(4):
        tem_predict_xy_list = [ ] 
        last_y = int(last_y) + int(y_distance)
        tem_predict_xy_list.append(last_x)
        tem_predict_xy_list.append(last_y)
        predict_xy_list.append(tem_predict_xy_list)

print(predict_xy_list)
print(len(predict_xy_list))

sorted_predict_xy_list = (sorted(predict_xy_list , key=lambda k: [k[1], k[0]]))
print(sorted_predict_xy_list)   

sorted_predict_xy_list = [ [71,180], [176,180], [281,180], [386,180], [491,180], [596,180],
[71,291], [176,291], [281,291], [386,291], [491,291], [596,291],
[71,406], [176,406], [281,406], [386,406], [491,406], [596,406],
[71,522], [176,522], [281,522], [386,522], [491,522], [596,522],
[71,637], [176,637], [281,637], [386,637], [491,637], [596,637] ]

image = cv2.imread("/home/jetson/Desktop/test_12.26/original_duplicate.png")
j = 0
while j < len(sorted_predict_xy_list) :
    temp_xy = sorted_predict_xy_list[j]
    x = temp_xy[0]
    y = temp_xy[1]
    small_txt_size_w = 65
    small_txt_size_h = 16
    x2 = int(x) + int(small_txt_size_w)
    y2 = int(y) + int(small_txt_size_h)
    new_crop = image[y:y2, x:x2]



    text = pytesseract.image_to_string(new_crop, lang='eng').strip()
    print("x :" , x  , ",y :",y , ", x+small_txt_size_w", x2 , ", y+small_txt_size_h :" , y2)
    j+=1
 
 
    
    if text not in listOfElems:
        
        listOfElems.append(text)
        print(text)
        print("= = = = = = = =   ")
        print("  ")
    else:

        print("Duplicate text is here:")
        print(text)
        print("x :" , x , "y :",y)
        tem_list_for_duplicate_x_and_y.append(x)
        tem_list_for_duplicate_x_and_y.append(y)
        list_for_duplicate_x_and_y.append(tem_list_x_and_y)

        print("= = = = = = = =   ")
        print("  ")                

                            

                    # print("len for xy_list is : " ,len(xy_list))

                    # aaa_list = (sorted(xy_list , key=lambda k: [k[1], k[0]]))
                    # print(aaa_list)        

                    # print("list_for_duplicate_x_and_y is :")      

                    # print(list_for_duplicate_x_and_y)      

                    # print("listOfElems is :")
                    # print(listOfElems)    
    



    # cd /home/jetson/Desktop/test_12.26

# /home/jetson/Desktop/test_12.26/original_duplicate.png
# python 12_26_img_to_text.py

# python3 12_26_img_to_text.py

the error message

Traceback (most recent call last):
  File "12_26_img_to_text.py", line 26, in <module>
    im2, ctrs, hier = cv2.findContours(img_dilation.copy(), cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
ValueError: not enough values to unpack (expected 3, got 2)

this is my first time using nvidia TX2, but seems instead of normal PC runiing python code/script , that factory production lines more tend to use tx2 and raspberry pi

I thought I made script run on linux pc is fine, should no worry with TX2 cause they are both ubuntu, I'm too naive.
╮( ̄▽ ̄)╭

Christoph Rackwitz
  • 11,317
  • 4
  • 27
  • 36
  • give us the line where the error occurs – Achille G Dec 26 '22 at 08:02
  • do you mean this one? `Traceback (most recent call last): File "12_26_img_to_text.py", line 26, in im2, ctrs, hier = cv2.findContours(img_dilation.copy(), cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE) ValueError: not enough values to unpack (expected 3, got 2)` , I put in post too, or other info I can look up for you –  Dec 26 '22 at 08:11
  • 1
    Check your version of OpenCV. Som return 3 values and some return 2 values. You have written that it should return 3. I suspect you have a version that only returns 2 return values. See https://docs.opencv.org/4.1.1/ and select your version of OpenCV and then look at the docs for findContour. – fmw42 Dec 26 '22 at 17:00
  • [tour], [ask], [mre] -- you checked all the wrong versions (and they differ, so that info means nothing). check the versions of opencv you use. they will differ. – Christoph Rackwitz Dec 26 '22 at 18:09

0 Answers0