के साथ आईओएस में परिप्रेक्ष्य परिवर्तन + फसल मैं आने वाले ऐप में & परिप्रेक्ष्य सुधार सुविधा को लागू करने की कोशिश कर रहा हूं। अनुसंधान कर रहे हैं जबकि, मैं भर में आया था:ओपनसीवी
Executing cv::warpPerspective for a fake deskewing on a set of cv::Point
http://sudokugrab.blogspot.ch/2009/07/how-does-it-all-work.html
तो मैं OpenCV के साथ यह सुविधा लागू करने की कोशिश करने का फैसला किया - ढांचा है तो स्थापना तेजी से किया गया था। (2 चित्र परिणाम है)
मैं Xcode और ट्रिपल निर्देशांक जाँच के साथ काम करने के लिए सभी कोड अनुवाद किया है: हालांकि, मैं परिणाम मैं के लिए आशा व्यक्त की नहीं हो रही है । क्या आप मुझे बता सकते हैं कि मेरे कोड में क्या गलत है?
- (void)confirmedImage
{
if ([_adjustRect frameEdited]) {
cv::Mat src = [self cvMatFromUIImage:_sourceImage];
// My original Coordinates
// 4-------3
// | |
// | |
// | |
// 1-------2
CGFloat scaleFactor = [_sourceImageView contentScale];
CGPoint p1 = [_adjustRect coordinatesForPoint:4 withScaleFactor:scaleFactor];
CGPoint p2 = [_adjustRect coordinatesForPoint:3 withScaleFactor:scaleFactor];
CGPoint p3 = [_adjustRect coordinatesForPoint:1 withScaleFactor:scaleFactor];
CGPoint p4 = [_adjustRect coordinatesForPoint:2 withScaleFactor:scaleFactor];
std::vector<cv::Point2f> c1;
c1.push_back(cv::Point2f(p1.x, p1.y));
c1.push_back(cv::Point2f(p2.x, p2.y));
c1.push_back(cv::Point2f(p3.x, p3.y));
c1.push_back(cv::Point2f(p4.x, p4.y));
cv::RotatedRect box = minAreaRect(cv::Mat(c1));
cv::Point2f pts[4];
box.points(pts);
cv::Point2f src_vertices[3];
src_vertices[0] = pts[0];
src_vertices[1] = pts[1];
src_vertices[2] = pts[3];
cv::Point2f dst_vertices[4];
dst_vertices[0].x = 0;
dst_vertices[0].y = 0;
dst_vertices[1].x = box.boundingRect().width-1;
dst_vertices[1].y = 0;
dst_vertices[2].x = 0;
dst_vertices[2].y = box.boundingRect().height-1;
dst_vertices[3].x = box.boundingRect().width-1;
dst_vertices[3].y = box.boundingRect().height-1;
cv::Mat warpAffineMatrix = getAffineTransform(src_vertices, dst_vertices);
cv::Mat rotated;
cv::Size size(box.boundingRect().width, box.boundingRect().height);
warpAffine(src, rotated, warpAffineMatrix, size, cv::INTER_LINEAR, cv::BORDER_CONSTANT);
[_sourceImageView setNeedsDisplay];
[_sourceImageView setImage:[self UIImageFromCVMat:rotated]];
[_sourceImageView setContentMode:UIViewContentModeScaleAspectFit];
rotated.release();
src.release();
}
}
- (UIImage *)UIImageFromCVMat:(cv::Mat)cvMat
{
NSData *data = [NSData dataWithBytes:cvMat.data length:cvMat.elemSize()*cvMat.total()];
CGColorSpaceRef colorSpace;
if (cvMat.elemSize() == 1) {
colorSpace = CGColorSpaceCreateDeviceGray();
}
else {
colorSpace = CGColorSpaceCreateDeviceRGB();
}
CGDataProviderRef provider = CGDataProviderCreateWithCFData((__bridge CFDataRef)data);
CGImageRef imageRef = CGImageCreate(cvMat.cols, cvMat.rows, 8, 8 * cvMat.elemSize(), cvMat.step[0], colorSpace, kCGImageAlphaNone|kCGBitmapByteOrderDefault, provider, NULL, false, kCGRenderingIntentDefault);
UIImage *finalImage = [UIImage imageWithCGImage:imageRef];
CGImageRelease(imageRef);
CGDataProviderRelease(provider);
CGColorSpaceRelease(colorSpace);
return finalImage;
}
- (cv::Mat)cvMatFromUIImage:(UIImage *)image
{
CGColorSpaceRef colorSpace = CGImageGetColorSpace(image.CGImage);
CGFloat cols = image.size.width;
CGFloat rows = image.size.height;
cv::Mat cvMat(rows, cols, CV_8UC4);
CGContextRef contextRef = CGBitmapContextCreate(cvMat.data, cols, rows, 8, cvMat.step[0], colorSpace, kCGImageAlphaNoneSkipLast | kCGBitmapByteOrderDefault);
CGContextDrawImage(contextRef, CGRectMake(0, 0, rows, cols), image.CGImage);
CGContextRelease(contextRef);
CGColorSpaceRelease(colorSpace);
return cvMat;
}
यह मेरी समस्या का सही दृष्टिकोण है:> चटाई रूपांतरण + उलट - पूर्णता के लिए, मैं भी UIImage शामिल किया है? क्या आपके पास कोई नमूना कोड है जो मेरी मदद कर सकता है?
मेरा प्रश्न पढ़ने के लिए धन्यवाद!
UDATE:
मैं वास्तव में मेरी UIImagePickerController प्रतिस्थापन यहाँ Sourced खोलें है: https://github.com/mmackh/MAImagePickerController-of-InstaPDF समायोज्य फसल देखने के लिए, फिल्टर और परिप्रेक्ष्य सुधार भी शामिल है जो।
आपका प्रश्न अच्छी तरह से तैयार दोस्त है! –
धन्यवाद, एक बार पूरा हो जाने पर मैं दूसरों को भी मदद करने के लिए पूरे स्रोत कोड को जारी करने की योजना बना रहा हूं। यह इस समय मुझे कुछ सिरदर्द दे रहा है। – mmackh
आपका प्रश्न परिप्रेक्ष्य परिवर्तन करने के बारे में है, लेकिन आपका कोड getAffineTransform और warpAffine का उपयोग कर रहा है। –