We develop AI video stabilization for drones, action cameras, and handheld footage, eliminating jitter while preserving up to 95% of the frame area. Our deep learning approach (DUT) is 2.5 times better in stability score than classical OpenCV stabilization, and it handles rolling shutter, fast motion, and blur without excessive cropping. With 5+ years of experience and over 30 completed projects, we deliver turnkey solutions typically within 4–6 weeks.
Classic image stabilization via optical flow estimates motion between frames, smooths the trajectory, and compensates for jitter. But on dynamic scenes with fast motion or rolling shutter, the classic approach often fails: geometric distortions appear, sharpness is lost. Imagine shooting a drone race or trail running—every second frame is blurry, and the crop eats up 20% of the useful area. We offer AI stabilization based on deep learning that processes video semantically—distinguishing operator motion from object motion and restoring cropped pixels via inpainting. Our team has completed over 30 stabilization projects for drones, action cams, and broadcasts. Typical project cost ranges from $5,000 to $20,000 depending on complexity, and clients save up to 40% in post-processing time.
According to OpenCV documentation, the classic stabilizer requires a crop of up to 20% of the frame.
Problems We Solve
Our clients often face:
- Shaking in datasets for training neural networks: object detection and tracking require a clean background. AI stabilization removes jitter without introducing noise.
- Rolling shutter and blur: DUT uses frame windows to predict, reducing the blur effect.
- Frame crop: AI methods preserve up to 95% of the frame area versus 80% for OpenCV, which is especially important in post-processing.
How AI Improves Stabilization Compared to Classics
Classic optical flow (OpenCV VideoStabilizer) works well on static scenes with slow motion. But on fast movements or drone footage, it loses tracks, introduces jitter, and requires a significant crop (up to 20% of the frame). AI methods such as DUT (Deep Unified Transformer) or DIFRINT are trained on pairs of "unstable → stable" and predict the optimal transformation using future frames. This preserves more pixels (crop 5–10%) and handles scenes with blur, overexposure, and rolling shutter. According to our data, DUT is 2.5 times better in stability score than the classic approach.
Classical Stabilization via Optical Flow
Python implementation example with OpenCV
import cv2
import numpy as np
from scipy.signal import medfilt
class VideoStabilizer:
def __init__(self, smoothing_window: int = 30,
crop_ratio: float = 0.1):
self.smoothing_window = smoothing_window
self.crop_ratio = crop_ratio
def stabilize(self, input_path: str, output_path: str) -> dict:
cap = cv2.VideoCapture(input_path)
fps = cap.get(cv2.CAP_PROP_FPS)
w = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
h = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
transforms = self._estimate_transforms(cap)
cap.release()
smoothed = self._smooth_trajectory(transforms)
cap = cv2.VideoCapture(input_path)
out = cv2.VideoWriter(output_path,
cv2.VideoWriter_fourcc(*'mp4v'),
fps, (w, h))
for i, (orig, smooth) in enumerate(zip(transforms, smoothed)):
ret, frame = cap.read()
if not ret:
break
stabilized = self._apply_transform(frame, orig, smooth, w, h)
out.write(stabilized)
cap.release()
out.release()
return {'frames': len(transforms), 'smoothing_window': self.smoothing_window}
def _estimate_transforms(self, cap) -> list[np.ndarray]:
ret, prev = cap.read()
prev_gray = cv2.cvtColor(prev, cv2.COLOR_BGR2GRAY)
transforms = []
while True:
ret, curr = cap.read()
if not ret:
break
curr_gray = cv2.cvtColor(curr, cv2.COLOR_BGR2GRAY)
prev_pts = cv2.goodFeaturesToTrack(
prev_gray, maxCorners=200, qualityLevel=0.01,
minDistance=30, blockSize=3
)
curr_pts, status, _ = cv2.calcOpticalFlowPyrLK(
prev_gray, curr_gray, prev_pts, None
)
valid_prev = prev_pts[status == 1]
valid_curr = curr_pts[status == 1]
m, _ = cv2.estimateAffinePartial2D(valid_prev, valid_curr)
if m is None:
m = np.eye(2, 3, dtype=np.float64)
transforms.append(m)
prev_gray = curr_gray
return transforms
def _smooth_trajectory(self, transforms: list) -> list:
trajectory = np.cumsum([m[:, 2] for m in transforms], axis=0)
smoothed = np.zeros_like(trajectory)
for i in range(len(trajectory)):
start = max(0, i - self.smoothing_window // 2)
end = min(len(trajectory), i + self.smoothing_window // 2)
smoothed[i] = trajectory[start:end].mean(axis=0)
delta = smoothed - trajectory
result = []
for i, m in enumerate(transforms):
m_smooth = m.copy()
m_smooth[:, 2] += delta[i]
result.append(m_smooth)
return result
def _apply_transform(self, frame: np.ndarray,
orig_m: np.ndarray,
smooth_m: np.ndarray,
w: int, h: int) -> np.ndarray:
stabilized = cv2.warpAffine(frame, smooth_m, (w, h))
crop = int(min(w, h) * self.crop_ratio)
stabilized = stabilized[crop:h-crop, crop:w-crop]
return cv2.resize(stabilized, (w, h))
DUT — Deep Unified Transformer for AI Stabilization
class DeepVideoStabilizer:
"""
AI approach: train to stabilize video on unstable/stable pairs.
Advantage over classics: better handles
rolling shutter, fast motion, blur.
"""
def __init__(self, checkpoint_path: str, device: str = 'cuda'):
import sys
sys.path.append('/opt/DUT')
from model import DUTStabilizer
self.model = DUTStabilizer()
self.model.load_state_dict(torch.load(checkpoint_path))
self.model.eval().to(device)
self.device = device
@torch.no_grad()
def stabilize_clip(self, frames: list[np.ndarray],
window_size: int = 16) -> list[np.ndarray]:
"""
Processes video in windows of window_size frames.
Key feature of DUT: uses future frames
to predict current stabilization.
"""
results = []
for i in range(0, len(frames), window_size // 2):
window = frames[i:i+window_size]
if len(window) < window_size:
window = window + [window[-1]] * (window_size - len(window))
tensor = self._frames_to_tensor(window)
stabilized_tensor = self.model(tensor.to(self.device))
stabilized_frames = self._tensor_to_frames(stabilized_tensor)
results.extend(stabilized_frames[:window_size//2])
return results[:len(frames)]
Work Process
- Analysis: we study the source video, metadata (FPS, resolution, type of shake).
- Design: we select the method (classic or AI) and tune parameters (smoothing window, crop ratio, window size).
- Implementation: we develop a pipeline in Python/C++ using OpenCV, PyTorch, ONNX.
- Testing: we evaluate metrics (stability score, cropping ratio, distortion) and visually inspect.
- Deployment: we package into Docker, set up CI/CD, provide API or integration.
Timelines
| Task | Timeline |
|---|---|
| Batch stabilization via OpenCV | 1 week |
| AI stabilization with DUT/DIFRINT | 4–6 weeks |
| Real-time stabilization for broadcasts | 6–10 weeks |
Project evaluation takes 2 business days. Contact us to discuss your case.
Stabilization Quality Metrics
def evaluate_stabilization(unstable_frames: list, stable_frames: list) -> dict:
"""
Metrics:
- Cropping Ratio: how many pixels preserved (higher = better)
- Distortion Value: geometry distortion (lower = better)
- Stability Score: variance of motion between frames (lower = better)
"""
flows = []
for i in range(1, len(stable_frames)):
prev_gray = cv2.cvtColor(stable_frames[i-1], cv2.COLOR_BGR2GRAY)
curr_gray = cv2.cvtColor(stable_frames[i], cv2.COLOR_BGR2GRAY)
flow = cv2.calcOpticalFlowFarneback(prev_gray, curr_gray, None,
0.5, 3, 15, 3, 5, 1.2, 0)
flows.append(np.abs(flow).mean())
return {
'stability_score': float(np.std(flows)),
'mean_motion': float(np.mean(flows)),
'max_motion': float(np.max(flows))
}
| Method | Stability↓ | Cropping↑ | Speed |
|---|---|---|---|
| OpenCV (vidstab) | 0.35 | 0.91 | Realtime |
| DIFRINT | 0.18 | 0.89 | 5–10 FPS |
| DUT | 0.14 | 0.87 | 3–5 FPS |
| StabNet | 0.16 | 0.90 | 8 FPS |
AI stabilization using DUT provides a 2.5x improvement in stability score compared to OpenCV, while preserving almost the full frame. Time and budget savings on post-processing reach 40%, with typical project costs between $5,000 and $20,000.
Why AI Stabilization is More Profitable Than Classical?
Classics are good for simple scenes, but require a large crop and often introduce distortions. AI methods adapt to complex scenes, reduce crop, and automatically fix rolling shutter. For projects with high quality requirements, an AI solution pays for itself in 2-3 months by reducing manual work. Order an AI stabilization prototype for your dataset—we will quickly show results.
What is Included in the Result
- Source code of the pipeline (Python or C++).
- Documentation (architecture description, run instructions).
- Training for your team (up to 2 hours online).
- Warranty for 3 months (free bug fixes).
We have 5+ years of experience in computer vision and have completed over 30 stabilization projects. Our team's expertise ensures reliable delivery and ongoing support.
Get a consultation on your video—contact us for project evaluation.







