Recommended Free Tools
OpenCV is a computer-vision library, not one function. In Python, you normally import it as cv2 and combine functions from modules such as image codecs, image processing, video I/O, calibration, feature detection and deep-neural-network inference. This guide focuses on the functions you are most likely to use, what each returns, the input it expects and the mistakes that commonly cause failures.
The examples target the OpenCV 4.x Python API documented at docs.opencv.org/4.13.0. OpenCV 5 changes parts of the module organization, so verify names and availability against the version installed on your machine.
Install the right OpenCV package
Install exactly one OpenCV wheel variant in an environment. All of these packages provide the same cv2 namespace, and installing multiple variants can cause conflicts.
python -m pip install opencv-python— the usual desktop package.python -m pip install opencv-contrib-python— adds modules maintained in the contrib repository.python -m pip install opencv-python-headless— for servers, Docker and notebooks without desktop GUI libraries.python -m pip install opencv-contrib-python-headless— contrib modules without GUI dependencies.
The package maintainer documents wheel differences and conflicts in the opencv-python README. Verify the build with:
What’s actually slowing this PC down?
Pick the symptom - the matching free tool is one click away.
#1 Best Overall
- Spacious Design: Measuring 21.1" wide and 14.1" deep, our lap desk comfortably fits most laptops up to 15.6". Extra room for accessories ensures convenience.
- Enhanced Functionality: Packed with handy features, including a 5x9" precision tracking mouse pad and a built-in phone slot for seamless work or video calls. Plus, enjoy ergonomic support with the integrated cushioned wrist rest.
- Cool Comfort: Enjoy a stable surface with our lap desk's dual bolster cushion, designed for comfort and airflow, keeping your lap cool during extended use.
- Durable Surface: Work with confidence on our lap desk's solid surface, featuring a sleek black carbon color, ensuring optimal air circulation to prevent your laptop from overheating.
- On-the-Go Convenience: With an integrated handle and lightweight design (2.8 lbs), our lap desk is portable for travel or moving around the house, offering flexibility in any space.
python -c "import cv2; print(cv2.__version__)"
A function shown in the general documentation may be unavailable in a particular wheel, operating-system build or contrib configuration. Installing a wheel also does not imply CUDA support.
Understand OpenCV images before calling functions
Python bindings expose images as NumPy arrays. A grayscale image normally has shape (height, width); a color image has (height, width, channels). OpenCV conventionally stores color channels as BGR, not RGB. Inspect both shape and data type:
import cv2
image = cv2.imread('input.jpg')
print(image.shape)
print(image.dtype)
Many errors come from passing a three-channel BGR image to a function that expects one channel, using floating-point data where 8-bit data is expected, or supplying a mask with the wrong dimensions. The Python and NumPy conventions are introduced in the Python introduction.
Always test the result of imread
image = cv2.imread('input.jpg')
if image is None:
raise FileNotFoundError('Could not read input.jpg')
imread can return an empty result instead of raising an exception when the path is wrong, the file is unreadable, permissions prevent access, the format is unsupported or the file is malformed.
The Tool Desk
Outbyte Driver Updater FREEFix the driver behind crashes, sound loss and screen glitchesFind Drivers →Outbyte PC Repair FREERepair Windows errors before they cause bigger problemsFix Now →Read, save and display images
cv2.imread
Read an image from disk. Common flags are IMREAD_COLOR, IMREAD_GRAYSCALE and IMREAD_UNCHANGED:
color = cv2.imread('input.jpg', cv2.IMREAD_COLOR)
gray = cv2.imread('input.jpg', cv2.IMREAD_GRAYSCALE)
unchanged = cv2.imread('input.png', cv2.IMREAD_UNCHANGED)
The image-codec reference is imgcodecs.
cv2.imwrite
if not cv2.imwrite('output.jpg', image):
raise IOError('Image could not be written')
The filename extension normally selects the encoder. JPEG and PNG compression parameters can be supplied when required. Check the Boolean return value instead of assuming a write succeeded.
cv2.imshow, waitKey and destroyAllWindows
cv2.imshow('Preview', image)
cv2.waitKey(0)
cv2.destroyAllWindows()
These HighGUI calls require a working desktop display. They often fail in Docker, CI, remote servers and some notebook environments; write a file or use notebook/web display utilities there. See the HighGUI reference.
Resize and convert color
cv2.resize
small = cv2.resize(image, (640, 480))
width = 640
scale = width / image.shape[1]
height = int(image.shape[0] * scale)
resized = cv2.resize(image, (width, height))
The tuple is (width, height), while array indexing is [row, column]. For reduction, INTER_AREA is often a sensible starting point; for enlargement, INTER_CUBIC is one available choice:
Rank #2
- 5-in-1 Connectivity: Equipped with a 4K HDMI port, a 5 Gbps USB-C data port, two 5 Gbps USB-A ports, and a USB C 100W PD-IN port. Note: The USB C 100W PD-IN port supports only charging and does not support data transfer devices such as headphones or speakers.
- Powerful Pass-Through Charging: Supports up to 85W pass-through charging so you can power up your laptop while you use the hub. Note: Pass-through charging requires a charger (not included). Note: To achieve full power for iPad, we recommend using a 45W wall charger.
- Transfer Files in Seconds: Move files to and from your laptop at speeds of up to 5 Gbps via the USB-C and USB-A data ports. Note: The USB C 5Gbps Data port does not support video output.
- HD Display: Connect to the HDMI port to stream or mirror content to an external monitor in resolutions of up to 4K@30Hz. Note: The USB-C ports do not support video output.
- What You Get: Anker 332 USB-C Hub (5-in-1), welcome guide, our worry-free 18-month warranty, and friendly customer service.
smaller = cv2.resize(image, None, fx=0.5, fy=0.5,
interpolation=cv2.INTER_AREA)
larger = cv2.resize(image, None, fx=2, fy=2,
interpolation=cv2.INTER_CUBIC)
Interpolation affects detail and artifacts; no interpolation is universally best. Geometric-transform details are in imgproc transform.
cv2.cvtColor
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
rgb = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
hsv = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)
Use HSV when separating hue from brightness can simplify segmentation, but thresholds still depend on lighting and the camera. Matplotlib expects RGB, so convert BGR before plotting. Other useful conversions include GRAY2BGR and BGRA2BGR. See color-conversion functions.
Arithmetic, channels and masks
OpenCV arithmetic has saturating behavior for typical unsigned images, unlike NumPy addition, which can wrap values:
added = cv2.add(image_a, image_b)
subtracted = cv2.subtract(image_a, image_b)
blend = cv2.addWeighted(image_a, 0.7, image_b, 0.3, 0)
A mask is generally a single-channel 8-bit array in which nonzero pixels select output pixels. Related operations are bitwise_or, bitwise_not, split and merge:
Free tools Windows power users keep installed
One-click scans. No signup required.
b, g, r = cv2.split(image)
merged = cv2.merge([b, g, r])
blue = image[:, :, 0]
Simple NumPy slicing is often clearer for channel access. The full core-array reference is core array operations.
Draw annotations and shapes
cv2.line(image, (10, 10), (200, 100), (0, 255, 0), 2)
cv2.rectangle(image, (50, 50), (200, 150), (255, 0, 0), 2)
cv2.circle(image, (320, 240), 50, (0, 0, 255), -1)
cv2.putText(image, 'Object', (50, 50),
cv2.FONT_HERSHEY_SIMPLEX, 1, (255, 255, 255), 2)
Coordinates are (x, y), colors are BGR, and a negative thickness usually fills a shape. Text placement uses the baseline rather than a top-left corner. Also useful are polylines, fillPoly, ellipse, arrowedLine and getTextSize. See drawing functions.
Blur and filter images
Choose a filter
| Function | Typical use | Trade-off |
|---|---|---|
cv2.blur |
Simple normalized box smoothing | Can soften edges and fine detail |
cv2.GaussianBlur |
General smoothing before edge detection | Removes high-frequency detail |
cv2.medianBlur |
Salt-and-pepper noise | Can erase small features |
cv2.bilateralFilter |
Smoothing with some edge preservation | More computationally expensive |
cv2.filter2D |
Custom convolution kernel | Kernel design determines the result |
blurred = cv2.blur(image, (5, 5))
smoothed = cv2.GaussianBlur(image, (5, 5), 0)
cleaned = cv2.medianBlur(image, 5)
preserved = cv2.bilateralFilter(image, 9, 75, 75)
Gaussian and median kernel sizes are normally positive odd numbers. Filtering is not automatically enhancement: excessive smoothing removes information. See filter reference.
Threshold, segment and clean masks
threshold, Otsu and adaptiveThreshold
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
_, binary = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY)
_, otsu = cv2.threshold(gray, 0, 255,
cv2.THRESH_BINARY + cv2.THRESH_OTSU)
adaptive = cv2.adaptiveThreshold(
gray, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C,
cv2.THRESH_BINARY, 11, 2)
threshold returns the threshold actually used and the output image; keep both return values. Otsu works best when the histogram is reasonably bimodal. Adaptive thresholding handles spatially varying illumination; its block size must be odd and greater than one.
Quick wins for a faster PC:
Clear out junk files and repair common Windows errorsFree Scan →Fix the driver behind crashes, sound loss and screen glitchesFind Drivers →Rank #3
- Note: Not suitable for MacBooks released after 2023 or devices with a protruding front camera; Not applicable to full-screen or notch-style tempered glass screen protectors; Do not use on the rear camera of the phone.
- 💻 Why Do You Need a Webcam Cover Slide? — Safeguard your privacy by covering your webcam with our reliable webcam cover when not in use. Don't let anyone secretly watch you. Stay protected!
- ✅ Thin & Stylish — Enhance your laptop's functionality and aesthetics with our 0.027" ultra-thin webcam covers. Seamlessly close your laptop while adding a touch of sophistication.
- ✅ Fits Most Devices — Compatible with laptops, phones, tablets, desktops! Keep your privacy intact on Ap/ple, Mac/Book, iPh/one, iP/ad, H/P, L/novo, De/ll, Ac/er, As/us, Sa/msung devices.
- ✅ 365 Days Protection — Our upgraded 3.0 adhesive ensures a strong hold that won't damage your equipment. Experience reliable, long-term privacy protection day in and day out.
inRange for color masks
hsv = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)
lower = (35, 50, 50)
upper = (85, 255, 255)
mask = cv2.inRange(hsv, lower, upper)
These values are starting points, not universal settings. The thresholding reference is imgproc miscellaneous functions.
Morphological operations
kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (5, 5))
eroded = cv2.erode(mask, kernel, iterations=1)
dilated = cv2.dilate(mask, kernel, iterations=1)
opened = cv2.morphologyEx(mask, cv2.MORPH_OPEN, kernel)
closed = cv2.morphologyEx(mask, cv2.MORPH_CLOSE, kernel)
Opening removes small isolated foreground regions; closing fills small holes and joins nearby regions. Larger kernels or more iterations can erase small objects or merge objects that should remain separate. Other operations include gradient, top-hat and black-hat. See morphological operations.
Detect edges and analyze contours
cv2.Canny
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
gray = cv2.GaussianBlur(gray, (5, 5), 0)
edges = cv2.Canny(gray, 50, 150)
The two thresholds control sensitivity and must be tuned for the camera, lighting, resolution and materials. See the Canny tutorial.
findContours and contour measurements
contours, hierarchy = cv2.findContours(
binary, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
for contour in contours:
area = cv2.contourArea(contour)
perimeter = cv2.arcLength(contour, True)
x, y, w, h = cv2.boundingRect(contour)
box = cv2.minAreaRect(contour)
approx = cv2.approxPolyDP(contour, 0.02 * perimeter, True)
Contours usually require a clean binary mask rather than an arbitrary color image. Other useful functions are drawContours, moments, convexHull, isContourConvex, fitEllipse and minEnclosingCircle.
Guard centroid calculations against zero area:
moments = cv2.moments(contour)
if moments['m00'] != 0:
cx = int(moments['m10'] / moments['m00'])
cy = int(moments['m01'] / moments['m00'])
Shape-analysis details are in structural analysis.
Rotate, warp and correct perspective
matrix = cv2.getRotationMatrix2D(center, angle, scale)
rotated = cv2.warpAffine(image, matrix, (width, height))
matrix = cv2.getPerspectiveTransform(source_points, destination_points)
warped = cv2.warpPerspective(image, matrix, (output_width, output_height))
Affine transforms use corresponding points and an output size. Perspective correction needs four corresponding corner points. Rotation can crop content unless you enlarge the output canvas. Interpolation and border mode affect the result. Related APIs include getAffineTransform, remap and getOptimalNewCameraMatrix. See geometric transformations.
Measure histograms and improve contrast
histogram = cv2.calcHist([gray], [0], None, [256], [0, 256])
equalized = cv2.equalizeHist(gray)
clahe = cv2.createCLAHE(clipLimit=2.0, tileGridSize=(8, 8))
enhanced = clahe.apply(gray)
equalizeHist is for grayscale images. CLAHE works locally and limits contrast amplification, but either method can amplify noise and cannot recover detail that was never captured. References: histogram functions and the CLAHE tutorial.
Process cameras and video
VideoCapture and the frame loop
cap = cv2.VideoCapture(0)
if not cap.isOpened():
raise RuntimeError('Could not open camera or video')
while True:
ok, frame = cap.read()
if not ok:
break
cv2.imshow('Video', frame)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
cap.release()
cv2.destroyAllWindows()
Use a filename instead of 0 for a video file. Camera properties are requests, not guarantees; drivers and backends may ignore unsupported width, height or frame-rate settings:
print(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
print(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
print(cap.get(cv2.CAP_PROP_FPS))
Try another camera index, lower resolution, a different backend or released applications when opening succeeds but reads fail. See VideoCapture and the video-I/O overview.
Rank #4
- Anti-Slip Surface - Transform your laptop into a mobile workstation with the AboveTEK portable laptop lap desk. The anti-slip surface provides a strong grip for laptops up to 15.6 inches(Diagonal), while the double rubber strip on the bottom ensures a stable display or typing experience on your lap, couch, or bed.
- Retractable Mouse Pad - Retractable laptop mouse pad extends on both directions for the left/right handed with elevation along the edges for stopping mouse from falling off. The size of laptop tray is 14" X 9.7" and the size of mouse pad is 7.4" X 6.1".
- Effective Heat Shield - The effective heat shield made of sturdy and thick material protects your laptop from overheating. Prioritizes your comfort and safety, an ideal lap pad or board for working anywhere.
- EASY to Carry and Store - With an ergonomic and simplistic design, the lap desk is portable to store in a backpack. Only 15" in size, 2.2 lb of weight and with slim 0.6 inch thickness, it is ready to be easily carried around.
- Widely Applicable - The smooth platform accommodates laptops and tablets up to 15.6 inches(Diagonal), making it a versatile accessory and one of the best gifts for mom, dad, students and professionals. Perfect for use as a laptop bed tray or tablet holder anywhere at home, library, or park.
VideoWriter
fourcc = cv2.VideoWriter_fourcc(*'mp4v')
writer = cv2.VideoWriter('output.mp4', fourcc, 30.0, (width, height))
if not writer.isOpened():
raise RuntimeError('Video writer could not be opened')
writer.write(frame)
writer.release()
Frame dimensions must exactly match the writer dimensions. Codec and container support depends on platform backends and installed codecs, so a valid-looking writer does not guarantee a playable file. Always call release. See VideoWriter.
Features, descriptors and matching
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
orb = cv2.ORB_create()
keypoints, descriptors = orb.detectAndCompute(gray, None)
matcher = cv2.BFMatcher(cv2.NORM_HAMMING, crossCheck=True)
matches = matcher.match(descriptors_a, descriptors_b)
ORB uses binary descriptors and is often chosen for speed. SIFT_create is another option that is generally more tolerant of scale and rotation, with different performance and deployment considerations. Other APIs include BFMatcher, FlannBasedMatcher, drawKeypoints and drawMatches. Matching local features is not semantic object detection and can fail with viewpoint changes, blur, occlusion or repetitive textures. See features2d.
Calibrate cameras and estimate 3D geometry
Calibration is a dataset-and-validation process, not a single call. A typical workflow is:
- Capture many views of a target with known geometry, such as a chessboard.
- Detect corners with
findChessboardCornersand refine them withcornerSubPix. - Build corresponding 3D object points and 2D image points.
- Call
calibrateCamera, then validate on images not used for calibration.
Important APIs include undistort, getOptimalNewCameraMatrix, solvePnP, projectPoints, stereoCalibrate, stereoRectify and reprojectImageTo3D. Documentation: calibration tutorial and calib3d reference. OpenCV 5 reorganizes portions of former calib3d functionality; check the installed version's generated documentation.
Do these 3 things before closing this tab:
1Repair Windows errors before they cause bigger problems2Fix the driver behind crashes, sound loss and screen glitches3Clear out junk files and repair common Windows errorsClassical detectors and QR codes
cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')
objects = cascade.detectMultiScale(
gray, scaleFactor=1.1, minNeighbors=5)
CascadeClassifier, HOGDescriptor and QRCodeDetector support constrained detection tasks. Haar cascades are not equivalent to modern deep-learning detectors: pose, lighting, occlusion and domain changes can reduce robustness. Barcode and ArUco APIs depend on the installed build and modules. See object detection.
Run trained models with the DNN module
net = cv2.dnn.readNetFromONNX('model.onnx')
blob = cv2.dnn.blobFromImage(
image, scalefactor=1 / 255.0, size=(640, 640),
swapRB=True, crop=False)
net.setInput(blob)
output = net.forward()
Other entry points include readNet, blobFromImages, getPerfProfile and backend/target configuration methods. An .onnx suffix alone does not guarantee compatibility. Preprocessing must match training: input size, scaling, mean subtraction, channel order and letterboxing or cropping. Raw output normally needs decoding, confidence filtering and non-maximum suppression. GPU acceleration depends on the OpenCV build and available backend. See the DNN module and DNN tutorials.
Track motion and foreground objects
subtractor = cv2.createBackgroundSubtractorMOG2()
mask = subtractor.apply(frame)
Optical-flow functions include calcOpticalFlowPyrLK and calcOpticalFlowFarneback; another background model is createBackgroundSubtractorKNN. Background subtraction assumes a reasonably stable camera and scene. Shadows, illumination changes, vibration and moving backgrounds produce false positives. A tracker can drift or lose an object and is not the same as a detector. See video analysis.
Specialized photography and stitching functions
For restoration and compositing, consider inpaint, fastNlMeansDenoising, detailEnhance, stylization and seamlessClone. Panorama workflows use the stitching APIs exposed by the installed version; older examples may show createStitcher while newer builds can differ. Consult the photo module and stitching module.
Best Value
- Spacious Design: Measuring 21.1" wide and 12" deep, our lap desk comfortably fits most laptops up to 15.6". Extra room for accessories ensures convenience.
- Enhanced Functionality: Packed with handy features, including a 5x9" precision tracking mouse pad and a built-in phone slot for seamless work or video calls. Plus, enjoy laptop support with the integrated device ledge.
- Cool Comfort: Enjoy a stable surface with our lap desk's dual bolster cushion, designed for comfort and airflow, keeping your lap cool during extended use.
- Durable Surface: Work with confidence on our lap desk's solid surface, featuring a blush pink color, ensuring optimal air circulation to prevent your laptop from overheating.
- On-the-Go Convenience: With an integrated handle and lightweight design (2.14 lbs), our lap desk is portable for travel or moving around the house, offering flexibility in any space.
A complete teaching pipeline
import cv2
image = cv2.imread('input.jpg')
if image is None:
raise FileNotFoundError('input.jpg could not be read')
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
blurred = cv2.GaussianBlur(gray, (5, 5), 0)
edges = cv2.Canny(blurred, 50, 150)
contours, _ = cv2.findContours(
edges, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
output = image.copy()
for contour in contours:
if cv2.contourArea(contour) < 100:
continue
x, y, w, h = cv2.boundingRect(contour)
cv2.rectangle(output, (x, y), (x + w, y + h), (0, 255, 0), 2)
if not cv2.imwrite('output.jpg', output):
raise IOError('output.jpg could not be written')
This demonstrates a common order—load, grayscale, smooth, detect edges, find contours and annotate—but it is not a reliable object detector. Canny edges can create fragmented or duplicate outlines, and contour boxes do not provide semantic labels.
Quick function lookup
| Task | Start with | Important qualification |
|---|---|---|
| Load image | imread |
Check for None; path and codec failures are silent |
| Save image | imwrite |
Extension and encoder determine output support |
| Convert color | cvtColor |
OpenCV normally uses BGR |
| Resize | resize |
Interpolation changes quality |
| Reduce noise | GaussianBlur, medianBlur |
Smoothing can erase detail |
| Find edges | Canny |
Thresholds require tuning |
| Make a mask | threshold, adaptiveThreshold, inRange |
Lighting and color variation matter |
| Clean a mask | morphologyEx, erode, dilate |
Kernel size can remove or merge objects |
| Find shapes | findContours |
Needs suitable binary input |
| Correct perspective | warpPerspective |
Needs accurate point correspondences |
| Read camera/video | VideoCapture |
Backend and codec dependent |
| Write video | VideoWriter |
FourCC/container support varies |
| Match images | ORB, SIFT, BFMatcher or FLANN | Feature matching is not object detection |
| Calibrate camera | calibrateCamera, undistort |
Requires a proper calibration dataset |
| Run a trained model | cv2.dnn |
Preprocessing and model compatibility are decisive |
Troubleshoot the failures that appear most often
imread returns None
from pathlib import Path
path = Path('input.jpg')
print(path.resolve(), path.exists())
image = cv2.imread(str(path))
Check the working directory, spelling, permissions, file integrity and supported format.
Colors are wrong
Convert BGR to RGB before passing an image to an RGB-oriented library:
rgb = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
imshow freezes or crashes
Use waitKey and destroyAllWindows in desktop applications. In headless environments, remove GUI calls and write files or use another display mechanism.
Contours are noisy
Improve the binary input: grayscale conversion, selective blur, thresholding or segmentation, morphology, then filtering by area, aspect ratio, solidity or hierarchy.
The camera opens but frames fail
Check both isOpened() and the Boolean returned by read(). Try another index, lower resolution or frame rate, a backend-specific API, and verify operating-system camera permissions.
The video file is empty or unplayable
Confirm that the writer opened, frame dimensions match exactly, the codec is supported, the extension matches the container and release() is called.
DNN output is incorrect
Recheck input dimensions, BGR/RGB order, scaling, mean subtraction, letterboxing, output decoding, confidence thresholds, non-maximum suppression and model/backend compatibility.
Windows Errors? Fix Them Before They Spread
Repair common Windows errors and clear accumulated junk for a smoother, more stable PC - no reinstall needed.Free scan · no reinstallOutdated Drivers Are Slowing You Down
One free scan finds every outdated or missing driver and matches the right update for your exact hardware.Free scan · exact hardware matchProcessing is too slow
- Resize frames or process every second or third frame.
- Restrict work to a region of interest.
- Avoid unnecessary array copies and use vectorized NumPy operations.
- Batch DNN inputs where appropriate.
- Measure stages with
time.perf_counter()before changing backends or models.
When OpenCV is enough—and when it is not
Use OpenCV alone for local image and video manipulation, deterministic filtering, geometric correction, classical segmentation, camera access and lightweight feature workflows. Add a trained model with OpenCV DNN, ONNX Runtime, PyTorch or another inference stack when you need robust semantic classification, detection or segmentation across changing scenes. OpenCV supplies inference utilities; it does not replace dataset labeling, model training, evaluation, monitoring or production operations.
Choose a managed vision platform only when hosted scaling, annotation, model lifecycle tooling or pre-trained APIs justify their cost, latency, privacy and vendor-lock-in trade-offs. Check the license for the exact OpenCV package, contrib module, model weights, codec and deployment service before shipping a product.
Quick Recap
Product prices and availability are accurate as of the date/time indicated and are subject to change. Any price and availability information displayed on Amazon at the time of purchase will apply.

