前提・実現したいこと
openCVを使って、テンプレートマッチングをしようとしています。
ただ、画像ではなく動画のなかの一部分を認識できる仕組みを作りたいです。
発生している問題・エラーメッセージ
エラーメッセージです。
No library found for org.opencv.core.Core
OpenCV for Processing 0.5.4 by Greg Borenstein http://gregborenstein.com
Using Java OpenCV 2.4.5.0
OpenCV for Processing 0.5.4 by Greg Borenstein http://gregborenstein.com
Using Java OpenCV 2.4.5.0
OpenCV for Processing 0.5.4 by Greg Borenstein http://gregborenstein.com
Using Java OpenCV 2.4.5.0
OpenCV Error: Assertion failed (s >= 0) in unknown function, file ......\src\opencv\modules\core\src\matrix.cpp, line 116
error, disabling movieEvent() for elv.mp4
java.lang.reflect.InvocationTargetException
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at processing.video.Movie.fireMovieEvent(Unknown Source)
at processing.video.Movie.invokeEvent(Unknown Source)
at processing.video.Movie$2.rgbFrame(Unknown Source)
at org.gstreamer.elements.RGBDataAppSink$AppSinkNewBufferListener.newBuffer(RGBDataAppSink.java:162)
at org.gstreamer.elements.AppSink$2.callback(AppSink.java:184)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at com.sun.jna.CallbackReference$DefaultCallbackProxy.invokeCallback(CallbackReference.java:485)
at com.sun.jna.CallbackReference$DefaultCallbackProxy.callback(CallbackReference.java:515)
Caused by: CvException [org.opencv.core.CvException: ......\src\opencv\modules\core\src\matrix.cpp:116: error: (-215) s >= 0
]
at org.opencv.imgproc.Imgproc.matchTemplate_0(Native Method)
at org.opencv.imgproc.Imgproc.matchTemplate(Imgproc.java:7226)
at template_matching.findMario(template_matching.java:72)
at template_matching.movieEvent(template_matching.java:101)
... 15 more
該当のソースコード
import processing.video.;
import gab.opencv.;
import org.opencv.core.CvType;
import org.opencv.imgproc.Imgproc;
import org.opencv.core.Mat;
import org.opencv.core.Core.MinMaxLocResult;
import org.opencv.core.Core;
OpenCV opencv, small, large, fire;
PImage template;
int w = 540;
int h = 960;
Movie mov;
PVector smallPos, largePos;
float smallConf, largeConf;
void setup() {
small = new OpenCV(this, "2f.jpg");
large = new OpenCV(this, "4f.jpg");
//fire = new OpenCV(this, "fire_mario.png");
smallPos = new PVector();
largePos = new PVector();
//firePos = new PVector();
mov = new Movie(this, "elv.mp4");
opencv = new OpenCV(this, w, h);
size(540, 960);
mov.play();
}
float findMario(PVector p, OpenCV t) {
//opencv.setGray(opencv.getR().clone());
Imgproc.morphologyEx(opencv.getR(), opencv.getR(), Imgproc.MORPH_GRADIENT, new Mat());
t.setGray(t.getR().clone());
Imgproc.morphologyEx(t.getGray(), t.getGray(), Imgproc.MORPH_GRADIENT, new Mat());
Mat result = new Mat();
Imgproc.matchTemplate(opencv.getR(), t.getGray(), result, Imgproc.TM_CCORR_NORMED);
MinMaxLocResult r = Core.minMaxLoc(result);
p.x = OpenCV.pointToPVector(r.maxLoc).x;
p.y = OpenCV.pointToPVector(r.maxLoc).y;
return (float)r.maxVal;
}
void draw() {
image(mov, 0, 0);
noFill();
stroke(255, 0, 0);
strokeWeight(2);
if (smallConf > 0.7) {
text("small - " + smallConf, smallPos.x, smallPos.y - 30);
rect(smallPos.x, smallPos.y, small.width, small.height);
}
if (largeConf > 0.7) {
text("large - " + largeConf , largePos.x, largePos.y - 30);
rect(largePos.x, largePos.y, large.width, large.height);
}
}
void movieEvent(Movie e) {
e.read();
opencv.loadImage(e);
smallConf = findMario(smallPos, small);
largeConf = findMario(largePos, large);
}
試したこと
ここに問題に対して試したことを記載してください。
補足情報(FW/ツールのバージョンなど)
ここにより詳細な情報を記載してください。
あなたの回答
tips
プレビュー