将.mlmodel导入到项目中会用到的方法

本文介绍如何将UIImage转换为CVPixelBufferRef,用于图像处理任务,并提供了一个裁剪图片至特定尺寸的方法。通过示例代码展示了整个过程,包括创建兼容的像素缓冲区、绘制图像以及释放资源。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  • 将UIImage转换成CVPixelBufferRef

    /// 下面这个属性是UIImage的,你只要UIImage的对象 image.CGImage传进来就行了
    /// @property(nullable, nonatomic,readonly) CGImageRef CGImage; 
    
    - (CVPixelBufferRef)GetpixelBufferWithCGImage:(CGImageRef)cgimage
    {
        NSDictionary *options = @{
                                  (NSString*)kCVPixelBufferCGImageCompatibilityKey : @YES,
                                  (NSString*)kCVPixelBufferCGBitmapContextCompatibilityKey : @YES,
                                  (NSString*)kCVPixelBufferIOSurfacePropertiesKey: [NSDictionary dictionary]
                                  };
        CVPixelBufferRef pxbuffer = NULL;
        
        CGFloat frameWidth = CGImageGetWidth(cgimage);
        CGFloat frameHeight = CGImageGetHeight(cgimage);
        
        CVReturn status = CVPixelBufferCreate(kCFAllocatorDefault,
                                              frameWidth,
                                              frameHeight,
                                              kCVPixelFormatType_32BGRA,
                                              (__bridge CFDictionaryRef) options,
                                              &pxbuffer);
        
        NSParameterAssert(status == kCVReturnSuccess && pxbuffer != NULL);
        
        CVPixelBufferLockBaseAddress(pxbuffer, 0);
        void *pxdata = CVPixelBufferGetBaseAddress(pxbuffer);
        NSParameterAssert(pxdata != NULL);
        
        CGColorSpaceRef rgbColorSpace = CGColorSpaceCreateDeviceRGB();
        
        CGContextRef context = CGBitmapContextCreate(pxdata,
                                                     frameWidth,
                                                     frameHeight,
                                                     8,
                                                     CVPixelBufferGetBytesPerRow(pxbuffer),
                                                     rgbColorSpace,
                                                     (CGBitmapInfo)kCGImageAlphaNoneSkipFirst);
        NSParameterAssert(context);
        CGContextConcatCTM(context, CGAffineTransformIdentity);
        CGContextDrawImage(context, CGRectMake(0,
                                               0,
                                               frameWidth,
                                               frameHeight),
                           cgimage);
        CGColorSpaceRelease(rgbColorSpace);
        CGContextRelease(context);
        
        CVPixelBufferUnlockBaseAddress(pxbuffer, 0);
        
        return pxbuffer;
    }
    
  • 裁剪图片,全部为224*224

    //需要传过来的参数有:图片 image 和自定的尺寸
    - (UIImage *)image:(UIImage*)image byScalingToSize:(CGSize)targetSize {
        //原始 iamge
        UIImage *sourceImage = image;
        //新的image 用来接收裁剪后的image 开始时为 nil 
        UIImage *newImage = nil;
        UIGraphicsBeginImageContext(targetSize);
        CGRect thumbnailRect = CGRectZero;
        //裁剪后的image 的原点和 裁剪前 的 image 的 原点相同
        thumbnailRect.origin = CGPointZero;
        //裁剪后的image 的宽和 指定的宽 相同
        thumbnailRect.size.width  = targetSize.width;
        //裁剪后的image 的长和 指定的长 相同
        thumbnailRect.size.height = targetSize.height;
        //将原始image 在设定的 位置上绘制(裁剪)
        [sourceImage drawInRect:thumbnailRect];
        //把裁剪好的 image 放在 新的image 上
        newImage = UIGraphicsGetImageFromCurrentImageContext();
        UIGraphicsEndImageContext();
        return newImage ;
    }
    
  • 调用系统相机或从相册中选择照片后,得到结果

    - (void)RecognizeWithImage:(UIImage *)pImage
    {
        MobileNet *mobileNet = [[MobileNet alloc]init];
        //只需要调用predictionFromImage:error:这一个方法就可以得到结果了
        MobileNetOutput *output = [mobileNet predictionFromImage:[[pImage ScalingToSize:CGSizeMake(224, 224)] GetpixelBuffer] error:nil];
        _photoName.text = output.classLabel;
        //所有可能的结果 以及每种结果的可能性百分比
        NSLog(@"classLabelProbs%@",output.classLabelProbs);
        //可能性最大的那个结果
        NSLog(@"classLabel%@",output.classLabel);
    }
    
# coding: utf-8 import json from flask import current_app as app from pyspark.ml.classification import LogisticRegression from pyspark.ml.clustering import KMeans from pyspark.ml.feature import VectorAssembler from pyspark.ml.regression import LinearRegression from pyspark.sql import SparkSession def spark_read_mysql(sql, json_filename): ''' 排序 :param sql: :param json_filename: :return: ''' df = app.spark.read.format("jdbc").options(url=app.jdbc_url, dbtable=sql).load() count = df.count() df_data = df.toPandas().to_dict() json_data = [] for i in range(count): temp = {} for k, v in df_data.items(): temp[k] = v.get(i) json_data.append(temp) with open(json_filename, 'w', encoding='utf-8') as f: f.write(json.dumps(json_data, indent=4, ensure_ascii=False)) def linear(table_name): ''' 回归 :param table_name: :return: ''' spark = SparkSession.builder.appName("flask").getOrCreate() training = spark.read.format("libsvm").table(table_name) lr = LinearRegression(maxIter=20, regParam=0.01, elasticNetParam=0.6) lrModel = lr.fit(training) trainingSummary = lrModel.summary print("numIterations: %d" % trainingSummary.totalIterations) print("objectiveHistory: %s" % str(trainingSummary.objectiveHistory)) trainingSummary.residuals.show() print("RMSE: %f" % trainingSummary.rootMeanSquaredError) print("r2: %f" % trainingSummary.r2) result = trainingSummary.residuals.toJSON() spark.stop() return result def cluster(table_name): ''' 聚类 :param table_name: :return: ''' spark = SparkSession.builder.appName("flask").getOrCreate() dataset = spark.read.format("libsvm").table(table_name) kmeans = KMeans().setK(2).setSeed(1) model = kmeans.fit(dataset) centers = model.clusterCenters() for center in centers: print(center) return centers def selector(table_name, Cols)spark在该项目中起到的作用
04-01
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值