JavaCv + Yolo

40 views
Skip to first unread message

Aurelio Maica

unread,
Sep 22, 2022, 5:35:01 PM9/22/22
to javacv
Good evening, does anyone have an example of how to use javacv with yolo... in videos? I found this example https://github.com/bytedeco/javacv/blob/master/samples/YOLONet.java , but it's just for file and image I needed to use with videos. Thanks in advance.

Keith Hall

unread,
Sep 24, 2022, 3:49:13 AM9/24/22
to javacv
You'll need to import these classes
import org.bytedeco.javacv.CanvasFrame;
import org.bytedeco.javacv.Frame;
import org.bytedeco.javacv.FrameGrabber;
import org.bytedeco.javacv.OpenCVFrameConverter;
import org.bytedeco.javacv.OpenCVFrameGrabber;


then your main should look a bit like this - though it might need some optimising - this is just something quick I put together:

public static void main(String[] args) {


YOLONet yolo = new YOLONet(
"yolov4.cfg",
"yolov4.weights",
"coco.names",
608, 608);
yolo.setup();

OpenCVFrameConverter.ToMat toMatConverter = new OpenCVFrameConverter.ToMat();
OpenCVFrameGrabber openCVFrameGrabber = new OpenCVFrameGrabber(0);
try {
openCVFrameGrabber.start();
CanvasFrame canvasFrame = new CanvasFrame("Yolo");
Frame frame = openCVFrameGrabber.grab();
canvasFrame.setCanvasSize(frame.imageWidth, frame.imageHeight);
while (canvasFrame.isVisible() && (frame != null)) {
Mat image = toMatConverter.convert(frame);
List<ObjectDetectionResult> results = yolo.predict(image);

System.out.printf("Detected %d objects:\n", results.size());
for (ObjectDetectionResult result : results) {
System.out.printf("\t%s - %.2f%%\n", result.className, result.confidence * 100f);

// annotate on image
rectangle(image,
new Point(result.x, result.y),
new Point(result.x + result.width, result.y + result.height),
Scalar.MAGENTA, 2, LINE_8, 0);
}

canvasFrame.showImage(toMatConverter.convert(image));
frame = openCVFrameGrabber.grab();
}
} catch (
FrameGrabber.Exception e) {
e.printStackTrace();
}

}


Keith Hall

unread,
Sep 24, 2022, 3:54:16 AM9/24/22
to javacv
If you're using a video file rather than a camera feed then modify this :

import org.bytedeco.javacv.FFmpegFrameGrabber;

import org.bytedeco.javacv.Frame;
import org.bytedeco.javacv.FrameGrabber;
import org.bytedeco.javacv.OpenCVFrameConverter;
import org.bytedeco.opencv.opencv_core.Mat;


public class JavaCVVideoGrabber {

public static void main(String[] params){
String path2MovieFile = "movie.mp4";
FFmpegFrameGrabber movieFileGrabber = new FFmpegFrameGrabber(path2MovieFile);

OpenCVFrameConverter.ToMat toMatConverter = new OpenCVFrameConverter.ToMat();
try {
movieFileGrabber.start();
Frame frame;
while((frame= movieFileGrabber.grab())!=null){
Mat image = toMatConverter.convert(frame);

}
} catch (FrameGrabber.Exception e) {
e.printStackTrace();
} finally {
try {
movieFileGrabber.stop();
} catch (FrameGrabber.Exception e) {
e.printStackTrace();
}
}

}
}

Reply all
Reply to author
Forward
0 new messages