iOS实现摄像头实时采集图像

本文实例为大家分享了iOS实现摄像头实时采集图像的具体代码,供大家参考,具体内容如下

新接到一个实时获取摄像头当前照片的需求,在设定的时间内需要保持摄像头处在开启状态并可以实时回调到当前的图片数据信息;

此次结合 AVCaptureDevice、AVCaptureSession、AVCaptureVideoPreviewLayer 将其与 UIView、UIImageView 和 UIImage 相结合;

Github

具体实现 code 如下:

#import <UIKit/UIKit.h>
#import <CoreVideo/CoreVideo.h>
#import <CoreMedia/CoreMedia.h>
#import <AVFoundation/AVFoundation.h>

NS_ASSUME_NONNULL_BEGIN

@interface YHCameraView : UIView <AVCaptureVideoDataOutputSampleBufferDelegate>

@property (nonatomic, weak) UIImageView *cameraImageView;
@property (strong, nonatomic) AVCaptureDevice* device;
@property (strong, nonatomic) AVCaptureSession* captureSession;
@property (strong, nonatomic) AVCaptureVideoPreviewLayer* previewLayer;
@property (strong, nonatomic) UIImage* cameraImage;

@end

NS_ASSUME_NONNULL_END
#import "YHCameraView.h"

@implementation YHCameraView

- (instancetype)initWithFrame:(CGRect)frame {
    if (self = [super initWithFrame:frame]) {
        self.backgroundColor = [UIColor lightGrayColor];
        [self createUI];
    }
    return self;
}

/*
// Only override drawRect: if you perform custom drawing.
// An empty implementation adversely affects performance during animation.
- (void)drawRect:(CGRect)rect {
    // Drawing code
}
*/

- (void)createUI {
    NSArray* devices = [AVCaptureDevice devicesWithMediaType:AVMediaTypeVideo];
    for(AVCaptureDevice *device in devices)
    {
        if([device position] == AVCaptureDevicePositionFront) // 前置摄像头
            self.device = device;
    }

    AVCaptureDeviceInput* input = [AVCaptureDeviceInput deviceInputWithDevice:self.device error:nil];
    AVCaptureVideoDataOutput* output = [[AVCaptureVideoDataOutput alloc] init];
    output.alwaysDiscardsLateVideoFrames = YES;

    dispatch_queue_t queue;
    queue = dispatch_queue_create("cameraQueue", NULL);
    [output setSampleBufferDelegate:self queue:queue];

    NSString* key = (NSString *) kCVPixelBufferPixelFormatTypeKey;
    NSNumber* value = [NSNumber numberWithUnsignedInt:kCVPixelFormatType_32BGRA];
    NSDictionary* videoSettings = [NSDictionary dictionaryWithObject:value forKey:key];
    [output setVideoSettings:videoSettings];

    self.captureSession = [[AVCaptureSession alloc] init];
    [self.captureSession addInput:input];
    [self.captureSession addOutput:output];
    [self.captureSession setSessionPreset:AVCaptureSessionPresetPhoto];

    self.previewLayer = [AVCaptureVideoPreviewLayer layerWithSession:self.captureSession];
    self.previewLayer.videoGravity = AVLayerVideoGravityResizeAspectFill;

    // CHECK FOR YOUR APP
    NSInteger screenWidth = self.frame.size.width;
    NSInteger screenHeitht = self.frame.size.height;
    self.previewLayer.frame = self.bounds;
    self.previewLayer.orientation = AVCaptureVideoOrientationPortrait;
    // CHECK FOR YOUR APP

//    [self.layer insertSublayer:self.previewLayer atIndex:0];   // Comment-out to hide preview layer

    [self.captureSession startRunning];
}

- (void)captureOutput:(AVCaptureOutput *)captureOutput didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer fromConnection:(AVCaptureConnection *)connection
{
    CVImageBufferRef imageBuffer = CMSampleBufferGetImageBuffer(sampleBuffer);
    CVPixelBufferLockBaseAddress(imageBuffer, 0);
    uint8_t *baseAddress = (uint8_t *)CVPixelBufferGetBaseAddress(imageBuffer);
    size_t bytesPerRow = CVPixelBufferGetBytesPerRow(imageBuffer);
    size_t width = CVPixelBufferGetWidth(imageBuffer);
    size_t height = CVPixelBufferGetHeight(imageBuffer);

    CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
    CGContextRef newContext = CGBitmapContextCreate(baseAddress, width, height, 8, bytesPerRow, colorSpace, kCGBitmapByteOrder32Little | kCGImageAlphaPremultipliedFirst);
    CGImageRef newImage = CGBitmapContextCreateImage(newContext);

    CGContextRelease(newContext);
    CGColorSpaceRelease(colorSpace);

    self.cameraImage = [UIImage imageWithCGImage:newImage scale:1.0f orientation:UIImageOrientationLeftMirrored]; // UIImageOrientationDownMirrored
    self.cameraImageView.image = [UIImage imageWithCGImage:newImage scale:1.0f orientation:UIImageOrientationLeftMirrored];

    CGImageRelease(newImage);

    CVPixelBufferUnlockBaseAddress(imageBuffer, 0);
}

@end

将其实例化后在需要的时候直接获取其 cameraView 的 cameraImage 即可;

#pragma mark - 快照采集
/// 快照采集
- (YHCameraView *)cameraView {
    if (!_cameraView) {
        YHCameraView *view = [[YHCameraView alloc] init];
        view.frame = CGRectMake(1, 1, 1, 1);
        view.cameraImageView.image = view.cameraImage;
        _cameraView = view;
    }
    return _cameraView;
}

NSString *strImg = [YHCameraManager imageBase64EncodedWithImage:self.cameraView.cameraImage
                                                       AndImageType:@"JPEG"]; // 获取照片信息
/**
 图片转 Base64

 @param img     原图片
 @param type    图片类型(PNG 或 JPEG)
 @return        处理结果
 */
+ (NSString *)imageBase64EncodedWithImage:(UIImage *)img AndImageType:(NSString *)type {
    NSString *callBack = nil;
    if ([img isKindOfClass:[UIImage class]]) {
        NSData *data = [NSData data];
        if ([type isEqualToString:@"PNG"]) {
            data = UIImagePNGRepresentation(img);
        } else {
            data = UIImageJPEGRepresentation(img, 1.0f);
        }

        NSString *encodedImgStr = [data base64EncodedStringWithOptions:NSDataBase64Encoding64CharacterLineLength];

        NSLog(@"YHCameraManager\nencodedImgStr: %@", encodedImgStr);
        return encodedImgStr;
    } else {
        return callBack;
    }
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • iOS通过摄像头图像识别技术分享

    目前的计算机图像识别,透过现象看本质,主要分为两大类: 1.基于规则运算的图像识别,例如颜色形状等模板匹配方法 2.基于统计的图像识别.例如机器学习ML,神经网络等人工智能方法 **区别:**模板匹配方法适合固定的场景或物体识别,机器学习方法适合大量具有共同特征的场景或物体识别. **对比:**无论从识别率,准确度,还是适应多变场景变换来讲,机器学习ML都是优于模板匹配方法的:前提你有大量的数据来训练分类器.如果是仅仅是识别特定场景.物体或者形状,使用模板匹配方法更简单更易于实现. **目标:*

  • iOS利用摄像头获取环境光感参数的方法

    本文介绍了iOS利用摄像头获取环境光感参数的方法,分享给大家,具体如下: 不多说,代码如下: #import "LightSensitiveViewController.h" @import AVFoundation; #import <ImageIO/ImageIO.h> @interface LightSensitiveViewController ()< AVCaptureVideoDataOutputSampleBufferDelegate> @prop

  • iOS开发中对于摄像头的一些基本使用方法分享

    在一些应用中,我们需要用到iOS设备的摄像头进行拍照,视频.并且从相册中选取我们需要的图片或者视频. 关于iOS摄像头和相册的应用,可以使用UIImagePickerController类来完成控制. UIImagePickerController 这个类可以为大家提供照相的功能,以及图片,视频浏览的功能. 检查硬件是否安装有摄像头或者允许操作相册 复制代码 代码如下: #pragma mark - 摄像头和相册相关的公共类 // 判断设备是否有摄像头 - (BOOL) isCameraAvai

  • iOS利用手机摄像头测心率

    原理 简单介绍一下,网上可以查到很多关于手机测心率的这种项目,大概就是: 把手指放在摄像头和闪光灯上,通过手指处脉搏跳动充血导致的细微颜色变化来确定心跳波动,确定波峰波谷,根据两个波峰之间的时间差来确定瞬时心率. 思路 首先,采集视频流,根据拿到的RGB颜色转成HSV颜色集,其实我们只用到了HSV的H. 对拿到的H进行一些处理,看跟人喜好或者具体情况,主要是用于后面的折线图和计算瞬时心率,如果有能力的话可以处理一下噪音数据,因为可能测的时候手指轻微抖动会造成一些不稳定的数据. 根据处理后的H就可

  • iOS实现摄像头实时采集图像

    本文实例为大家分享了iOS实现摄像头实时采集图像的具体代码,供大家参考,具体内容如下 新接到一个实时获取摄像头当前照片的需求,在设定的时间内需要保持摄像头处在开启状态并可以实时回调到当前的图片数据信息: 此次结合 AVCaptureDevice.AVCaptureSession.AVCaptureVideoPreviewLayer 将其与 UIView.UIImageView 和 UIImage 相结合: Github 具体实现 code 如下: #import <UIKit/UIKit.h>

  • OpenCV-Python 摄像头实时检测人脸代码实例

    参考 OpenCV摄像头使用 代码 import cv2 cap = cv2.VideoCapture(4) # 使用第5个摄像头(我的电脑插了5个摄像头) face_cascade = cv2.CascadeClassifier(r'haarcascade_frontalface_default.xml') # 加载人脸特征库 while(True): ret, frame = cap.read() # 读取一帧的图像 gray = cv2.cvtColor(frame, cv2.COLOR_

  • Python3利用Dlib实现摄像头实时人脸检测和平铺显示示例

    1. 引言 在某些场景下,我们不仅需要进行实时人脸检测追踪,还要进行再加工:这里进行摄像头实时人脸检测,并对于实时检测的人脸进行初步提取: 单个/多个人脸检测,并依次在摄像头窗口,实时平铺显示检测到的人脸: 图 1 动态实时检测效果图 检测到的人脸矩形图像,会依次平铺显示在摄像头的左上方: 当多个人脸时候,也能够依次铺开显示: 左上角窗口的大小会根据捕获到的人脸大小实时变化: 图 2 单个/多个人脸情况下摄像头识别显示结果 2. 代码实现 主要分为三个部分: 摄像头调用,利用 OpenCv 里面

  • opencv+mediapipe实现人脸检测及摄像头实时示例

    目录 单张人脸关键点检测 单张图像人脸检测 摄像头实时关键点检测 单张人脸关键点检测 定义可视化图像函数 导入三维人脸关键点检测模型 导入可视化函数和可视化样式 读取图像 将图像模型输入,获取预测结果 BGR转RGB 将RGB图像输入模型,获取预测结果 预测人人脸个数 可视化人脸关键点检测效果 绘制人来脸和重点区域轮廓线,返回annotated_image 绘制人脸轮廓.眼睫毛.眼眶.嘴唇 在三维坐标中分别可视化人脸网格.轮廓.瞳孔 import cv2 as cv import mediapi

  • 教你用YOLOv5实现多路摄像头实时目标检测功能

    目录 前言 一.YOLOV5的强大之处 二.YOLOV5部署多路摄像头的web应用 1.多路摄像头读取 2.模型封装 3.Flask后端处理 4.前端展示 总结 前言 YOLOV5模型从发布到现在都是炙手可热的目标检测模型,被广泛运用于各大场景之中.因此,我们不光要知道如何进行yolov5模型的训练,而且还要知道怎么进行部署应用.在本篇博客中,我将利用yolov5模型简单的实现从摄像头端到web端的部署应用demo,为读者提供一些部署思路. 一.YOLOV5的强大之处 你与目标检测高手之差一个Y

  • Android实现语音数据实时采集、播放

    最近做的项目是和语音实时采集并发送,对方实时接收并播放相关,下面记录下实现的核心代码. 很多Android开发者应该知道android有个MediaRecorder对象和MediaPlayer对象,用于录制和播放音频.这个弊端在于他们不能实时采集并发送出去,所以,我们只能使用AudioRecord和AudioTrack来实现. 记得申明权限: <uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS&qu

  • 用python打开摄像头并把图像传回qq邮箱(Pyinstaller打包)

    前言: 如何悄悄的打开朋友的摄像头,看看她最近过的怎么样,嘿嘿!这次让我带你们来实现这个功能. 注: 这个程序仅限在朋友之间开玩笑,别去搞什么违法的事情哦. 代码 发送邮件 使用python内置的email模块即可完成.导入相应的代码封装为一个send函数,顺便导入需要导入的包 注: 下面的代码有三处要修改的地方,两处写的qq邮箱地址,还有一处写的qq邮箱授权码,不知道qq邮箱授权码的可以去百度一下 import smtplib from email.mime.multipart import

  • Vue实现调用PC端摄像头实时拍照

    Vue之调用PC端摄像头实时拍照,供大家参考,具体内容如下 由于我使用的是点击按钮打开模态框拍照所以在这里吧按钮和模态框代码都粘贴如下. <!-- 打开模态框按钮--> <el-form-item label="*照片:" prop="headImage"> <el-input type="text" v-model="imgSrc" /> <el-col :span="1.

  • Python实现摄像头实时换脸详解

    目录 环境与效果 基本原理 完整源码 环境与效果 python3.9.6 pycharm 2021 库环境: dlib opencv-python 视频图片效果如下: 视频链接 摄像头实时换脸,老师都不认识我了!! 基本原理 使用dlib的shape_predictor_68_face_landmarks.dat模型获取一张有正脸的图片(1.png)和摄像头的自己的68个人脸特征点. 根据人脸特征点获取分别获取人脸掩模 对第一个图片仿射变换使其脸部对准摄像头图片中的脸部得到新的图片 对人脸掩模执

随机推荐