Quick Start

Feature Extraction

PySIFT is a drop-in replacement for cv2.SIFT_create():

from pysift import PySIFT
import cv2

sift = PySIFT()
gray = cv2.imread("image.jpg", cv2.IMREAD_GRAYSCALE)

# Returns OpenCV-compatible KeyPoints + NumPy descriptors
keypoints, descriptors = sift.detectAndCompute(gray, None)

GPU-Resident Output

Keep descriptors in VRAM for zero-copy downstream consumption:

kp_gpu, desc_gpu = sift.detectAndCompute(gray, None, gpu_output=True)
# kp_gpu: CuPy (N, 4) -- [x, y, size, angle]
# desc_gpu: CuPy (N, 128) -- stays in VRAM

# Zero-copy to PyTorch via DLPack
import torch
torch_desc = torch.from_dlpack(desc_gpu)

Feature Matching

from pysift import PySIFT
import cv2
import numpy as np

sift = PySIFT(dsp=True)
img_a = cv2.imread("left.jpg", cv2.IMREAD_GRAYSCALE)
img_b = cv2.imread("right.jpg", cv2.IMREAD_GRAYSCALE)

kp_a, desc_a = sift.detectAndCompute(img_a, None)
kp_b, desc_b = sift.detectAndCompute(img_b, None)

bf = cv2.BFMatcher(cv2.NORM_L2)
matches = bf.knnMatch(desc_a, desc_b, k=2)
good = [m for m, n in matches if m.distance < 0.85 * n.distance]

# Estimate fundamental matrix
pts_a = np.float32([kp_a[m.queryIdx].pt for m in good])
pts_b = np.float32([kp_b[m.trainIdx].pt for m in good])
F, mask = cv2.findFundamentalMat(pts_a, pts_b, cv2.USAC_MAGSAC, 2.0, 0.9999, 10000)
inliers = mask.ravel().sum()
print(f"Matches: {len(good)}, Inliers: {inliers}")

Panoramic Stitching

from pysift import GPUPyStitch
import cv2

img1 = cv2.imread("left.jpg")
img2 = cv2.imread("right.jpg")

stitcher = GPUPyStitch()
panorama = stitcher.stitch(img1, img2)
cv2.imwrite("panorama.jpg", panorama)

CLI Stitching

# Basic
pysift-stitch left.jpg right.jpg

# 3-image panorama
pysift-stitch left.jpg center.jpg right.jpg -o results/

# Learned pipeline
pysift-stitch left.jpg right.jpg --descriptor hardnet --matcher lightglue

Configuration Presets

Preset

Orientation

Descriptor

Matcher

Use Case

Classic

histogram

sift

ratio

Fastest. Full Lowe 2004 pipeline.

Modern

histogram

sift

lightglue

Best accuracy with proven detection.

Learned

orinet

hardnet

lightglue

Fully modern pipeline.

Mobile

histogram

sift

ratio

Large phone images (auto-resize + denoise).