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)