2017-08-09 5 views
0

openCVで画像を簡単に切り抜くことができます。しかし、クロップの矩形の点に触れたときにズーム表示が作成されることを望みます。しかし、これに関連するものは何も得られない。さらに、これは私の最初のopenCVプロジェクトです。私は、この画像のようにしたい:ズームを使って別のビューにタッチポイントを表示する方法(OpenCV切り取り)

enter image description here

マイクロップ操作は以下の通りです:

-(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]; 

} 

作物アクションはここにある:提案の

- (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]; 
} 
} 

どんな種類が参考になります。

答えて

0

「レンズ」ROIの原点を見つけて、画像を切り抜いて、それぞれの次元をfactor = 2とし、オフセットdx =(ROI_width-ROI_width * factor)0.5とdy =(ROI_height-ROI_height係数)* 0.5、size =(ROI_width、ROI_height)、新しいトリミング画像を元画像の最初のROIに戻します。また、画像上にコピーする際にラウンドマスクを適用することもできます。

+0

ここでは、別の画像ビューでタッチポイントを簡単に表示できますが、別のビューでは、切り取った画像部分とクロップ矩形を同時にどのように表示しますか。ご回答有難うございます。 –

+0

別の画像コピーを使用してROIをトリミングし、別の画像コピーを貼り付けビューを表示するだけです。 src.copyTo(dst(ROI))メソッドを使用すると、クロップされたビューをイメージに置くことができます。 –

関連する問題