Kotlin OpenCV 视频分析和对象跟踪60 MIL 对象跟踪
【代码】Kotlin OpenCV 图像图像60 对象跟踪。
·
Kotlin OpenCV 视频分析和对象跟踪60 MIL 对象跟踪
1 OpenCV 对象跟踪算法
算法 | 算法 | 特点 |
---|---|---|
1 BOOSTING Tracker | 基于 AdaBoost 算法。 | 适合于简单的对象跟踪任务。 算法较老,在复杂场景中表现一般。 |
2 KCF Tracker (Kernelized Correlation Filters) | 基于核相关滤波器的算法。 | 计算速度快,适合实时应用。 对尺度变化和旋转的适应性较差。 |
3 TLD Tracker (Tracking-Learning-Detection) | 结合了跟踪、学习和检测的三部分。 | 适合处理长时间跟踪和对象消失再出现的情况。 复杂度较高,运行速度较慢。 |
4 MedianFlow Tracker | 基于光流法的中值流算法。 | 对预测跟踪位置的误差敏感,适合处理稳定运动的对象。 在快速运动或剧烈变化的背景下效果不佳。 |
5 GOTURN Tracker (Generic Object Tracking Using Regression Networks) | 基于深度学习的回归网络。 | 不需要在线更新模型,跟踪效果稳定。 需要大量的训练数据,计算资源需求较高。 |
6 MOSSE Tracker (Minimum Output Sum of Squared Error) | 基于最小输出平方误差的滤波器。 | 计算速度非常快,适合实时跟踪。 对噪声和光照变化敏感。 |
7 CSRT Tracker (Discriminative Correlation Filter with Channel and Spatial Reliability) | 改进的相关滤波器,具有空间和通道可靠性。 | 在复杂背景下表现优异,对尺度变化有较好适应性。 计算量较大,速度较慢。 |
8 DaSiamRPN Tracker (Siamese Region Proposal Network) | 基于孪生网络的区域建议方法。 | 能够处理快速运动和尺度变化。 需要预先训练好的模型,计算资源需求高。 |
9 MIL Tracker (Multiple Instance Learning) | 基于多实例学习算法。 | 能够处理部分遮挡的问题。 在动态变化的背景下表现不佳。 |
2 Kotlin 引入依赖
<dependency>
<groupId>org.bytedeco</groupId>
<artifactId>opencv-platform</artifactId>
<version>4.9.0-1.5.10</version>
</dependency>
3 Kotlin OpenCV MIL 对象跟踪
package com.xu.com.xu.tracking
import org.bytedeco.javacpp.BytePointer
import org.bytedeco.javacpp.Loader
import org.bytedeco.opencv.global.opencv_core
import org.bytedeco.opencv.global.opencv_highgui
import org.bytedeco.opencv.global.opencv_imgproc
import org.bytedeco.opencv.opencv_core.Mat
import org.bytedeco.opencv.opencv_core.Point
import org.bytedeco.opencv.opencv_core.Rect
import org.bytedeco.opencv.opencv_core.Scalar
import org.bytedeco.opencv.opencv_tracking.TrackerCSRT
import org.bytedeco.opencv.opencv_tracking.TrackerKCF
import org.bytedeco.opencv.opencv_video.Tracker
import org.bytedeco.opencv.opencv_video.TrackerDaSiamRPN
import org.bytedeco.opencv.opencv_video.TrackerGOTURN
import org.bytedeco.opencv.opencv_video.TrackerMIL
import org.bytedeco.opencv.opencv_video.TrackerNano
import org.bytedeco.opencv.opencv_video.TrackerVit
import org.bytedeco.opencv.opencv_videoio.VideoCapture
object Tracking {
init {
Loader.load(opencv_core::class.java)
}
@JvmStatic
fun main(args: Array<String>) {
Nano()
}
fun MIL() {
val video = VideoCapture("lib/data/video/cup.mp4")
// 第一帧影像
val first = Mat()
video.read(first)
// 鼠标框选区域
val roi: Rect? = opencv_highgui.selectROI("roi", first, false, false, false)
opencv_highgui.destroyWindow("roi")
// 创建跟踪器
val tracker: Tracker = TrackerMIL.create()
tracker.init(first, roi)
while (video.read(first)) {
// 更新跟踪器
val ok = tracker.update(first, roi)
if (ok) {
opencv_imgproc.rectangle(first, roi, Scalar(Point()))
} else {
println("跟踪失败")
}
opencv_highgui.imshow("MIL", first)
if (opencv_highgui.waitKey(1) == 27) {
break
}
}
video.release()
opencv_highgui.destroyAllWindows()
}
fun KCF() {
val video = VideoCapture("lib/data/video/cup.mp4")
// 第一帧影像
val first = Mat()
video.read(first)
// 鼠标框选区域
val roi: Rect? = opencv_highgui.selectROI("roi", first, false, false, false)
opencv_highgui.destroyWindow("roi")
// 创建跟踪器
val tracker: Tracker = TrackerKCF.create()
tracker.init(first, roi)
while (video.read(first)) {
// 更新跟踪器
val ok = tracker.update(first, roi)
if (ok) {
opencv_imgproc.rectangle(first, roi, Scalar(Point()))
} else {
println("跟踪失败")
}
opencv_highgui.imshow("KCF", first)
if (opencv_highgui.waitKey(1) == 27) {
break
}
}
video.release()
opencv_highgui.destroyAllWindows()
}
fun CSRT() {
val video = VideoCapture("lib/data/video/cup.mp4")
// 第一帧影像
val first = Mat()
video.read(first)
// 鼠标框选区域
val roi: Rect? = opencv_highgui.selectROI("roi", first, false, false, false)
opencv_highgui.destroyWindow("roi")
// 创建跟踪器
val tracker: Tracker = TrackerCSRT.create()
tracker.init(first, roi)
while (video.read(first)) {
// 更新跟踪器
val ok = tracker.update(first, roi)
if (ok) {
opencv_imgproc.rectangle(first, roi, Scalar(Point()))
} else {
println("跟踪失败")
}
opencv_highgui.imshow("CSRT", first)
if (opencv_highgui.waitKey(1) == 27) {
break
}
}
video.release()
opencv_highgui.destroyAllWindows()
}
fun Nano() {
val video = VideoCapture("lib/data/video/cup.mp4")
// 第一帧影像
val first = Mat()
video.read(first)
// 鼠标框选区域
val roi: Rect? = opencv_highgui.selectROI("roi", first, false, false, false)
opencv_highgui.destroyWindow("roi")
// 创建跟踪器
val tracker: Tracker = TrackerNano.create()
tracker.init(first, roi)
while (video.read(first)) {
// 更新跟踪器
val ok = tracker.update(first, roi)
if (ok) {
opencv_imgproc.rectangle(first, roi, Scalar(Point()))
} else {
println("跟踪失败")
}
opencv_highgui.imshow("Nano", first)
if (opencv_highgui.waitKey(1) == 27) {
break
}
}
video.release()
opencv_highgui.destroyAllWindows()
}
fun Vit() {
val video = VideoCapture("lib/data/video/cup.mp4")
// 第一帧影像
val first = Mat()
video.read(first)
// 鼠标框选区域
val roi: Rect? = opencv_highgui.selectROI("roi", first, false, false, false)
opencv_highgui.destroyWindow("roi")
// 创建跟踪器
val tracker: Tracker = TrackerVit.create()
tracker.init(first, roi)
while (video.read(first)) {
// 更新跟踪器
val ok = tracker.update(first, roi)
if (ok) {
opencv_imgproc.rectangle(first, roi, Scalar(Point()))
} else {
println("跟踪失败")
}
opencv_highgui.imshow("CSRT", first)
if (opencv_highgui.waitKey(1) == 27) {
break
}
}
video.release()
opencv_highgui.destroyAllWindows()
}
fun DaSiamRPN() {
val video = VideoCapture("lib/data/video/cup.mp4")
// 第一帧影像
val first = Mat()
video.read(first)
// 鼠标框选区域
val roi: Rect? = opencv_highgui.selectROI("roi", first, false, false, false)
opencv_highgui.destroyWindow("roi")
// 创建跟踪器
val tracker: Tracker = TrackerDaSiamRPN.create()
tracker.init(first, roi)
while (video.read(first)) {
// 更新跟踪器
val ok = tracker.update(first, roi)
if (ok) {
opencv_imgproc.rectangle(first, roi, Scalar(Point()))
} else {
println("跟踪失败")
}
opencv_highgui.imshow("CSRT", first)
if (opencv_highgui.waitKey(1) == 27) {
break
}
}
video.release()
opencv_highgui.destroyAllWindows()
}
fun GOTURN() {
val video = VideoCapture("lib/data/video/cup.mp4")
// 第一帧影像
val first = Mat()
video.read(first)
// 鼠标框选区域
val roi: Rect? = opencv_highgui.selectROI("roi", first, false, false, false)
opencv_highgui.destroyWindow("roi")
// 创建跟踪器
val param = TrackerGOTURN.Params()
param.modelTxt(BytePointer("lib/goturn/goturn.prototxt", "UTF-8"))
param.modelBin(BytePointer("lib/goturn/goturn.caffemodel", "UTF-8"))
val tracker: Tracker = TrackerGOTURN.create(param)
tracker.init(first, roi)
while (video.read(first)) {
// 更新跟踪器
val ok = tracker.update(first, roi)
if (ok) {
opencv_imgproc.rectangle(first, roi, Scalar(Point()))
} else {
println("跟踪失败")
}
opencv_highgui.imshow("CSRT", first)
if (opencv_highgui.waitKey(1) == 27) {
break
}
}
video.release()
opencv_highgui.destroyAllWindows()
}
}

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐
所有评论(0)