Dieser Artikel ist der zweite Tag der Web-Crew Adventskalender 2017. Gestern war @ kouares '"CRUD mit PlayFramework 2.6.7 implementieren, Play-Slick 3.0.2 (Slick 3.2)".
@ Hahegawa wird für den zweiten Tag verantwortlich sein. Vielen Dank.
――In meiner Arbeit hatte ich die Möglichkeit, ein Objekt aus einem Bild erkennen zu wollen, also habe ich OpenCV ausprobiert.
――Ich habe "Feature Detection" und "Feature Matching" ausprobiert.
Es ist ein bisschen alt, aber ich habe es in der folgenden Umgebung versucht. ・ Windows 10 ・ Sauerstoff verdunkeln ・ OpenCV3.1 ・ Apache Tomcat 7.0
Laden Sie die OpenCV-Bibliothek herunter Laden Sie auf der folgenden Seite die Bibliothek des Ver, das Sie verwenden möchten, herunter und entpacken Sie sie an einen geeigneten Speicherort https://opencv.org/releases.html
4. Klicken Sie mit der rechten Maustaste auf das Eclipse-Projekt → Buildpfad in Eigenschaften festlegen
6. Laufzeitkonfiguration hinzufügen Wenn Sie OpenCV unter der Annahme einer Webanwendung ausführen, setzen Sie 5 auf den Klassenpfad der Laufzeitkonfiguration. Fügen Sie dieselbe Benutzerbibliothek hinzu
(2)~(5)Quellcode
//Mattenkonvertierung des vom Bildschirm gesendeten Bildes
Mat src = new Mat(bufImg.getHeight(), bufImg.getWidth(), CvType.CV_8UC3);
byte[] bufImgBinary = ((DataBufferByte)bufImg.getRaster().getDataBuffer()).getData();
src.put(0, 0, bufImgBinary);
//Mattenkonvertierung des zur Merkmalserkennung verwendeten Vorlagenbildes
Mat tempSrc = new Mat(tmpImg.getHeight(), tmpImg.getWidth(), CvType.CV_8UC3);
byte[] tempImgBinary = ((DataBufferByte)tmpImg.getRaster().getDataBuffer()).getData();
tempSrc.put(0, 0, tempImgBinary);
//Graustufenkonvertierung zur Merkmalserkennung
Mat srcGray = new Mat(bufImg.getHeight(), bufImg.getWidth(), CvType.CV_8UC1);
Imgproc.cvtColor(src, srcGray, Imgproc.COLOR_BGR2GRAY);
Core.normalize(srcGray, srcGray, 0, 255, Core.NORM_MINMAX);
Mat tempSrcGray = new Mat(tmpImg.getHeight(), tmpImg.getWidth(), CvType.CV_8UC1);
Imgproc.cvtColor(tempSrc, tempSrcGray, Imgproc.COLOR_BGR2GRAY);
Core.normalize(tempSrcGray, tempSrcGray, 0, 255, Core.NORM_MINMAX);
MatOfKeyPoint keyPointSrc = new MatOfKeyPoint();
MatOfKeyPoint keyPointTemp = new MatOfKeyPoint();
Mat descriptersSrc = new Mat(src.rows(), src.cols(), src.type());
Mat descriptersBase = new Mat(tempSrc.rows(), tempSrc.cols(), tempSrc.type());
//Feature-Detektor-Generation 1
FeatureDetector akazeDetector = FeatureDetector.create(FeatureDetector.AKAZE);
DescriptorExtractor akazeExtractor = DescriptorExtractor.create(DescriptorExtractor.AKAZE);
akazeDetector.detect(srcGray, keyPointSrc);
akazeDetector.detect(tempSrcGray, keyPointTemp);
akazeExtractor.compute(srcGray, keyPointSrc, descriptersSrc);
akazeExtractor.compute(tempSrcGray, keyPointTemp, descriptersBase);
//Feature-Detektor-Generation 2
DescriptorMatcher matcher = DescriptorMatcher.create(DescriptorMatcher.BRUTEFORCE);
MatOfDMatch matche = new MatOfDMatch();
List<MatOfDMatch> matches = new ArrayList<MatOfDMatch>();
List<DMatch> dmatch = new ArrayList<DMatch>();
//Merkmale Gegenprüfung verfügbar
if(CROSS_CHECK_FLG){
MatOfDMatch srcToBase = new MatOfDMatch();
MatOfDMatch baseToSrc = new MatOfDMatch();
matcher.match(descriptersSrc, descriptersBase, srcToBase);
matcher.match(descriptersBase, descriptersSrc, baseToSrc);
List<DMatch> ldm_srcToBase = srcToBase.toList();
List<DMatch> ldm_baseToSrc = baseToSrc.toList();
for(int i=0; i<ldm_srcToBase.size(); i++) {
DMatch forward = ldm_srcToBase.get(i);
DMatch backward = ldm_baseToSrc.get(forward.trainIdx);
if(backward.trainIdx == forward.queryIdx){
dmatch.add(forward);
}
}
matche.fromList(dmatch);
}
//Merkmale Keine Gegenprüfung
else{
System.out.println("Merkmale Normale Prüfausführung");
matcher.match(descriptersSrc, descriptersBase, matche);
}
Mat matchResult = new Mat(src.rows()*2, src.cols()*2, src.type());
Features2d.drawMatches(src, keyPointSrc, tempSrc, keyPointTemp, matche, matchResult);
//↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓ Verifizierungsbildausgabe ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
BufferedImage image = ImageConverter.convertMToBI(matchResult);
File ouptut = new File("C:\\testlog\\sample_20171202.jpg ");
ImageIO.write(image, "jpg", ouptut);
Laden der OpenCV-Bibliothek
static{
System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
}
Obwohl es einige Fehlerkennungen gibt, können die Merkmale erkannt werden.
――Das Schreiben des Codes hat lange gedauert, da er langsam war. Wenn Sie jedoch schnell einen Code finden oder schreiben, können Sie das Bild problemlos verarbeiten, wenn Sie die Grundlagen und Erklärungen der verschiedenen in diesem Artikel beschriebenen Methoden verstehen. Ich hatte das Gefühl, dass ich es schaffen könnte. ――Wenn Sie Ihr Unternehmen planen, möchten Sie wirklich "Was ist vor der Funktionserkennung zu tun?" Verwenden. Lesen Sie diesen Artikel und konzentrieren Sie sich auf die Verarbeitung, die Sie wirklich ohne zusätzlichen Aufwand implementieren möchten. I würde es schätzen wenn du könntest.
Morgen ist @wc_moriyama. Vielen Dank.
Recommended Posts