实战OpenCV库之 旋转图像

在我的一博客中转摘别人的一个OpenCV的文章,没有自己动手过,这次亲自操刀了。呵呵。

 引入OpenCV库

       首先建立个工程TestOpenCV吧。按http://blog.csdn.net/nogodoss/article/details/11926063导入相关资源。如下图:


   然后再工程的-Prefix.pch文件上加入


 注意必须在 __OBJC__  之前哟。 到此工程编译没有问题。


 以下是应用OpenCV库的操作。

  旋转:

 .h文件

#import <Foundation/Foundation.h>

@interface OpencvUtilt : NSObject {

}

-(UIImage*)rotateImage:(UIImage*)inputImage Angle:(double)angle;

@end

 .mm文件---------- 这里必须是.mm文件有

@implementation OpencvUtilt

-(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); // 8 bits per component, 4 channels

    CGContextRef contextRef = CGBitmapContextCreate(cvMat.data,                 // Pointer to  data

                                                    cols,                      // Width of bitmap

                                                    rows,                      // Height of bitmap

                                                    8,                          // Bits per component

                                                    cvMat.step[0],             // Bytes per row

                                                    colorSpace,                // Colorspace

                                                    kCGImageAlphaNoneSkipLast |

                                                    kCGBitmapByteOrderDefault); // Bitmap info flags

    CGContextDrawImage(contextRef, CGRectMake(0, 0, cols, rows), image.CGImage);

    CGContextRelease(contextRef);

    return cvMat;

}

-(UIImage *)UIImageFromCVMat:(cv::Mat)cvMat

{

    NSData *data = [NSDatadataWithBytes:cvMat.data length:cvMat.elemSize()*cvMat.total()];

    CGColorSpaceRef colorSpace;

    if (cvMat.elemSize() ==1) {

        colorSpace = CGColorSpaceCreateDeviceGray();

    } else {

        colorSpace = CGColorSpaceCreateDeviceRGB();

    }

    CGDataProviderRef provider =CGDataProviderCreateWithCFData((CFDataRef)data);

    // Creating CGImage from cv::Mat

    CGImageRef imageRef = CGImageCreate(cvMat.cols,                                //width

                                        cvMat.rows,                                //height

                                        8,                                         //bits per component

                                        8 * cvMat.elemSize(),                      //bits per pixel

                                        cvMat.step[0],                           //bytesPerRow

                                        colorSpace,                                //colorspace

                                        kCGImageAlphaNone|kCGBitmapByteOrderDefault,// bitmap info

                                        provider,                                  //CGDataProviderRef

                                        NULL,                                      //decode

                                        false,                                     //should interpolate

                                        kCGRenderingIntentDefault                  //intent

                                        );

    // Getting UIImage from CGImage

    UIImage *finalImage = [UIImageimageWithCGImage:imageRef];

    CGImageRelease(imageRef);

    CGDataProviderRelease(provider);

    CGColorSpaceRelease(colorSpace);

    return finalImage;

}

-(cv::Mat)rotate:(cv::Mat &)image Angle:(double) angle {

    cv::Point2f src_center(image.rows/2.0F-160, image.cols/2.0F);

    double scale = 1;//  这里就没有放大缩小了。

    if(angle == 0) {

        return image;

    }

    if(angle == 180) {

        cv::Mat rot_matrix =getRotationMatrix2D(src_center, angle,1);

        cv::Mat rotated_img(cv::Size(image.cols, image.rows), image.type());

        warpAffine(image, rotated_img, rot_matrix, rotated_img.size());

        return rotated_img;

    }

    if(angle == 90 || angle ==270) {

        cv::Mat rot_matrix =getRotationMatrix2D(src_center, angle,scale);

        cv::Mat rotated_img(cv::Size(960,640), image.type());

        warpAffine(image, rotated_img, rot_matrix, rotated_img.size());

        return rotated_img;

    }

    return cv::Mat::zeros(0,0, 0);

}


-(UIImage*)rotateImage:(UIImage*)inputImage Angle:(double)angle{

    cv::Mat inputMat= [selfcvMatFromUIImage:inputImage];

    cv::Mat outputMat =  [selfrotate:inputMat Angle:angle];

    return [self UIImageFromCVMat:outputMat];

}

@end


demo:

- (void)buttonAction:(id)sender {

    OpencvUtilt *utilt = [[OpencvUtilt alloc] init];

    self.imageView.image = [utilt rotateImage:imageView_.image Angle:90.0];

}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值