c:\Users\shivpatel\Downloads\angle graph code

mail@pastecode.io avatar
unknown
python
6 months ago
3.6 kB
1
Indexable
Never
import cv2
import numpy as np
from concurrent.futures import ThreadPoolExecutor
import time
import pandas as pd
import matplotlib.pyplot as plt

def process_frame(frame):
    frame = cv2.resize(frame,(500,500))
    #frame = frame[500:800,200:900]
    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
    blurred = cv2.GaussianBlur(gray, (5, 5), 0)
    smoothed_image = cv2.bilateralFilter(blurred, d=5, sigmaColor=130, sigmaSpace=130)
    equ = cv2.equalizeHist(smoothed_image)
    return equ

def detect_edges(image):
    return cv2.Canny(image, 95, 70)

def detect_lines(edges):
    lines = cv2.HoughLinesP(edges, 1, np.pi/180, threshold=70, minLineLength=35, maxLineGap=30)
    return lines

def angle_average(angles_in_frame):
    avg_angle = np.mean(angles_in_frame)
    return avg_angle    
           
# Initialize the camera capture
cap = cv2.VideoCapture(0)
prev_frame = 0
line_data = []

if not cap.isOpened():
    print("Error: Could not access the camera.")
else:

    with ThreadPoolExecutor() as executor:
        while True:
            ret, frame = cap.read()

            if not ret:
                break

            equ = executor.submit(process_frame, frame).result()
            edges = executor.submit(detect_edges, equ).result()
            lines = executor.submit(detect_lines, edges).result()

            line_image = frame.copy()
            angles_in_frame = []

            if lines is not None:
                for line in lines:
                    x1, y1, x2, y2 = line[0]
                    cv2.line(line_image, (x1, y1), (x2, y2), (0, 0, 255), 2)

                    angle = np.arctan2(y2 - y1, x2 - x1)
                    angle_degrees = np.degrees(angle)

                    if 40>angle_degrees>60: 
                        continue  # Skip lines with an angle of 0

                    if angle_degrees < 0:
                        angle_degrees = angle_degrees + 90
                    elif angle_degrees > 0:
                        angle_degrees = 90 - angle_degrees

                    angle_degrees = round(angle_degrees)

                    cv2.putText(line_image, f'{angle_degrees:.2f} deg', (x1, y1), cv2.FONT_HERSHEY_SIMPLEX, 1, (255, 0, 0), 3)

                    line_info = [int(x1), int(y1), int(x2), int(y2), float(angle_degrees)]
                    line_data.append(line_info)
                    angles_in_frame.append(angle_degrees)
                
                avg_angle = angle_average(angles_in_frame)
                cv2.putText(line_image, f'Avg Angle: {avg_angle:.2f} deg', (10, 30), cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 255, 0), 2)

            next_frame = cv2.getTickCount()
            fps = cv2.getTickFrequency() / (next_frame - prev_frame)
            prev_frame = next_frame

            cv2.putText(line_image, f'FPS: {fps:.2f}', (10, 60), cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 255, 0), 2)

            if cv2.waitKey(1) & 0xFF == 27:  # Press 'Esc' to exit the loop
                break
            
            cv2.imshow("canny",edges)
            cv2.imshow('Processed Image', line_image)

            if cv2.waitKey(1) & 0xFF == 27:
                break

# Convert line_data to a Pandas DataFrame
columns = ['x1', 'y1', 'x2', 'y2', 'angle_degrees']
df = pd.DataFrame(line_data, columns=columns)

# Save DataFrame to Excel file
excel_file_path = 'line_data.xlsx'
df.to_excel(excel_file_path, index=False)

# Plotting the scatter plot
plt.scatter(range(len(df)), df['angle_degrees'])
plt.xlabel('Frame')
plt.ylabel('Angle (degrees)')
plt.title('Scatter Plot of Angle Over Time')
plt.show()

# Release the camera and close all windows
cap.release()
cv2.destroyAllWindows()