1

I am recognising faces from the webcam and I have datasets of some images. when I am trying to save an image with the static name it saves that image but when I try to save images in the loop then it is not saving.

folder directory

  1. imagesAttendance[Folder]

  2. imageResult[Folder]

  3. start.py

end folder directory

start.py

import cv2
import numpy as np
import face_recognition
import os
from datetime import datetime
from PIL import Image
# from PIL import ImageGrab
 
path = 'ImagesAttendance'
saveResults = 'ImageResult'
images = []
classNames = []
myList = os.listdir(path)
print(myList)
for cl in myList:
    curImg = cv2.imread(f'{path}/{cl}')
    images.append(curImg)
    classNames.append(os.path.splitext(cl)[0])
print(classNames)
 
def findEncodings(images):
    encodeList = []
    for img in images:
        img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
        encode = face_recognition.face_encodings(img)[0]
        encodeList.append(encode)
    return encodeList
 
def markAttendance(name, img):
    with open('Attendance.csv','r+') as f:
        myDataList = f.readlines()
        nameList = []
        for line in myDataList:
            entry = line.split(',')
            nameList.append(entry[0])
        
        now = datetime.now()
        dtString = now.strftime('%H:%M:%S')
        f.writelines(f'\n{name},{dtString}')
        ## saving image into database
        im = Image.fromarray(img)
        datee = str(now)
        cv2.imwrite('ImageResult/Image'+'anyname'+'.jpg', img)### this is working
        # cv2.imwrite('ImageResult/Image'+datee+'.jpg', img)### this is not working
    
 
#### FOR CAPTURING SCREEN RATHER THAN WEBCAM
# def captureScreen(bbox=(300,300,690+300,530+300)):
#     capScr = np.array(ImageGrab.grab(bbox))
#     capScr = cv2.cvtColor(capScr, cv2.COLOR_RGB2BGR)
#     return capScr
 
encodeListKnown = findEncodings(images)
print('Encoding Complete')
 
cap = cv2.VideoCapture(0)
 
while True:
    success, img = cap.read()
    #img = captureScreen()
    imgS = cv2.resize(img,(0,0),None,0.25,0.25)
    imgS = cv2.cvtColor(imgS, cv2.COLOR_BGR2RGB)
 
    facesCurFrame = face_recognition.face_locations(imgS)
    encodesCurFrame = face_recognition.face_encodings(imgS,facesCurFrame)
    
    for encodeFace,faceLoc in zip(encodesCurFrame,facesCurFrame):
        matches = face_recognition.compare_faces(encodeListKnown,encodeFace)
        faceDis = face_recognition.face_distance(encodeListKnown,encodeFace)
        #print(faceDis)
        matchIndex = np.argmin(faceDis)
 
        if matches[matchIndex]:
            name = classNames[matchIndex].upper()
            #print(name)
            y1,x2,y2,x1 = faceLoc
            y1, x2, y2, x1 = y1*4,x2*4,y2*4,x1*4
            cv2.rectangle(img,(x1,y1),(x2,y2),(0,255,0),2)
            cv2.rectangle(img,(x1,y2-35),(x2,y2),(0,255,0),cv2.FILLED)
            cv2.putText(img,name,(x1+6,y2-6),cv2.FONT_HERSHEY_COMPLEX,1,(255,255,255),2)
            markAttendance(name, img)

            
            
    cv2.imshow('Webcam',img)
    cv2.waitKey(1)

working saveMatch() function

def markAttendance(name, img):
    with open('Attendance.csv','r+') as f:
        ...
        cv2.imwrite('ImageResult/Image'+'anyname'+'.jpg', img)### this is working

not working saveMatch() function

def markAttendance(name, img):
    with open('Attendance.csv','r+') as f:
        ...
                cv2.imwrite('ImageResult/Image'+datee+'.jpg', img)### this is not working

I want to save every detected images in ImageResult directory.

2
  • what is datee. I'm asking for the specific values it can assume. those strings probably contain characters that are invalid as file names. Commented Sep 23, 2021 at 17:25
  • Print 'ImageResult/Image'+datee+'.jpg' and check whether the filename and path makes sense (legal filename etc.) Commented Sep 23, 2021 at 22:43

1 Answer 1

3

Important note:

In Macbook and Linux your saveMatch() function will work with the datee because the operation systems allow you to save files with characters as : for example.

The Problem:

In Windows, : is invalid character for a file name.

You are trying to save files with invaild characters in Windows, you can see in the following code what you get in using the function str(datetime.now())

date = datetime.now()
print(str(date))
>>>>> 2021-09-24 00:23:29.720260

you can read more about the Comparison of filename limitations in the link.

The Solution:

you can fix it using the next method:

def markAttendance(name, img):
    with open('Attendance.csv','r+') as f:
        ...
        cv2.imwrite('ImageResult/Image'+str(datee.strftime('%Y-%m-%d-%H-%M-%S'))'+'.jpg, img)

you can find more information about the strftime() function of the datetime package here.

Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.