Skip to content
Back to skills

Opencv Computer Vision

ASecurity

Implement production-grade computer vision pipelines using OpenCV (C++ and Python) with CUDA acceleration. Triggers when processing real-time multi-threaded RTSP camera streams, zero-copy memory transfers, image pre-processing, contour analysis, optical flow tracking, feature detection/matching (ORB, SIFT), camera calibration, or 3D spatial pose estimation (PnP).

  • 8 stars
  • 0 votes
  • 0 copies
  • 0 views
  • Added September 29, 2026
ai-agentspythongoc++angularperformance

Security analysis

A100/100

Scanned September 29, 2026

npx -y skills add hamzabellouch/agent-skills --skill opencv-computer-vision --agent claude-code

Installs into .claude/skills of the current project.

Are you the author of Opencv Computer Vision?

Add the live security badge to your README. It updates with every re-scan.

Security grade badge for Opencv Computer Vision
[![Security: A — Skills Directory](https://www.skillsdirectory.com/api/skills/hamzabellouch-opencv-computer-vision/badge)](https://www.skillsdirectory.com/skills/hamzabellouch-opencv-computer-vision)

More formats (shields.io, HTML) on the badges page. Keep it an A: scan every change in CI with Pro.

Download with Pro
SKILL.md
---
name: opencv-computer-vision
metadata:
  category: Computer Vision and Spatial AI
description: >-
  Implement production-grade computer vision pipelines using OpenCV (C++ and Python) with CUDA acceleration.
  Triggers when processing real-time multi-threaded RTSP camera streams, zero-copy memory transfers, image pre-processing,
  contour analysis, optical flow tracking, feature detection/matching (ORB, SIFT), camera calibration, or 3D spatial pose estimation (PnP).
compatibility: OpenCV (>= 4.8.0 with CUDA support), Python (>= 3.9) / C++17, NumPy, CUDA (>= 11.8)
---

# OpenCV Computer Vision & Spatial AI

Production implementations for GPU-accelerated image processing, multi-threaded RTSP video streaming, feature tracking, camera calibration, and 3D spatial position estimation.

---

## 1. Computer Vision Architecture

```text
+-------------------+      +--------------------------------+      +---------------------------+
| RTSP IP Camera    | ---> | Multi-Threaded VideoReader     | ---> | CUDA GpuMat Memory Transfer|
| (1080p @ 60 FPS)  |      | (Thread-safe Queue Buffer)     |      | (Zero CPU-GPU copy bottleneck)|
+-------------------+      +--------------------------------+      +---------------------------+
                                                                                 |
                                                                                 v
+-------------------+      +--------------------------------+      +---------------------------+
| Spatial 3D Pose   | <--- | Feature Detection & PnP        | <--- | GPU Pre-processing        |
| (X, Y, Z, R, P, Y)|      | (SolvePnP / ArUco Marker)      |      | (Threshold, Blur, Contours)|
+-------------------+      +--------------------------------+      +---------------------------+
```

---

## 2. Multi-Threaded RTSP Stream Reader (`rtsp_reader.py`)

A non-blocking, thread-safe RTSP video ingest pipeline with automatic reconnect logic to prevent frame dropping.

```python
import cv2
import threading
import queue
import time
import logging

logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)

class RobustVideoSubscriber:
    def __init__(self, rtsp_url: str, max_queue_size: int = 5):
        self.rtsp_url = rtsp_url
        self.frame_queue = queue.Queue(maxsize=max_queue_size)
        self.stopped = False
        self.cap = None
        self.thread = threading.Thread(target=self._update, daemon=True)

    def start(self):
        self._connect()
        self.thread.start()
        return self

    def _connect(self):
        logger.info(f"Connecting to RTSP stream: {self.rtsp_url}")
        self.cap = cv2.VideoCapture(self.rtsp_url, cv2.CAP_FFMPEG)
        self.cap.set(cv2.CAP_PROP_BUFFERSIZE, 1) # Force minimal buffering latency

    def _update(self):
        while not self.stopped:
            if not self.cap or not self.cap.isOpened():
                logger.warning("Stream disconnected. Attempting reconnect...")
                time.sleep(2.0)
                self._connect()
                continue

            grabbed, frame = self.cap.read()
            if not grabbed:
                logger.warning("Failed to grab frame. Reconnecting...")
                self.cap.release()
                time.sleep(1.0)
                self._connect()
                continue

            # Drop oldest frame if queue is full to enforce real-time processing
            if self.frame_queue.full():
                try:
                    self.frame_queue.get_nowait()
                except queue.Empty:
                    pass

            self.frame_queue.put(frame)

    def read(self):
        """Fetch latest frame non-blocking."""
        try:
            return True, self.frame_queue.get(timeout=1.0)
        except queue.Empty:
            return False, None

    def stop(self):
        self.stopped = True
        if self.thread.is_alive():
            self.thread.join()
        if self.cap:
            self.cap.release()
        logger.info("RTSP subscriber stopped.")
```

---

## 3. CUDA GPU-Accelerated Image Pre-Processing (`gpu_pipeline.py`)

Use OpenCV's `cuda::GpuMat` interface to perform image filtering and thresholding on NVIDIA GPUs.

```python
import cv2
import numpy as np

def process_frame_cuda(cpu_frame: np.ndarray) -> np.ndarray:
    """Uploads frame to GPU, performs processing, and downloads result."""
    # 1. Upload CPU NumPy Mat to GPU GpuMat
    gpu_frame = cv2.cuda_GpuMat()
    gpu_frame.upload(cpu_frame)

    # 2. BGR to Grayscale on GPU
    gpu_gray = cv2.cuda.cvtColor(gpu_frame, cv2.COLOR_BGR2GRAY)

    # 3. Gaussian Blur on GPU
    gpu_filter = cv2.cuda.createGaussianFilter(cv2.CV_8UC1, cv2.CV_8UC1, (5, 5), 1.5)
    gpu_blurred = gpu_filter.apply(gpu_gray)

    # 4. Binary Thresholding on GPU
    _, gpu_thresh = cv2.cuda.threshold(gpu_blurred, 127, 255, cv2.THRESH_BINARY)

    # 5. Download result back to CPU memory
    output_frame = gpu_thresh.download()
    return output_frame
```

---

## 4. 3D Spatial Pose Estimation with SolvePnP (`spatial_pose.py`)

Compute the 3D position and orientation $(X, Y, Z)$ of a physical object relative to the camera lens.

```python
import cv2
import numpy as np

class SpatialPoseEstimator:
    def __init__(self, camera_matrix: np.ndarray, dist_coeffs: np.ndarray):
        self.camera_matrix = camera_matrix
        self.dist_coeffs = dist_coeffs

        # Define 3D model points of a rectangular object in physical world space (in millimeters)
        self.model_3d_points = np.array([
            [-50.0, -25.0, 0.0],  # Top-left
            [ 50.0, -25.0, 0.0],  # Top-right
            [ 50.0,  25.0, 0.0],  # Bottom-right
            [-50.0,  25.0, 0.0]   # Bottom-left
        ], dtype=np.float32)

    def estimate_pose(self, image_2d_points: np.ndarray):
        """
        Calculates Rotation vector (rvec) and Translation vector (tvec).
        image_2d_points: Array of 4 detected corner pixels [[x1, y1], [x2, y2], ...]
        """
        success, rvec, tvec = cv2.solvePnP(
            self.model_3d_points,
            image_2d_points.astype(np.float32),
            self.camera_matrix,
            self.dist_coeffs,
            flags=cv2.SOLVEPNP_ITERATIVE
        )

        if not success:
            return None

        # Convert rotation vector to 3x3 rotation matrix
        rmat, _ = cv2.Rodrigues(rvec)

        # Distance from camera lens in millimeters
        distance_mm = np.linalg.norm(tvec)

        return {
            "x_mm": float(tvec[0][0]),
            "y_mm": float(tvec[1][0]),
            "z_mm": float(tvec[2][0]),
            "distance_mm": float(distance_mm),
            "rotation_matrix": rmat
        }
```

---

## 5. Feature Detection & Optical Flow Object Tracking (`feature_tracking.py`)

```python
import cv2
import numpy as np

class LucasKanadeTracker:
    def __init__(self):
        # Parameters for ShiTomasi corner detection
        self.feature_params = dict(
            maxCorners=100,
            qualityLevel=0.3,
            minDistance=7,
            blockSize=7
        )
        # Parameters for Lucas-Kanade optical flow
        self.lk_params = dict(
            winSize=(15, 15),
            maxLevel=2,
            criteria=(cv2.TERMCRITERIA_EPS | cv2.TERMCRITERIA_COUNT, 10, 0.03)
        )
        self.old_gray = None
        self.p0 = None

    def track(self, frame: np.ndarray):
        frame_gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)

        if self.old_gray is None or self.p0 is None or len(self.p0) < 10:
            # Initialize keypoints to track
            self.p0 = cv2.goodFeaturesToTrack(frame_gray, mask=None, **self.feature_params)
            self.old_gray = frame_gray.copy()
            return frame

        # Calculate Optical Flow
        p1, st, err = cv2.calcOpticalFlowPyrLK(self.old_gray, frame_gray, self.p0, None, **self.lk_params)

        # Select good points
        if p1 is not None:
            good_new = p1[st == 1]
            good_old = self.p0[st == 1]

            # Draw vectors
            for new, old in zip(good_new, good_old):
                a, b = new.ravel()
                c, d = old.ravel()
                frame = cv2.line(frame, (int(a), int(b)), (int(c), int(d)), (0, 255, 0), 2)
                frame = cv2.circle(frame, (int(a), int(b)), 4, (0, 0, 255), -1)

            self.old_gray = frame_gray.copy()
            self.p0 = good_new.reshape(-1, 1, 2)

        return frame
```

---

## 6. Performance Benchmarks & Optimization

1. **Avoid Frequent CPU-GPU Transfers**: Maintain processing in `cuda::GpuMat` memory across sequential operations; convert back to CPU `np.ndarray` only when displaying or storing frames.
2. **Pre-allocated Output Buffers**: Pass existing arrays as output parameters (`cv2.cvtColor(src, code, dst=existing_mat)`) inside high-frequency loops to prevent memory re-allocations.
3. **Camera Matrix Calibration**: Always calibrate camera intrinsics using `cv2.calibrateCamera` with chessboard patterns prior to 3D spatial pose estimation tasks.

Attribution

Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.

Comments

Loading comments…