iOS中使用opencv进行图像识别操作

转换 UIImage 和 cv::Mat

在 OpenCV 中同常用 cv::Mat 表示图片,而iOS中则是 UIImage 来表示图片,因此我们就需要一些转换的方法,OpenCV 的官方教程中给吃了转换的方法,这里摘录如下:

UIImage To cv::Mat:

- (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 (color channels + alpha)

               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,// Colorspacek

                                                                                                        CGImageAlphaNoneSkipLast | kCGBitmapByteOrderDefault);// Bitmap info flags

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

                    CGContextRelease(contextRef);

                  returncvMat;

}

-(cv::Mat)cvMatGrayFromUIImage(UIImage*)image{      

CGColorSpaceRef colorSpace=CGImageGetColorSpace(image.CGImage);

CGFloatcols=image.size.width;

CGFloatrows=image.size.height;

cv::MatcvMat(rows,cols,CV_8UC1);// 8 bits per component, 1 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 infoflags

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

CGContextRelease(contextRef);

returncvMat;

}

cv::Mat To UIImage:

-(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((__bridgeCFDataRef)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,//CGDataProvider

                                                                RefNULL,//decode

                                                             false,//should interpolate

                                                              kCGRenderingIntentDefault//intent

);

// Getting UIImage from CGImage

UIImage*finalImage=[UIImage imageWithCGImage:imageRef];

CGImageRelease(imageRef);

CGDataProviderRelease(provider);

CGColorSpaceRelease(colorSpace);

returnfinalImage;

}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
iOS上的OpenCV车牌识别完整代码需要涵盖以下几个主要步骤: 第一步,导入OpenCV库和相关框架: ```objc #import <opencv2/opencv.hpp> #import <opencv2/highgui/highgui.hpp> #import <opencv2/imgproc/imgproc.hpp> ``` 第二步,加载车牌样本图片和预训练模型: ```objc cv::Mat image = cv::imread("car_plate.jpg", CV_LOAD_IMAGE_COLOR); cv::CascadeClassifier plateCascade; plateCascade.load("cascade.xml"); ``` 第三步,图像处理和车牌识别: ```objc cv::Mat grayImage; cv::cvtColor(image, grayImage, cv::COLOR_BGR2GRAY); cv::equalizeHist(grayImage, grayImage); std::vector<cv::Rect> plates; plateCascade.detectMultiScale(grayImage, plates, 1.1, 3, 0 | cv::CASCADE_SCALE_IMAGE, cv::Size(30, 30)); for (size_t i = 0; i < plates.size(); i++) { cv::Rect plateRect = plates[i]; cv::Mat plateROI = grayImage(plateRect); std::vector<cv::Rect> characters; characterCascade.detectMultiScale(plateROI, characters, 1.1, 3, 0 | cv::CASCADE_SCALE_IMAGE, cv::Size(10, 10)); for (size_t j = 0; j < characters.size(); j++) { cv::Rect characterRect = characters[j]; // 在原始图像上绘制识别的车牌和字符矩形框 cv::rectangle(image, characterRect, cv::Scalar(0, 255, 0), 2); } } ``` 第四步,显示和保存识别结果: ```objc cv::imshow("Car Plate Recognition", image); cv::imwrite("result.jpg", image); cv::waitKey(0); ``` 以上代码片段仅涵盖了车牌识别的基本操作,具体的实现还需要根据实际需求进行优化和扩展。整个代码可以在iOS开发环境使用,并且需要适配OpenCV库的相关依赖。同时,还需要准备好车牌样本图片和相应的预训练模型文件(如[cascade.xml](https://github.com/opencv/opencv/blob/master/data/haarcascades/haarcascade_russian_plate_number.xml))。请注意,这仅仅是一个简单的示例代码,实际的车牌识别算法可能需要更复杂的处理和训练过程。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值