从 CVImageBufferRef 获取内存所有权

2023-11-21

我正在制作一个简单的管道,从 AVCaptureSession 获取图像,在 OpenCV 中处理它们,然后在 OpenGL 中渲染它们。它基于 RosyWriter,但没有音频和录音功能。 OpenCV 处理看起来像

- (void)processPixelBuffer: (CVImageBufferRef)pixelBuffer 
{
CVPixelBufferLockBaseAddress( pixelBuffer, 0 );
int bufferWidth = CVPixelBufferGetWidth(pixelBuffer);
int bufferHeight = CVPixelBufferGetHeight(pixelBuffer);
unsigned char *pixel = (unsigned char *)CVPixelBufferGetBaseAddress(pixelBuffer);

cv::Mat image = cv::Mat(bufferWidth,bufferHeight,CV_8UC4,pixel);
//do any processing
[self setDisplay_matrix:image];
CVPixelBufferUnlockBaseAddress( pixelBuffer, 0 );
}

到目前为止,在这个函数中我还没有复制任何内存,我想保持这种状态。问题是 PixelBuffer 可能仍然拥有 display_image 中包含的内存。处理代码可能会也可能不会分配新内存并将其存储在图像中。如果处理没有分配新的内存,我必须将 PixelBuffer 与 display_matrix 一起传递,以防止数据被擦除。有没有办法让我获得记忆的所有权?我想销毁 PixelBuffer 而不破坏它指向的内存。

相关说明,LockBaseAddress 到底做了什么?如果我传递 cv::Mat、CVImageBufferRef 对,每次我想用 cv::Mat 修改/使用数据时,是否必须锁定基地址?


您可以从基地址数据创建数据提供程序而无需复制,然后从该数据提供程序创建 UIImage。为了避免在引用此图像时重复使用缓冲区,您需要保留示例缓冲区并锁定基地址。当您忘记此图像对象时,它们应该自动解锁并释放:

- (void)captureOutput:(AVCaptureOutput *)captureOutput 
didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer
       fromConnection:(AVCaptureConnection *)connection
{
    // Retain sample buffer and lock base address
    CFRetain(sampleBuffer);
    CVImageBufferRef imageBuffer = CMSampleBufferGetImageBuffer(sampleBuffer);
    CVPixelBufferLockBaseAddress(imageBuffer, 0);

    size_t bytesPerRow = CVPixelBufferGetBytesPerRow(imageBuffer);
    size_t height = CVPixelBufferGetHeight(imageBuffer);
    size_t width = CVPixelBufferGetWidth(imageBuffer);
    void *baseAddress = (void *)CVPixelBufferGetBaseAddressOfPlane(imageBuffer, 0);

    UIImage *image = imageFromData(baseAddress, width, height, bytesPerRow, sampleBuffer);

    // Now you can store this UIImage as long as you want
}

我有imageFromData从这个项目https://github.com/k06a/UIImage-DecompressAndMap/blob/master/UIImage%2BDecompressAndMap.m并稍微采用了它:

UIImage *imageFromData(void *data, size_t width, size_t height, size_t bytesPerRow, CMSampleBufferRef sampleBuffer)
{
    CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
    CGDataProviderRef provider = CGDataProviderCreateWithData((void *)sampleBuffer, data, bytesPerRow * height, munmap_wrapper);
    CGImageRef inflatedImage = CGImageCreate(width, height, 8, 4*8, bytesPerRow, colorSpace, kCGBitmapByteOrder32Little | kCGImageAlphaPremultipliedFirst, provider, NULL, NO, kCGRenderingIntentDefault);

    CGColorSpaceRelease(colorSpace);
    CGDataProviderRelease(provider);

    UIImage *img = [UIImage imageWithCGImage:inflatedImage scale:scale orientation:UIImageOrientationUp];
    CGImageRelease(inflatedImage);
    return img;
}

您还需要提供unlock_function:

void unlock_function(void *info, const void *data, size_t size)
{
    // Unlock base address release sample buffer
    CMSampleBufferRef sampleBuffer = (CMSampleBufferRef)info;
    CVImageBufferRef imageBuffer = CMSampleBufferGetImageBuffer(sampleBuffer);
    CVPixelBufferUnlockBaseAddress(imageBuffer, 0);
    CFRelease(sampleBuffer);
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

从 CVImageBufferRef 获取内存所有权 的相关文章

  • CSV 解析 - Swift 4

    我正在尝试解析 CSV 但遇到一些问题 下面是我用来解析 CSV 的代码 let fileURL Bundle main url forResource test application data Sheet 1 withExtension
  • 循环缓冲区录音 iOS:可能吗?

    我的一个客户想要连续录制音频 当他单击 提交 时 他只想提交最后 10 秒的内容 所以他想要连续记录并且只保留最后 x 秒 我认为这需要类似循环缓冲区的东西 但是 作为 iOS 的新手 它看起来像AVAudioRecorder只能写入文件
  • 将 NSString 的 NSArray 转换为 NSNumber 的更好方法

    考虑下面的代码 NSString param string 1 3 6 10 15 22 28 30 NSArray params param string componentsSeparatedByString NSNumberForma
  • 使用 iOS 分布式应用程序时 Google Cloud Messaging 显示“notRegistered”

    我在 iOS 应用程序上实现了 GCM 服务 我使用 PHP 在服务器上发送 GCM 当应用程序由开发配置文件签名时 它可以完美运行 也就是说 当应用程序使用 GCM 配置注册自身时 它始终返回一个正常运行的设备令牌 我可以使用令牌向设备发
  • CFBundle可执行文件丢失或无效

    尝试在 iOS 模拟器中运行我的项目时 我收到启动代码错误 0 检查 CoreSimulator log 中的控制台日志 我发现了 app 可执行文件 其 Info plist 中缺少或无效 CFBundleExecutable 我不知道如
  • UIAlertController 在 iOS 9 中不工作

    I have added the UIAlertController code showing login and password textfields it works for iOS 8 but in iOS 9 not works
  • #include 在 iOS 的 C++ 文件中找不到文件

    我在 iOS 下有一个目标 c c 项目 将其从 OS X 移动 然后出现 文件未找到 错误 include
  • iOS:调用 Objective-C 方法的处理开销是多少?

    我正在编写一些实时音频处理代码 该代码将在音频单元的渲染回调中执行 该线程处于系统识别的最高优先级 Apple 指示最大限度地减少此调用中进行的处理量 他们的建议之一是避免 Objective C 方法调用 But why 调用 Objec
  • 在 Swift 中获取 UIImage 的主颜色

    我正在尝试在 Swift 中获取 UIImage 的主颜色 并尝试移植这段代码 https stackoverflow com questions 13694618 objective c getting least used and mo
  • 如何在 AVAudioSession 内使用 iPhone XS 中内置的立体声(2 通道)麦克风?

    我试图从 iPhone XS 的所谓立体声后置麦克风获取两个通道 但在不同位置只能看到一个通道AVAudioSession and AVAudioSessionPortDescription与后置摄像头相关联 我尝试过使用AVAudioSe
  • 释放 Core Foundation 对象引用

    我是否需要释放 Core Foundation 对象来清理内存 如果是这样 怎么办 例如 在代码中 ABAddressBookRef addressBook ABAddressBookCreate CFArrayRef peopleArra
  • Swift - 本地通知不会被触发

    我正在 Swift 3 中编码 我只是想发送通知now没有任何延迟或间隔 然而 通知永远不会被触发 这是我的代码 视图控制器代码 import UserNotifications class HomeViewController UIVie
  • 故事板 - 不支持的配置 8 个冲突的约束

    我正在使用故事板自动布局 我今天在编写警告消息时注意到 MainStoryboard iphone storyboard Unsupported Configuration 8 conflicting constraints 单击警告会进入
  • 删除 UICollectionView 中的最后一个单元格会导致崩溃

    您好 我正在使用自定义 UICollectionView https github com SureCase WaterfallCollectionView https github com SureCase WaterfallCollec
  • 如何建立辅助NSSortDescriptor排序键?

    我已成功按排序键对数据进行排序lastName 但我想知道如何排序lastName 然后由firstName 这是我用来排序的代码lastName NSSortDescriptor sortDescriptor NSSortDescript
  • UITextView 动画更改框架不会动画文本重新分配

    我有一个 UITextView 我试图在用户点击按钮时为框架的变化设置动画 基本上 文本视图会变大以适应屏幕 以便可以显示更多文本 然后当用户再次点击按钮时 它会缩小到原始框架 我使用块执行动画 如下所示 if isDisplayingDe
  • 最近打开的应用程序[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 有什么方法可以获取最近打开的应用程序 例如 4 个 的列表吗 如果是这样 怎么办 可可麦克 看看LaunchServices LSSh
  • UITableview 中的水平和垂直滚动[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 I want to make a lineup for a festival You can see what I want to a
  • 将第 3 方库 ZXing 导入 Xcode

    我尝试了多种方法将第 3 方库 ZXing 导入我的 iOS 应用程序 但所有方法都很痛苦 或者根本不起作用 如果有人可以建议我做错了什么 或者提出导入 ZXing 等库的更好方法 我将非常感激 一定比这个容易 这就是我所做的 结果是 My
  • 自定义字体显示在 IB 中,但不显示在模拟器中

    我已经设置了一个UITextView and a UILabel使用自定义字体 它是垂直镜像的蒙古文字体 但我还添加了英文文本 以便您可以看到效果 这些文字显示在 Interface Builder 中 但在模拟器中大部分字符都在UITex

随机推荐

  • 如何在 Ant 目标中使用文件大小

    我目前正在用 Ant 构建脚本替换我的自制构建脚本 现在我需要用特定文件的大小替换各种标记 我知道如何通过以下方式获取大小 以字节为单位
  • Android:完成应用程序/活动后显示吐司

    我想在退出应用程序时显示一个简单的吐司 问题是 吐司没有显示 我认为这是因为活动已完成或因为System exit 0 但我不知道如何解决 有人有提示吗 谢谢 在我的活动中 我有以下代码 Toast makeText this Exit a
  • 子进程中“shell=True”的实际含义

    我正在调用不同的进程subprocess模块 不过 我有一个问题 在下面的代码中 callProcess subprocess Popen ls l shell True and callProcess subprocess Popen l
  • Ajax / Jquery 自动完成 JSON 数据

    我正在尝试设置 Jquery UI 自动完成字段以获取来自 ajax 连接的数据 到目前为止 这是我的代码 mainIngredientAutoComplete autocomplete source function request re
  • Antora顶部导航栏定制

    我的问题很简单 尽管我在文档中找不到任何指向它的内容 我正在使用 Antora 中的默认生成器为项目生成文档 但我不知道如何自定义顶部导航栏 右侧的项目 这些项目有一些默认值 既然网站已生成 我应该在哪里更改或如何更改这些项目 我不想在那里
  • 原始类型的 Objective-c 属性

    在 Objective C 中 为原始类型指定一个属性是否有意义 nonatomic 我想知道这两个属性之间的区别 property nonatomic BOOL myBool property BOOL myBool 从技术上讲 答案是肯
  • 计算两行之间的时间差

    我有一个包含 StartDate 列的表 我想计算两个连续记录之间的时间差 Thanks Mark Byers 和 Yahia 我有请求表作为 requestId startdate requestId startdate 1 2011 1
  • 使用完整网址时 PHP file_get_contents 非常慢

    我正在使用一个脚本 最初不是我创建的 该脚本从 HTML 页面生成 pdf 文件 问题是现在需要很长的时间来处理 比如 1 2 分钟 据说这最初工作得很好 但在过去几周内速度减慢了 该脚本调用file get contents在 php 脚
  • 用户与 uiview 和动画完成块的交互

    我有以下代码 UIView animateWithDuration 2 0 delay 0 0 options UIViewAnimationOptionAllowUserInteraction animations imageView b
  • 500内部服务器错误,如何调试[重复]

    这个问题在这里已经有答案了 我的 POST 请求出现内部服务器错误 我该如何调试它们 是在 php ini 中设置的吗 该文件非常大 并且多次出现 错误 一词 您可以使用以下命令打开 PHP 错误error reporting error
  • 如何在 angularJS 中将 X-Frame-Options 设置为响应标头?

    我在 API 的响应中收到了 X Frame Options 标头 但据我了解 为了防止点击劫持攻击 我需要将其添加到 UI 代码中 UI代码 用angularjs编写 部署在Tomcat 版本7 0 72 服务器中 我尝试在应用程序的 w
  • 一个动态规划问题

    谁能帮我找到一个最佳的动态规划算法这个问题 在去吃晚饭的路上 CCC 的参赛者正在排队享用美味的炸薯条 N 1 N 100 名选手排成一队进入食堂 CCC 的负责人 V 博士在最后一刻意识到 程序员只是讨厌站在使用不同语言的程序员旁边 值得
  • GraphQL 枚举类型会自动解析它们的值吗?

    我应该期望枚举类型自动解析还是这些类型仅存在以限制选项 给定以下 GraphQL 架构 type Job description String status Status enum Status PENDING REVIEW PENDING
  • 如何在 Game Center 中接受邀请

    我正在尝试通过游戏中心实施邀请 但有一点我不明白 好的 我已从一台设备向另一台设备发送了邀请 然后我在接收器上有一个 UIAlertView 询问我是否愿意接受或拒绝邀请 当我接受它时 它的处理方式如下 GKMatchmaker share
  • Bootstrap xs 列换行

    对于最小的 xs 尺寸 即使我的列加起来为 12 如果屏幕宽度减小到超过一定限制 它们也不会按预期工作 例如 div class container div class row div class col xs 2 div div clas
  • 如何使用 igraph 获取最短路径上的顶点?

    我在用着igraph生成顶点对之间最短路径距离的矩阵 但我不知道如何返回顶点 到目前为止我有 path length matrix ig graph shortest paths dijkstra None None distance AL
  • 如何在 Swift 中获取 2 个数组的公共元素列表?

    我有两个数组 fruitsArray apple mango blueberry orange vegArray tomato potato mango blueberry 我怎样才能获得这两个数组中的常见项目列表 ouptput mang
  • 将数组传递给 asp net core web api 操作方法 HttpGet

    我正在尝试将整数数组发送到我的操作方法 代码如下所示 HttpGet public async Task
  • ASP.NET Webforms 不会为 Chrome/iOS 呈现回发 JavaScript 函数

    当我们提供用户代理时Mozilla 5 0 iPhone CPU iPhone OS 5 0 1 like Mac OS X en us AppleWebKit 534 46 0 KHTML like Gecko CriOS 21 0 11
  • 从 CVImageBufferRef 获取内存所有权

    我正在制作一个简单的管道 从 AVCaptureSession 获取图像 在 OpenCV 中处理它们 然后在 OpenGL 中渲染它们 它基于 RosyWriter 但没有音频和录音功能 OpenCV 处理看起来像 void proces