2017-08-09 1 views
0

Ich kann ein Bild einfach mit openCV zuschneiden. Aber ich möchte, dass eine Zoom-Ansicht erstellt wird, wenn der Crop-Rect-Punkt berührt wird. Aber nichts damit in Verbindung bringen. Außerdem ist dies mein erstes openCV-Projekt. Ich möchte Wie dieses Bild:Wie ich den Touchpoint in einer anderen Ansicht mit Zoom anzeigen kann (OpenCV cropping)

enter image description here

Meine Ernte Betrieb ist unten angegeben:

-(void)singlePan:(UIPanGestureRecognizer *)gesture{ 
CGPoint posInStretch = [gesture locationInView:_cropRect]; 
if(gesture.state==UIGestureRecognizerStateBegan){ 
    [_cropRect findPointAtLocation:posInStretch]; 
} 
if(gesture.state==UIGestureRecognizerStateEnded){ 
    _cropRect.activePoint.backgroundColor = [UIColor grayColor]; 
    _cropRect.activePoint = nil; 
    [_cropRect checkangle:0]; 
} 
[_cropRect moveActivePointToLocation:posInStretch]; 

} 

Crop Aktion ist hier:

- (IBAction)doneAction:(id)sender { 

_titleOutlet.text = NSLocalizedString(@"Rotation", @"Message"); 

if([_cropRect frameEdited]){ 

    //Thanks To stackOverflow 
    CGFloat scaleFactor = [_sourceImageView contentScale]; 
    CGPoint ptBottomLeft = [_cropRect coordinatesForPoint:1 withScaleFactor:scaleFactor]; 
    CGPoint ptBottomRight = [_cropRect coordinatesForPoint:2 withScaleFactor:scaleFactor]; 
    CGPoint ptTopRight = [_cropRect coordinatesForPoint:3 withScaleFactor:scaleFactor]; 
    CGPoint ptTopLeft = [_cropRect coordinatesForPoint:4 withScaleFactor:scaleFactor]; 

    NSLog(@"ptBottomLeft=%@", NSStringFromCGPoint(ptBottomLeft)); 
    NSLog(@"ptBottomRight=%@", NSStringFromCGPoint(ptBottomRight)); 
    NSLog(@"ptTopRight=%@", NSStringFromCGPoint(ptTopRight)); 
    NSLog(@"ptTopLeft=%@", NSStringFromCGPoint(ptTopLeft)); 

    CGFloat w1 = sqrt(pow(ptBottomRight.x - ptBottomLeft.x , 2) + pow(ptBottomRight.x - ptBottomLeft.x, 2)); 
    CGFloat w2 = sqrt(pow(ptTopRight.x - ptTopLeft.x , 2) + pow(ptTopRight.x - ptTopLeft.x, 2)); 

    CGFloat h1 = sqrt(pow(ptTopRight.y - ptBottomRight.y , 2) + pow(ptTopRight.y - ptBottomRight.y, 2)); 
    CGFloat h2 = sqrt(pow(ptTopLeft.y - ptBottomLeft.y , 2) + pow(ptTopLeft.y - ptBottomLeft.y, 2)); 

    CGFloat maxWidth = (w1 < w2) ? w1 : w2; 
    CGFloat maxHeight = (h1 < h2) ? h1 : h2; 



    cv::Point2f src[4], dst[4]; 
    src[0].x = ptTopLeft.x; 
    src[0].y = ptTopLeft.y; 
    src[1].x = ptTopRight.x; 
    src[1].y = ptTopRight.y; 
    src[2].x = ptBottomRight.x; 
    src[2].y = ptBottomRight.y; 
    src[3].x = ptBottomLeft.x; 
    src[3].y = ptBottomLeft.y; 

    dst[0].x = 0; 
    dst[0].y = 0; 
    dst[1].x = maxWidth - 1; 
    dst[1].y = 0; 
    dst[2].x = maxWidth - 1; 
    dst[2].y = maxHeight - 1; 
    dst[3].x = 0; 
    dst[3].y = maxHeight - 1; 

    cv::Mat undistorted = cv::Mat(cvSize(maxWidth,maxHeight), CV_8UC4); 
    cv::Mat original = [MMOpenCVHelper cvMatFromUIImage:_adjustedImage]; 


    NSLog(@"%f %f %f %f",ptBottomLeft.x,ptBottomRight.x,ptTopRight.x,ptTopLeft.x); 
    cv::warpPerspective(original, undistorted, cv::getPerspectiveTransform(src, dst), cvSize(maxWidth, maxHeight)); 

    [UIView transitionWithView:_sourceImageView duration:0.1 options:UIViewAnimationOptionTransitionCrossDissolve animations:^{ 



     _sourceImageView.image=[MMOpenCVHelper UIImageFromCVMat:undistorted]; 
     _cropImage=_sourceImageView.image; 

     //   _sourceImageView.image = [MMOpenCVHelper UIImageFromCVMat:grayImage];//For gray image 

    } completion:^(BOOL finished) { 
     _cropRect.hidden=YES; 
     //  [UIView animateWithDuration:0.5 animations:^{ 
     //  scrollView.frame=CGRectMake(0, 0, self.view.bounds.size.width, 64); 

     //  }]; 

    }]; 

    original.release(); 
    undistorted.release(); 
} 
else{ 
    UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:NSLocalizedString(@"Alert", nil) message:NSLocalizedString(@"Invalid Rect", nil) delegate:nil cancelButtonTitle:NSLocalizedString(@"OK", nil) otherButtonTitles:nil]; 
    [alertView show]; 
} 
} 

Jede Art von Anregung hilfreich sein wird.

Antwort

0

Finden Herkunft Ihrer „Linse“ ROI, Ernte es separates Bild, skaliert es Faktor = 2 jede Dimension sagen, dann von skalierten ROI zentralen Teil zuschneiden mit Offset dx = (ROI_width-ROI_width * Faktor) 0,5 und dy = (ROI_height-ROI_height Faktor) * 0,5, size = (ROI_width, ROI_height), und legte ein neues zugeschnittenes Bild wieder auf den ursprünglichen ROI des Quellbilds zurück. Sie können die Rundmaske auch wie beim Kopieren anwenden.

+0

Jetzt kann ich leicht den Berührungspunkt in einem anderen Bild anzeigen, aber wie ich den beschnittenen Bildteil anzeigen und gleichzeitig in einer anderen Ansicht rect. Danke für deine Antwort. –

+0

Verwenden Sie eine separate Kopie des Bildes, um den ROI zu beschneiden, und eine weitere Bildkopie, um die eingefügte Ansicht anzuzeigen. Sie können die Methode src.copyTo (dst (ROI)) verwenden, um die beschnittene Ansicht in Ihr Bild einzufügen. –

Verwandte Themen