孤独的香蕉.png
一、前言
写这篇博客的目的为记录,并且供大家学习,希望大家多多交流,有不正确的地方请指正,轻喷。!~~
二、透视校正 简介
透视校正或者称为透视控制是对照片进行合成或者编辑以得到符合大众对于透视失真理解的结果的过程。
三、流程
首先想要对照片中的物体进行透视校正 所以就先要找到图片中的物体,一般都是矩形的物体,所以就需要用到OpenCv中找矩形的方法先找到图片中所有的矩形,然后判断寻找最大的矩形,然后再对这个矩形进行校正就OK拉。
上代码:
//寻找矩形
- (void)detectEdges{
cv::Mat original = [BLOpenCVHelper cvMatFromUIImage:_myImageView.image];
CGSize targetSize = self.myImageView.contentSize;
//把图片按比例缩小,因为屏幕显示的图片并不是实际大小,所以需要把图片的大小按比例缩小成当前屏幕的大小,并且映射过去,这样找矩形的时候返回的4个点坐标才是正确的
cv::resize(original, original, cvSize(targetSize.width, targetSize.height));
std::vector<:vector>>squares;
std::vector<:point> largest_square;
//寻找矩形
find_squares(original, squares);
//寻找最大的矩形
find_largest_square(squares, largest_square);
if (largest_square.size() == 4) {
// Manually sorting points, needs major improvement. Sorry.
NSMutableArray *points = [NSMutableArray array];
NSMutableDictionary *sortedPoints = [NSMutableDictionary dictionary];
for (int i = 0; i < 4; i++)
{
NSDictionary *dict = [NSDictionary dictionaryWithObjectsAndKeys:[NSValue valueWithCGPoint:CGPointMake(largest_square[i].x, largest_square[i].y)], @"point" , [NSNumber numberWithInt:(largest_square[i].x + largest_square[i].y)], @"value", nil];
[points addObject:dict];
}
int min = [[points valueForKeyPath:@"@min.value"] intValue];
int max = [[points valueForKeyPath:@"@max.value"] intValue];
int minIndex = 0;
int maxIndex = 0;
int missingIndexOne = 0;
int missingIndexTwo = 0;
for (int i = 0; i < 4; i++)
{
NSDictionary *dict = [points o