vault backup: 2026-02-24 16:27:47
This commit is contained in:
@@ -1,43 +1,316 @@
|
|||||||
# Project: Scale QR Code Reader
|
# Scale QR Code Reader
|
||||||
|
|
||||||
**Created:** 2026-02-24
|
## Project Overview
|
||||||
**Source:** #work-assistant
|
Research project for implementing QR code reading with IP cameras for vehicle identification at weigh scales.
|
||||||
**Status:** Testing Phase
|
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## Overview
|
## Research Findings
|
||||||
Use an IP camera with a vision model to read QR codes and other identifying markings on vehicles stopping to weigh on a scale.
|
|
||||||
|
|
||||||
## Purpose
|
### Summary
|
||||||
- Identify vehicles via QR code/markings
|
This research covers QR code detection libraries, IP camera integration methods, reading QR codes at distance/in motion, camera hardware specifications, and lighting/mounting considerations for weigh scale applications.
|
||||||
- Store vehicle data with timestamp and weight
|
|
||||||
- Populate database for further processing
|
|
||||||
|
|
||||||
## Components
|
|
||||||
- IP camera
|
|
||||||
- Vision model for QR/markings recognition
|
|
||||||
- Database for storage
|
|
||||||
- Scale integration
|
|
||||||
|
|
||||||
## Current Status
|
|
||||||
✅ **Testing Phase**
|
|
||||||
- Software has been written
|
|
||||||
- Currently in testing
|
|
||||||
|
|
||||||
## Tasks
|
|
||||||
|
|
||||||
- [ ] Complete testing
|
|
||||||
- [ ] Deploy to production
|
|
||||||
|
|
||||||
## Notes
|
|
||||||
|
|
||||||
*(Add technical details, camera specs, vision model used, etc.)*
|
|
||||||
|
|
||||||
## Related
|
|
||||||
|
|
||||||
- [Scale Weight Readout](Scale%20Weight%20Readout.md) — companion scale project
|
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
*Extracted from Projects to be organized*
|
### 1. QR Code Detection Libraries
|
||||||
|
|
||||||
|
#### Recommended Libraries (Ranked)
|
||||||
|
|
||||||
|
**1. pyzbar (ZBar)** - Best Overall for Python
|
||||||
|
- **Pros:** Fastest runtime (~157ms), good reading rate, supports Python 2 & 3, easy integration
|
||||||
|
- **Cons:** Struggles with blurred, curved, and damaged codes
|
||||||
|
- **Install:** `pip install pyzbar`
|
||||||
|
- **Best for:** General purpose QR reading with static/slow-moving vehicles
|
||||||
|
|
||||||
|
**2. OpenCV WeChat QR Code Detector**
|
||||||
|
- **Pros:** Excellent with damaged and pathological QR codes, handles non-compliant codes (colored, logos), robust in challenging conditions
|
||||||
|
- **Cons:** Slower runtime (~758ms), struggles with multiple codes in one image
|
||||||
|
- **Best for:** Dirty/damaged codes on industrial vehicles
|
||||||
|
|
||||||
|
**3. BoofCV**
|
||||||
|
- **Pros:** Fastest runtime (~105ms), excellent with multiple codes per image, open-source
|
||||||
|
- **Cons:** Poor performance on non-compliant codes
|
||||||
|
- **Best for:** Multiple QR codes or high-speed processing needs
|
||||||
|
|
||||||
|
**4. YOLO-QR (Deep Learning)**
|
||||||
|
- **Pros:** Can detect QR codes in complex scenes, handles motion blur better than traditional methods
|
||||||
|
- **Cons:** Requires training data, more complex setup, computationally intensive
|
||||||
|
- **Approach:** Train custom YOLO model to detect QR codes, then extract region and decode with traditional library
|
||||||
|
- **Best for:** Advanced scenarios with challenging angles and motion
|
||||||
|
|
||||||
|
#### Library Comparison from Benchmarks
|
||||||
|
| Library | Reading Rate | Runtime | Blurred | Damaged | Multiple Codes |
|
||||||
|
|---------|-------------|---------|---------|---------|----------------|
|
||||||
|
| Dynamsoft (Commercial) | 83.29% | 195ms | 66% | 51% | 100% |
|
||||||
|
| BoofCV | 60.69% | 105ms | 38% | 16% | 99.76% |
|
||||||
|
| ZBar (pyzbar) | 38.95% | 157ms | 35% | 26% | 18% |
|
||||||
|
| OpenCV WeChat | 48.89% | 758ms | 46% | 30% | 0% |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### 2. IP Camera Integration Methods
|
||||||
|
|
||||||
|
#### Primary Methods
|
||||||
|
|
||||||
|
**1. RTSP Streaming (Recommended)**
|
||||||
|
```python
|
||||||
|
import cv2
|
||||||
|
|
||||||
|
# Hikvision RTSP URL
|
||||||
|
rtsp_url = "rtsp://username:password@camera_ip:554/Streaming/channels/101"
|
||||||
|
|
||||||
|
# Dahua RTSP URL
|
||||||
|
rtsp_url = "rtsp://username:password@camera_ip:554/cam/realmonitor?channel=1&subtype=0"
|
||||||
|
|
||||||
|
cap = cv2.VideoCapture(rtsp_url)
|
||||||
|
while True:
|
||||||
|
ret, frame = cap.read()
|
||||||
|
if ret:
|
||||||
|
# Process frame for QR codes
|
||||||
|
process_frame(frame)
|
||||||
|
```
|
||||||
|
|
||||||
|
**2. HTTP Snapshot (Lower Latency)**
|
||||||
|
- Hikvision: `http://user:pass@camera_ip/ISAPI/Streaming/channels/101/picture`
|
||||||
|
- Useful for single-frame capture on trigger
|
||||||
|
|
||||||
|
**3. ONVIF Control**
|
||||||
|
```python
|
||||||
|
from onvif import ONVIFCamera
|
||||||
|
|
||||||
|
# Camera control for PTZ, presets
|
||||||
|
mycam = ONVIFCamera('192.168.1.10', 80, 'admin', 'password')
|
||||||
|
ptz = mycam.create_ptz_service()
|
||||||
|
# Can move to preset positions, control zoom
|
||||||
|
```
|
||||||
|
|
||||||
|
**Library Requirements:**
|
||||||
|
```bash
|
||||||
|
pip install opencv-python pyzbar onvif-zeep
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### 3. Reading QR Codes at Distance and in Motion
|
||||||
|
|
||||||
|
#### Key Challenges & Solutions
|
||||||
|
|
||||||
|
**Motion Blur:**
|
||||||
|
- Vehicles moving >35 km/h cause significant motion blur
|
||||||
|
- **Solutions:**
|
||||||
|
- Fast shutter speed: 1/1000s minimum for moving vehicles
|
||||||
|
- Higher frame rate cameras (30fps minimum, 60fps preferred)
|
||||||
|
- Use multiple frame capture and select sharpest image
|
||||||
|
|
||||||
|
**Distance Factors:**
|
||||||
|
- QR code size vs. distance calculation:
|
||||||
|
- Minimum: QR code should be at least 80-130 pixels wide in image
|
||||||
|
- Formula: Distance (feet) ≈ (MP × 10) / QR width in inches
|
||||||
|
- For 4MP camera reading 4" QR code: ~40 feet maximum
|
||||||
|
|
||||||
|
**Reading Angle:**
|
||||||
|
- Vertical angle: Maximum 30° from perpendicular
|
||||||
|
- Horizontal angle: Maximum 30° from perpendicular
|
||||||
|
- Tilt tolerance: +/- 5°
|
||||||
|
|
||||||
|
#### Recommended Approach for Moving Vehicles
|
||||||
|
1. **Trigger-based capture:** Use vehicle detection/loop sensors to trigger capture
|
||||||
|
2. **Burst mode:** Take 5-10 frames when vehicle is in sweet spot
|
||||||
|
3. **Select best frame:** Use image quality metrics (blur detection, contrast)
|
||||||
|
4. **Multi-library attempt:** Try pyzbar first, fallback to OpenCV WeChat
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### 4. Camera Hardware Specifications
|
||||||
|
|
||||||
|
#### Recommended Camera Specs for Weigh Scale
|
||||||
|
|
||||||
|
| Feature | Minimum | Recommended | Optimal |
|
||||||
|
|---------|---------|-------------|---------|
|
||||||
|
| Resolution | 2MP (1920x1080) | 4MP (2560x1440) | 4K (8MP) |
|
||||||
|
| Frame Rate | 25fps | 30fps | 60fps |
|
||||||
|
| Shutter Speed | 1/500s | 1/1000s | 1/2000s |
|
||||||
|
| WDR | 120dB | 120dB+ | 140dB+ |
|
||||||
|
| IR Range | 20m | 30m | 50m |
|
||||||
|
| Lens | 4mm | 6-12mm varifocal | 6-12mm motor zoom |
|
||||||
|
| Protection | IP66 | IP67 | IP67+IK10 |
|
||||||
|
|
||||||
|
#### Sensor Size Considerations
|
||||||
|
- **1/2.8" or larger:** Better low-light performance for outdoor/industrial use
|
||||||
|
- **1/1.8":** Excellent for challenging lighting conditions
|
||||||
|
|
||||||
|
#### Lens Selection Formula
|
||||||
|
```
|
||||||
|
Focal Length (mm) = (Sensor Width × Distance) / Field of View Width
|
||||||
|
|
||||||
|
Example: For 4m wide lane at 6m distance with 1/3" sensor:
|
||||||
|
= (4.8mm × 6000mm) / 4000mm = 7.2mm focal length
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Recommended Camera Models
|
||||||
|
- **Hikvision:** DS-2CD2643G2-IZS (4MP, WDR, motor zoom)
|
||||||
|
- **Dahua:** IPC-HFW5442T-ASE (4MP, WDR, IR 50m)
|
||||||
|
- **Axis:** P1375 (Lightfinder, WDR, pole mount)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### 5. Lighting and Mounting Considerations
|
||||||
|
|
||||||
|
#### Mounting Position
|
||||||
|
|
||||||
|
**Height:**
|
||||||
|
- 2.5-3.5 meters above ground (8-12 feet)
|
||||||
|
- Higher mounting = larger detection zone but requires zoom lens
|
||||||
|
|
||||||
|
**Horizontal Distance:**
|
||||||
|
- 4-8 meters from capture point
|
||||||
|
- Rule: Distance ≈ 2 × mounting height
|
||||||
|
|
||||||
|
**Angles:**
|
||||||
|
- Vertical angle: Max 30° looking down
|
||||||
|
- Horizontal angle: Max 30° from vehicle path
|
||||||
|
- Avoid direct headlight glare into lens
|
||||||
|
|
||||||
|
**Position Options:**
|
||||||
|
1. **Side-mounted:** Camera perpendicular to vehicle side
|
||||||
|
2. **Overhead:** Camera looking down at windshield (less optimal for QR)
|
||||||
|
3. **Gantry-mounted:** Over the scale, perpendicular to direction of travel
|
||||||
|
|
||||||
|
#### Lighting Requirements
|
||||||
|
|
||||||
|
**Daytime:**
|
||||||
|
- Avoid direct sunlight into lens (causes glare)
|
||||||
|
- Position camera with sun behind it when possible
|
||||||
|
- Use lens hood/cover
|
||||||
|
|
||||||
|
**Nighttime/Infrared:**
|
||||||
|
- IR illuminators essential for 24/7 operation
|
||||||
|
- Built-in IR range must cover distance to vehicle
|
||||||
|
- External IR illuminators for longer distances (20-50m)
|
||||||
|
- IR wavelength: 850nm (visible red glow) or 940nm (covert)
|
||||||
|
|
||||||
|
**Shutter Speed Settings:**
|
||||||
|
- Stationary vehicles: 1/100 - 1/300
|
||||||
|
- Moving vehicles (30mph): 1/1000 - 1/1500
|
||||||
|
- High speed (70mph): 1/2500 - 1/3500
|
||||||
|
|
||||||
|
#### Environmental Protection
|
||||||
|
- **IP67:** Protected against dust and temporary water immersion
|
||||||
|
- **IK10:** Vandal-resistant housing
|
||||||
|
- **Operating temperature:** -30°C to +60°C for outdoor use
|
||||||
|
- **Heater/blower:** For cold climates to prevent condensation
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### Implementation Steps
|
||||||
|
|
||||||
|
#### Phase 1: Proof of Concept
|
||||||
|
1. Install camera with RTSP access
|
||||||
|
2. Implement basic QR detection with pyzbar
|
||||||
|
3. Test with stationary vehicles at various distances
|
||||||
|
4. Determine optimal capture zone
|
||||||
|
|
||||||
|
#### Phase 2: Optimization
|
||||||
|
1. Add motion trigger/sensor integration
|
||||||
|
2. Implement burst capture (5-10 frames)
|
||||||
|
3. Add frame selection algorithm (blur detection)
|
||||||
|
4. Test with slow-moving vehicles
|
||||||
|
|
||||||
|
#### Phase 3: Production
|
||||||
|
1. Weatherproof housing installation
|
||||||
|
2. IR lighting setup for night operation
|
||||||
|
3. Integration with weigh scale software
|
||||||
|
4. Database logging and reporting
|
||||||
|
|
||||||
|
#### Sample Python Implementation
|
||||||
|
```python
|
||||||
|
import cv2
|
||||||
|
import pyzbar.pyzbar as pyzbar
|
||||||
|
import numpy as np
|
||||||
|
|
||||||
|
class QRCodeReader:
|
||||||
|
def __init__(self, rtsp_url):
|
||||||
|
self.cap = cv2.VideoCapture(rtsp_url)
|
||||||
|
self.frame_buffer = []
|
||||||
|
|
||||||
|
def capture_burst(self, num_frames=5):
|
||||||
|
"""Capture multiple frames for selection"""
|
||||||
|
frames = []
|
||||||
|
for _ in range(num_frames):
|
||||||
|
ret, frame = self.cap.read()
|
||||||
|
if ret:
|
||||||
|
frames.append(frame)
|
||||||
|
return frames
|
||||||
|
|
||||||
|
def detect_blur(self, frame, threshold=100):
|
||||||
|
"""Detect image blur using Laplacian variance"""
|
||||||
|
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
|
||||||
|
return cv2.Laplacian(gray, cv2.CV_64F).var()
|
||||||
|
|
||||||
|
def decode_qr(self, frame):
|
||||||
|
"""Decode QR codes from frame"""
|
||||||
|
decoded = pyzbar.decode(frame)
|
||||||
|
results = []
|
||||||
|
for obj in decoded:
|
||||||
|
results.append({
|
||||||
|
'data': obj.data.decode('utf-8'),
|
||||||
|
'type': obj.type,
|
||||||
|
'rect': obj.rect
|
||||||
|
})
|
||||||
|
return results
|
||||||
|
|
||||||
|
def process_vehicle(self):
|
||||||
|
"""Main processing when vehicle detected"""
|
||||||
|
frames = self.capture_burst(10)
|
||||||
|
|
||||||
|
# Select sharpest frame
|
||||||
|
best_frame = max(frames, key=lambda f: self.detect_blur(f))
|
||||||
|
|
||||||
|
# Try primary decoder
|
||||||
|
results = self.decode_qr(best_frame)
|
||||||
|
|
||||||
|
# Fallback to OpenCV if needed
|
||||||
|
if not results:
|
||||||
|
qr_detector = cv2.QRCodeDetector()
|
||||||
|
retval, decoded_info, _ = qr_detector.detectAndDecode(best_frame)
|
||||||
|
if retval:
|
||||||
|
results = [{'data': decoded_info, 'type': 'QR-Code'}]
|
||||||
|
|
||||||
|
return results
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### Source Links
|
||||||
|
|
||||||
|
1. **QR Code Library Benchmarks:**
|
||||||
|
- <https://www.dynamsoft.com/codepool/qr-code-reading-benchmark-and-comparison.html>
|
||||||
|
- <https://boofcv.org/index.php?title=Performance:QrCode>
|
||||||
|
|
||||||
|
2. **Library Implementation Guides:**
|
||||||
|
- <https://learnopencv.com/barcode-and-qr-code-scanner-using-zbar-and-opencv/>
|
||||||
|
- <https://pyimagesearch.com/2018/05/21/an-opencv-barcode-and-qr-code-scanner-with-zbar/>
|
||||||
|
|
||||||
|
3. **YOLO QR Detection:**
|
||||||
|
- <https://www.dynamsoft.com/codepool/qr-code-detect-decode-yolo-opencv.html>
|
||||||
|
- <https://www.sciencedirect.com/science/article/pii/S0045790624003045>
|
||||||
|
|
||||||
|
4. **Weighbridge Systems:**
|
||||||
|
- <https://punitinstrument.com/a-complete-guide-to-unmanned-erp-integrated-automated-weighbridge-systems/>
|
||||||
|
- <https://endel.digital/weighbridge-software/>
|
||||||
|
|
||||||
|
5. **Camera Positioning (ANPR - applies to QR):**
|
||||||
|
- <https://platerecognizer.com/camera-setup-for-best-anpr/>
|
||||||
|
- <https://www.dipolnet.com/license_plate_recognition_lpr_systems_-_part_1_camera_positioning_bib318.htm>
|
||||||
|
|
||||||
|
6. **ONVIF Camera Control:**
|
||||||
|
- <https://github.com/RichardoMrMu/python-onvif>
|
||||||
|
- <https://www.onvif.org/specs/srv/ptz/ONVIF-PTZ-Service-Spec-v1712.pdf>
|
||||||
|
|
||||||
|
7. **Motion Blur Research:**
|
||||||
|
- <https://arxiv.org/html/2410.05497v1>
|
||||||
|
- <https://dl.acm.org/doi/10.1016/j.neucom.2022.04.041>
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
*Research compiled: 2026-02-24*
|
||||||
|
|||||||
Reference in New Issue
Block a user