# Camera-Based Canny Edge Detection System Report
**Student Name:** YU-CHUN, LIN
**Student ID:** 71135843
## 1. Project Description
The goal of this project is to implement a real-time camera-based Canny edge detection system using OpenCV and C++. The main objectives include:
- Capturing live video feed from a camera using libcamera
- Processing multiple frames using the Canny edge detection algorithm
- Measuring and analyzing system performance metrics
- Comparing CPU time versus Wall time performance
Expected end results include processed frames showing edge detection results, performance metrics, and timing analysis for both CPU and Wall time measurements.
## 2. Experimental Setup
### Hardware Setup
- Camera system using libcamera
- Resolution: 640x480 pixels
- Frame rate: 30 fps
### Software Implementation
The system is implemented using C++ with the following key components:
- OpenCV library for image processing
- GStreamer pipeline for camera capture
- Custom Canny edge detection implementation
Key code components:
```cpp
// GStreamer pipeline configuration
string pipeline =
"libcamerasrc ! "
"video/x-raw,format=NV12,width=640,height=480,framerate=30/1 ! "
"videoconvert ! "
"appsink drop=true";
```
The methodology includes:
1. Camera initialization using GStreamer pipeline
2. Frame capture in a continuous loop
3. Conversion of frames to grayscale
4. Application of Canny edge detection
5. Performance measurement using high-resolution clock
6. Storage of processed frames
## 3. Results
### Image Processing Results
- The system successfully captures and processes up to 150 frames
- Each frame is converted to grayscale and processed using Canny edge detection
- Output images are saved in PGM format with sequential naming (frame001.pgm, frame002.pgm, etc.)
### Performance Metrics
The system measures three key timing metrics:
1. Wall Time: Total real-world time elapsed
2. CPU Time: Actual processor time used
3. Per-frame processing time and FPS (Frames Per Second)
### Timing Analysis
The code measures timing using both CPU clock and Wall clock:
```cpp
auto total_start = high_resolution_clock::now(); // Wall time start
clock_t cpu_time = clock(); // CPU time
```
### Performance Statistics
```
========================
Total frames processed: 150
Wall time (total): 11.857 seconds
CPU time: 20.450 seconds
Average time per frame: 0.079 seconds
Average FPS: 12.65
```
## 4. Problems and Discussion
### Challenges Faced
1. **Camera Integration**
- Challenge: Implementing reliable camera capture using libcamera
- Solution: Used GStreamer pipeline with appropriate configuration
2. **Performance Optimization**
- Challenge: Achieving real-time processing capabilities
- Solution: Implemented efficient frame handling and memory management
3. **Timing Measurement**
- Challenge: Accurate measurement of CPU vs Wall time
- Solution: Used high_resolution_clock for Wall time and clock() for CPU time
### CPU Time vs Wall Time
- CPU Time: Represents actual processor time used by the program
- Wall Time: Represents total elapsed real-world time
- Difference: Wall time includes system operations, I/O waiting, and other processes
- Wall time < (CPU time + System time): This indicates parallel processing
### Time Command Analysis
When running the executable with the bash time command:
```bash
$ time ./camera_canny <sigma> <tlow> <thigh>
```
The output shows:
- real: Total wall clock time (like watching a clock on the wall)
- user: CPU time spent in user mode
- sys: CPU time spent in kernel mode
### Potential Improvements
1. Implementation of parallel processing for faster frame processing
2. Memory optimization for handling longer recording sessions
3. Enhanced error handling for camera disconnection scenarios
## 5. Conclusion
The implemented camera-based Canny edge detection system successfully achieves real-time edge detection with performance monitoring capabilities. The system effectively demonstrates the relationship between CPU and Wall time in real-world applications, providing insights into system performance characteristics.
The timing analysis reveals the overhead associated with I/O operations and system calls, as evidenced by the difference between CPU and Wall time measurements. This project successfully implements both image processing functionality and performance measurement capabilities, providing a foundation for further optimization and enhancement.
### Running Instructions
1. Compile the program:
```bash
g++ canny_util.c camera_canny.cpp -o camera_canny -I. `pkg-config --cflags --libs opencv4`
```
2. Run the program:
```bash
./camera_canny <sigma> <tlow> <thigh>
```
Example: `./camera_canny 1.0 0.5 0.75`
3. Press ESC to start processing
4. Program will automatically process 150 frames
5. Results will be saved as individual PGM files
6. To encode processed frames into video, run:
```bash
ffmpeg -i frame%03d.pgm -pix_fmt yuvj420p frame_vid.h264
```