0

Ich benutze auf Gerät Bilderkennung von Catchoom CraftAR und arbeiten mit dem Beispiel verfügbar auf Github https://github.com/Catchoom/craftar-example-ios-on-device-image-recognition.CraftAR Bilderkennung - Übersetzen matchBoundingBox zu Punkten im Bildschirm

Die Bilderkennung funktioniert, ich möchte die MatchBoundingBox verwenden, um einige Quadrate an allen 4 Ecken zu zeichnen. Irgendwie sind die Berechnungen ich tue nicht funktionieren, habe ich sie zu diesem Artikel basiert:

http://support.catchoom.com/customer/portal/articles/1886553-obtain-the-bounding-boxes-of-the-results-of-image-recognition

The Square Blick auf das Scan-Overlay hinzugefügt werden, und das ist, wie ich die Punkte am Berechnung, wo die 4 hinzufügen Ansichten:

CraftARSearchResult *bestResult = [results objectAtIndex:0]; 
BoundingBox *box = bestResult.matchBoundingBox; 

float w = self._preview.frame.size.width; 
float h = self._preview.frame.size.height; 

CGPoint tr = CGPointMake(w * box.topRightX , h * box.topRightY); 
CGPoint tl = CGPointMake(w * box.topLeftX, h * box.topLeftY); 
CGPoint br = CGPointMake(w * box.bottomRightX, h * box.bottomRightY); 
CGPoint bl = CGPointMake(w * box.bottomLeftX, h * box.bottomLeftY); 

die x-Position sieht aus wie es ziemlich nahe, aber die y-Position ist komplett aus und sieht aus wie gespiegelt.

Ich teste auf iOS 10 iPhone 6s

bin ich etwas fehlt?

Antwort

0

Das Problem war, dass ich den Vorschau-Frame verwendete, um die Übersetzung zu den Punkten im Bildschirm zu machen. Aber die Punkte, die mit Bounding Box kommen, sind nicht relativ zur Vorschauansicht, sie sind relativ zum VideoFrame (wie die Supportleute von cateoom.com darauf hingewiesen haben). Die VideoFrame-Größe wird durch das capturePreset festgelegt, das nur die Werte AVCaptureSessionPreset1280x720 und AVCaptureSessionPreset640x480 akzeptiert. Der Standard ist AVCaptureSessionPreset1280x720

Also in meinem Fall musste ich die Berechnungen mit der Größe 1280x720 machen und dann die Konvertierung von diesen Koordinaten zu den Koordinaten in meiner Vorschau Ansicht Größe.

So endete es so aufzublicken:

let box = bestResult.matchBoundingBox 

let wVideoFrame:CGFloat = 1080.0; 
let hVideoFrame:CGFloat = 720.0; 

let wRelativePreview = wVideoFrame/CGFloat(preview.frame.size.height) 
let hRelativePreview = wVideoFrame/CGFloat(preview.frame.size.width) 

var tl = CGPoint(x: wVideoFrame * CGFloat(box.topLeftX),y: hVideoFrame * CGFloat(box.topLeftY)); 
var tr = CGPoint(x: wVideoFrame * CGFloat(box.topRightX) ,y: hVideoFrame * CGFloat(box.topRightY)); 
var br = CGPoint(x: wVideoFrame * CGFloat(box.bottomRightX),y: hVideoFrame * CGFloat(box.bottomRightY)); 
var bl = CGPoint(x: wVideoFrame * CGFloat(box.bottomLeftX),y: hVideoFrame * CGFloat(box.bottomLeftY)); 

tl = CGPoint(x: tl.x/wRelativePreview, y: tl.y/hRelativePreview) 
tr = CGPoint(x: tr.x/wRelativePreview, y: tr.y/hRelativePreview) 
br = CGPoint(x: br.x/wRelativePreview, y: br.y/hRelativePreview) 
bl = CGPoint(x: bl.x/wRelativePreview, y: bl.y/hRelativePreview) 

// 4 square visualize top-left, top.right, bottom-left and bottom-right points 
var fr = vTL.frame; 
fr.origin = tl; 
vTL.frame = fr; 

fr.origin = tr; 
vTR.frame = fr; 

fr.origin = br; 
vBR.frame = fr; 

fr.origin = bl; 
vBL.frame = fr; 

Nun werden die Punkte auf dem Bildschirm ganz in Ordnung sah, aber sie sahen, wie einige gedreht. So gedreht ich die Ansicht um 90 Grad:

// overlay is the container of the 3 squares to visualize the points in screen 
overlay.transform = CGAffineTransform(rotationAngle: CGFloat(M_PI/2.0)) 

Hinweis: Dies ist nicht die offizielle Antwort von der Unterstützung von catchoom, das ist nicht 100% richtig sein könnte, aber es funktionierte für mich ganz gut.