Issue
can you help me in solving my code problem, where I want to append the data that I have created using opencv into the csv file. I followed several tutorials on the internet, but the results were not what I wanted, here is the complete code
import cv2
import os
import time
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from csv import writer
faceCascade = cv2.CascadeClassifier(
cv2.data.haarcascades + 'haarcascade_frontalface_default.xml')
eyeCascade = cv2.CascadeClassifier(
cv2.data.haarcascades + 'haarcascade_eye.xml')
font = cv2.FONT_HERSHEY_SIMPLEX
sampel_foto = 5
counter = 1
jarak = 50
dir_name = 'C:/MyDrive'
video_capture = cv2.VideoCapture(1)
while True:
# Capture frame-by-frame
ret, frame = video_capture.read()
frame_copy = frame.copy()
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
faces = faceCascade.detectMultiScale(
gray, scaleFactor=1.2, flags=cv2.CASCADE_SCALE_IMAGE)
# Draw a rectangle around the faces
for (x, y, w, h) in faces:
cv2.rectangle(frame, (x, y), (x+w, y+h), (0, 0, 255), 3)
roi_gray = gray[y:y+h, x:x+w]
roi_color = frame[y:y+h, x:x+w]
cv2.putText(frame, 'face: '+str(w)+','+str(h),
(10, 30), font, 0.6, (255, 255, 255), 2)
eyes = eyeCascade.detectMultiScale(roi_gray)
# Draw a rectangle around the eyes
for (ex, ey, ew, eh) in eyes:
cv2.rectangle(roi_color, (ex, ey), (ex+ew, ey+eh), (0, 255, 0), 2)
cv2.putText(frame, 'eyes: '+str(ew)+','+str(eh),
(10, 50), font, 0.6, (255, 255, 255), 2)
if cv2.waitKey(1) & 0xFF == ord('c'):
cv2.imwrite(f'{dir_name}{jarak}.{counter}.jpg', frame_copy)
print(f'simpan foto ke-{counter} dengan jarak: {jarak} cm!')
counter += 1
if counter > sampel_foto:
break
# Display the resulting frame
cv2.imshow('Video', frame)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
# When everything is done, release the capture
video_capture.release()
cv2.destroyAllWindows()
# Get list of all files only in the given directory
imfilelist = [os.path.join(dir_name, f)
for f in os.listdir(dir_name) if f.endswith(".jpg")]
#list_of_files = filter( lambda x: os.path.isfile(os.path.join(dir_name, x)), os.listdir(dir_name) )
# Sort list of files based on last modification time in ascending order
list_of_files = sorted(
imfilelist, key=lambda x: os.path.getmtime(os.path.join(dir_name, x)))
for el in list_of_files:
imagen = cv2.imread(el)
gray = cv2.cvtColor(imagen, cv2.COLOR_BGR2GRAY)
# Detect faces
faces = faceCascade.detectMultiScale(
gray, scaleFactor=1.2, flags=cv2.CASCADE_SCALE_IMAGE)
# Draw a rectangle around the faces
for (x, y, w, h) in faces:
cv2.rectangle(imagen, (x, y), (x + w, y + h), (0, 255, 0), 2)
roi_gray = gray[y:y+h, x:x+w]
roi_color = imagen[y:y+h, x:x+w]
roi_color = imagen[y:y + h, x:x + w]
# Detect eyes
eyes = eyeCascade.detectMultiScale(roi_gray)
# Draw a rectangle around the eyes
for (ex, ey, ew, eh) in eyes:
cv2.rectangle(roi_color, (ex, ey), (ex+ew, ey+eh), (0, 255, 0), 2)
cv2.putText(imagen, '', (x + ex, y + ey), 1, 1, (0, 255, 0), 1)
data = str(w)+','+str(h)+','+str(ew)+','+str(eh)+','+str(jarak)
print(data)
# Create a file object for this file
with open('test.csv', 'a') as f_object:
# Pass this file object to csv.writer()
writer_object = writer(f_object)
writer_object.writerow(data_pixel)
#Close the file object
f_object.close()
the problem is when i run the script to add data to csv the result is not what i want, here is the example:
2,5,3,",",2,5,3,",",5,0,",",5,0,",",5,0
supposedly the result I want is the following:
268,268,96,96,50
258,258,60,60,50
260,260,102,102,50
what should i do to solve my problem? really appreciate your help.
Solution
I'm assuming you are trying to write data
into your CSV file? If so, move the file creation above the for
loop as follows:
with open('test.csv', 'a', newline='') as f_output:
csv_output = csv.writer(f_output)
for el in list_of_files:
.
.
.
csv_output.writerow([w, h, ew, eh, jarak])
You do not need to explicitly close the file as the with()
will handle this automatically. So for the code you have provided it would be:
import cv2
import os
import time
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from csv import writer
faceCascade = cv2.CascadeClassifier(
cv2.data.haarcascades + 'haarcascade_frontalface_default.xml')
eyeCascade = cv2.CascadeClassifier(
cv2.data.haarcascades + 'haarcascade_eye.xml')
font = cv2.FONT_HERSHEY_SIMPLEX
sampel_foto = 5
counter = 1
jarak = 50
dir_name = 'E:/OneDrive - Institut Teknologi Sepuluh Nopember/Kuliah Teknik Elektro/Semester 3/SEC/Tugas_SEC_Devis/dataset_foto/50/'
video_capture = cv2.VideoCapture(1)
while True:
# Capture frame-by-frame
ret, frame = video_capture.read()
frame_copy = frame.copy()
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
faces = faceCascade.detectMultiScale(
gray, scaleFactor=1.2, flags=cv2.CASCADE_SCALE_IMAGE)
# Draw a rectangle around the faces
for (x, y, w, h) in faces:
cv2.rectangle(frame, (x, y), (x+w, y+h), (0, 0, 255), 3)
roi_gray = gray[y:y+h, x:x+w]
roi_color = frame[y:y+h, x:x+w]
cv2.putText(frame, 'face: '+str(w)+','+str(h),
(10, 30), font, 0.6, (255, 255, 255), 2)
eyes = eyeCascade.detectMultiScale(roi_gray)
# Draw a rectangle around the eyes
for (ex, ey, ew, eh) in eyes:
cv2.rectangle(roi_color, (ex, ey), (ex+ew, ey+eh), (0, 255, 0), 2)
cv2.putText(frame, 'eyes: '+str(ew)+','+str(eh),
(10, 50), font, 0.6, (255, 255, 255), 2)
if cv2.waitKey(1) & 0xFF == ord('c'):
cv2.imwrite(f'{dir_name}{jarak}.{counter}.jpg', frame_copy)
print(f'simpan foto ke-{counter} dengan jarak: {jarak} cm!')
counter += 1
if counter > sampel_foto:
break
# Display the resulting frame
cv2.imshow('Video', frame)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
# When everything is done, release the capture
video_capture.release()
cv2.destroyAllWindows()
# Get list of all files only in the given directory
imfilelist = [os.path.join(dir_name, f)
for f in os.listdir(dir_name) if f.endswith(".jpg")]
#list_of_files = filter( lambda x: os.path.isfile(os.path.join(dir_name, x)), os.listdir(dir_name) )
# Sort list of files based on last modification time in ascending order
list_of_files = sorted(
imfilelist, key=lambda x: os.path.getmtime(os.path.join(dir_name, x)))
# Create a file object for this file
with open('test.csv', 'a') as f_object:
# Pass this file object to csv.writer()
writer_object = writer(f_object)
for el in list_of_files:
imagen = cv2.imread(el)
gray = cv2.cvtColor(imagen, cv2.COLOR_BGR2GRAY)
# Detect faces
faces = faceCascade.detectMultiScale(
gray, scaleFactor=1.2, flags=cv2.CASCADE_SCALE_IMAGE)
# Draw a rectangle around the faces
for (x, y, w, h) in faces:
cv2.rectangle(imagen, (x, y), (x + w, y + h), (0, 255, 0), 2)
roi_gray = gray[y:y+h, x:x+w]
roi_color = imagen[y:y+h, x:x+w]
roi_color = imagen[y:y + h, x:x + w]
# Detect eyes
eyes = eyeCascade.detectMultiScale(roi_gray)
# Draw a rectangle around the eyes
for (ex, ey, ew, eh) in eyes:
cv2.rectangle(roi_color, (ex, ey), (ex+ew, ey+eh), (0, 255, 0), 2)
cv2.putText(imagen, '', (x + ex, y + ey), 1, 1, (0, 255, 0), 1)
writer_object.writerow([w, h, ew, eh, jarak])
Answered By - Martin Evans Answer Checked By - Marie Seifert (PHPFixing Admin)
0 Comments:
Post a Comment
Note: Only a member of this blog may post a comment.