To perform real-time detection, integrate react-native-fast-opencv with react-native-vision-camera's frame processor. The recommended workflow involves:
- Scaling: Use
react-native-vision-camera-resizer to scale down the incoming frame for faster processing. - Buffer Conversion: Convert the resized pixel buffer into a
Uint8Array. - Mat Creation: Create an OpenCV
Mat object from the buffer using Mat.createFromBuffer. - Processing: Apply OpenCV functions (like
cvtColor, inRange, findContours) to identify objects. - Rendering: Use
react-native-vision-camera-skia within the render callback to draw detection results (e.g., rectangles) on top of the camera frame.
Requirements:
react-native-fast-opencvreact-native-vision-camera + WorkletsCorereact-native-vision-camera-resizerreact-native-vision-camera-skia
import { OpenCV, Mat, DataTypes, Scalar, MatVector } from 'react-native-fast-opencv';
import { SkiaCamera } from 'react-native-vision-camera-skia';
import { useResizer } from 'react-native-vision-camera-resizer';
// Inside your component/frame processor:
const { resizer } = useResizer({
width: 320,
height: 180,
channelOrder: 'bgr',
dataType: 'uint8',
pixelLayout: 'interleaved',
scaleMode: 'contain',
});
// In the onFrame callback:
// 1. Resize and get pixels
const resized = resizer!.resize(frame) as GPUFrame;
const pixels = new Uint8Array(resized.getPixelBuffer());
// 2. Create Mat from buffer
const src = Mat.createFromBuffer('uint8', height, width, 3, pixels);
// 3. Process (Example: Color thresholding)
const dst = Mat.create(0, 0, DataTypes.CV_8U);
const lowerBound = Scalar.create(30, 60, 60);
const upperBound = Scalar.create(50, 255, 255);
OpenCV.cvtColor(src, dst, ColorConversionCodes.COLOR_BGR2HSV);
OpenCV.inRange(dst, lowerBound, upperBound, dst);
// 4. Cleanup
resized.dispose();
frame.dispose();