Skip to content
Advertisement

Can’t convert object of type ‘function’ to ‘str’ for ‘text

Good day everyone I’m sorry I’m new to python programming sorry if I’m asking this even this is basic or not. Someone can help me with this? The problem is I want to put the data that has been read by my Pyserial from my Arduino temperature sensor but I don’t know how.

Here code for the Temperature to pyserial:

def tempe():
    import serial
    import time


    ser = serial.Serial('COM5', 9600)
    time.sleep(2)

    data =[]                       # empty list to store the data
    for i in range(50):
        b = ser.readline()         # read a byte string 
        string = b.rstrip()        # remove n and r

        temp =  string             <= this data here I want to show to my opencv

        data.append(string)        # add to the end of data list
        time.sleep(0.1)            # wait (sleep) 0.1 seconds

    ser.close()

And here’s the whole code that I want to show in my PutText on opencv:

def offrecog():

screen2.destroy() <=dont mind this
screen.destroy()  <= dont mind this
def recog2(img, classifier, scaleFactor,miNeighbors, color, text, clf):
    image =  cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    features = classifier.detectMultiScale(image, scaleFactor, miNeighbors)

    for (x,y,w,h) in features:
        cv2.rectangle(img, (x,y),(x+w,y+h), color, 2)

        id, pred = clf.predict(image [y:y+h, x:x+w])
        confidence = int(100*(1-pred/300))

        databases = mysql.connector.connect(
        host ="localhost",
        user = "userdata",
        password = "",
        database = "facerecog"
        )

        mycursor = databases.cursor()

        mycursor.execute("SELECT names FROM record WHERE ids= " + str(id))
        datas = mycursor.fetchone()
        datas = "+".join(datas)

        cursor2 = databases.cursor()
        cursor2.execute("SELECT course_year FROM record WHERE ids= " + str(id))
        datas1 = mycursor.fetchone()
        datas1 = "+".join(datas1)

        cursor3 = databases.cursor()
        cursor3.execute("SELECT positions FROM record WHERE ids= " + str(id))
        datas2 = mycursor.fetchone()
        datas2 = "+".join(datas2)

        if confidence>70:
            cv2.putText(img, datas, (x,y+205), cv2.FONT_HERSHEY_SIMPLEX, 0.8, color, 2, cv2.LINE_AA)
            cv2.putText(img, datas1, (x,y+230), cv2.FONT_HERSHEY_SIMPLEX, 0.8, color, 2, cv2.LINE_AA)
            cv2.putText(img, datas2, (x,y+250), cv2.FONT_HERSHEY_SIMPLEX, 0.8, color, 2, cv2.LINE_AA)
            cv2.putText(img, tempe, (x,y+280), cv2.FONT_HERSHEY_SIMPLEX, 0.8, color, 2, cv2.LINE_AA)
            markattend(datas,datas1,datas2)
            
        else:

            cv2.putText(img, "UNKNOWN", (x,y+205), cv2.FONT_HERSHEY_SIMPLEX, 0.8, (0,0,255), 1, cv2.LINE_AA)

    return img

faceCascade = cv2.CascadeClassifier("C:\Users\So_Low\Desktop\final_recog\haarcascade_frontalface_default.xml")

clf = cv2.face.LBPHFaceRecognizer_create()
clf.read("trained.xml")

video_capture = cv2.VideoCapture(0)

while True:
    ret, img = video_capture.read()
    img = recog2(img, faceCascade, 1.3, 4, (255,255,255), "Face", clf)
    cv2.imshow("FACE RECOGNITION", img)

    if cv2.waitKey(1) & 0xFF == ord('!'):
        break
video_capture.release()
cv2.destroyAllWindows()
screen2.destroy()

and I got this error when I run it:

File "c:UsersSo_LowDesktopOffrecogoffrecog.py", line 97, in recog2
    cv2.putText(img, wew, (x,y+280), cv2.FONT_HERSHEY_SIMPLEX, 0.8, color, 2, cv2.LINE_AA)
cv2.error: OpenCV(4.5.3) :-1: error: (-5:Bad argument) in function 'putText'
> Overload resolution failed:
>  - Can't convert object of type 'function' to 'str' for 'text'
>  - Can't convert object of type 'function' to 'str' for 'text'

[ WARN:0] global C:UsersrunneradminAppDataLocalTemppip-req-build-u4kjpz2zopencvmodulesvideoiosrccap_msmf.cpp (438) `anonymous-namespace'::SourceReaderCB::~SourceReaderCB terminating async callback

[Done] exited with code=0 in 14.22 seconds

[Running] python -u "c:UsersSo_LowDesktopOffrecogoffrecog.py"
Exception in Tkinter callback
Traceback (most recent call last):
  File "I:Pythonlibtkinter__init__.py", line 1883, in __call__
    return self.func(*args)
  File "c:UsersSo_LowDesktopOffrecogoffrecog.py", line 136, in login_verify
    offrecog()
  File "c:UsersSo_LowDesktopOffrecogoffrecog.py", line 113, in offrecog
    img = recog2(img, faceCascade, 1.3, 4, (255,255,255), "Face", clf)
  File "c:UsersSo_LowDesktopOffrecogoffrecog.py", line 95, in recog2
    cv2.putText(img, temps, (x,y+280), cv2.FONT_HERSHEY_SIMPLEX, 0.8, color, 2, cv2.LINE_AA)
cv2.error: OpenCV(4.5.3) :-1: error: (-5:Bad argument) in function 'putText'
> Overload resolution failed:
>  - Can't convert object of type 'module' to 'str' for 'text'
>  - Can't convert object of type 'module' to 'str' for 'text'

Even If I don’t put the temperature code into function It run the pyserial 1st before the opencv. Please Help I don’t know what to do. Please

Advertisement

Answer

presumably you want to sample your temperature 50 times and then return a single value?

def get_temp(ser, num_samples=50):
    float_vals = [float(ser.readline()) for _ in range(num_samples)]
    avg_val = sum(float_vals)/len(float_vals) 
    return str(avg_val) # convert to string for open cv

then in your opencv call use get_temp(ser) instead of tempe

where ser is a serial instance thats already open

if taking 50 samples is too slow then you can always take less samples with get_temp(ser,5) to only take 5 samples for example … if you want the mode or median instead of the mean then i would recommend just using numpy.mode or numpy.median instead of calculating it (its probably faster to use numpy.mean than calculating the average manually)

User contributions licensed under: CC BY-SA
3 People found this is helpful
Advertisement