如何从 CVPixelBufferRef 转换为 openCV cv::Mat

2024-07-01

我想对一个执行一些操作CVPixelBufferRef并出来一个cv::Mat

  • 裁剪到感兴趣的区域
  • 缩放到固定尺寸
  • 均衡直方图
  • 转换为灰度 - 每像素 8 位(CV_8UC1)

我不确定最有效的顺序是什么,但是,我确实知道所有操作都可以在 open:CV 矩阵上使用,所以我想知道如何转换它。

- (void) captureOutput:(AVCaptureOutput *)captureOutput 
         didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer 
         fromConnection:(AVCaptureConnection *)connection
{
     CVPixelBufferRef pixelBuffer = CMSampleBufferGetImageBuffer(sampleBuffer);

     cv::Mat frame = f(pixelBuffer); // how do I implement f()?

我在一些文章中找到了答案优秀的 GitHub 源代码 https://github.com/shihongzhi/CamShift-on-iOS/blob/05ab212064c697a96b77c0a3a313ec48f94d6a2c/CamShift/VideoCaptureViewController.mm。为了简单起见,我在这里对其进行了调整。它还为我进行灰度转换。

CVPixelBufferRef pixelBuffer = CMSampleBufferGetImageBuffer(sampleBuffer);
OSType format = CVPixelBufferGetPixelFormatType(pixelBuffer);

// Set the following dict on AVCaptureVideoDataOutput's videoSettings to get YUV output
// @{ kCVPixelBufferPixelFormatTypeKey : kCVPixelFormatType_420YpCbCr8BiPlanarFullRange }

NSAssert(format == kCVPixelFormatType_420YpCbCr8BiPlanarFullRange, @"Only YUV is supported");

// The first plane / channel (at index 0) is the grayscale plane
// See more infomation about the YUV format
// http://en.wikipedia.org/wiki/YUV
CVPixelBufferLockBaseAddress(pixelBuffer, 0);
void *baseaddress = CVPixelBufferGetBaseAddressOfPlane(pixelBuffer, 0);

CGFloat width = CVPixelBufferGetWidth(pixelBuffer);
CGFloat height = CVPixelBufferGetHeight(pixelBuffer);

cv::Mat mat(height, width, CV_8UC1, baseaddress, 0);

// Use the mat here

CVPixelBufferUnlockBaseAddress(pixelBuffer, 0);

我认为最好的顺序是:

  1. 转换为灰度(因为它几乎是自动完成的)
  2. 裁剪(这应该是一个快速操作,并且会减少要使用的像素数量)
  3. 缩小
  4. 均衡直方图
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何从 CVPixelBufferRef 转换为 openCV cv::Mat 的相关文章

  • iOS IAP 无法在纯 ipv6 网络上运行

    我在 Appstore 中有一款 iPhone 游戏 最近尝试使用最新的 Xcode 上传更新版本 但被拒绝 因为应用内购买无法在仅 ipv6 的网络上运行 它在 ipv4 网络上运行良好 ViewController m NSMutabl
  • 将数据路径数据到树状数据结构

    我有以下数据 root root blue root blue temp root main root main dev root main back root etc init root etc init dev root etc ini
  • 为什么 C# 三元运算符不能与委托一起使用?

    当分支选择函数时 使用三元运算符来选择函数可能是有意义的 但这是不可能的 为什么 public class Demo protected bool branch protected void demo1 protected void dem
  • 安装 Windows 服务以使用 ServiceAccount.User 在用户凭据下运行,但不提示

    我创建了一个 C Windows 服务及其随附的用于创建安装程序的 Visual Studio 安装项目 它成功安装了该服务 当我从枚举中选择任何值时ServiceAccount除了ServiceAccount User 该服务安装时不会提
  • 启动离线 ClickOnce 应用程序并等待退出

    我已经部署了 ClickOnce Windows 窗体应用程序 应用程序 A 另一个应用程序 应用程序 B 以文件名作为参数启动应用程序 A 我用这段代码做到这一点 var basePath Environment GetFolderPat
  • 斯威夫特 NSNotificationCenter?

    我正在尝试让 UITextViewTextDidChangeNotification 正常工作 我是 NSNotificationCenter 的新手 所以我很难理解到底发生了什么 我在故事板中有一个 UITextView 我在 ViewC
  • 无锁“如果不为零则递减”

    我目前正在用 C 重新发明线程池的轮子 我已经消除了代码中的几乎所有锁 除了以下构造的多个实例之外 std atomic size t counter void produce counter void try consume if cou
  • 使用迭代器与索引访问向量元素有什么区别?

    使用迭代器与索引访问向量元素有什么优点 为什么迭代器比索引更好 在索引不可用的情况下 例如 std list 对于 例子 在通用函数接受迭代器的情况下 叫做 编写应该使用的函数模板时 不止一种容器类型 他们的存在是为了创造均匀性在所有容器和
  • 将“列表”项附加到 StringBuilder

    我尝试将项目附加到List
  • 如何从源代码编译picoProlog?

    我是计算机科学专业的学生 正在学习 Prolog 逻辑编程 我发现了一个有趣的 Prolog 解释器 picoProlog http spivey oriel ox ac uk corner Logic Programming http s
  • 如何在类型依赖于派生类的基模板类中声明成员?

    给定一个使用 CRTP 的基类 我正在考虑在基模板类中声明一个成员 其中类型依赖于派生类 虽然以下内容按预期工作 template
  • C# 我可以访问没有完整限定名称的枚举吗

    我有一个 C 枚举类型 它以非常长的限定名称结尾 例如 DataSet1 ContactLogTypeValues ReminderToFollowupOverdueInvoice 为了便于阅读 如果我可以告诉一个特定的函数只使用名称的最后
  • 从枚举获取 DescriptionAttribute [重复]

    这个问题在这里已经有答案了 我有一个枚举 用于查找协调字符串值 其中一个枚举中有一个空格 因此我尝试使用描述属性来查找该值 在找到 DescriptionAttribute 后 我在转换回公共类时遇到问题 public class Addr
  • 如何确保 IsInRole 检查不使用缓存的凭据

    我有一个连接到 WCF 服务的 WPF 客户端 我想锁定某些功能 以便只有某些用户可以执行某些操作 WCF 服务在执行服务方法时模拟客户端用户 操作系统是Windows XP 我正在读书这个问题 https stackoverflow co
  • Sharepoint 客户端 GetFolderByServerRelativeUrl 文件夹修改日期

    我试图在使用 GetFolderByServerRelativeUrl 函数时检索文件夹的 修改日期 和 创建日期 我该怎么做 我只能从中获取relativeUrl 和文件夹名称 下面是我为检索文件夹所做的操作 请帮忙 FolderColl
  • 抓取框架 NTSCtoUSB 加密狗、opencv2、python 包装器

    Context 我一直在研究 opencv2 的 python 包装器 我想尝试一些想法并使用类似于汽车 后视 摄像头的广角摄像头 我从一辆报废的撞车上得到了一根 它有 4 根电线 我从电线的颜色编码中进行了有根据的猜测 将其连接起来 以便
  • 只需用矩形掩盖 UIView

    我想知道如何简单地屏蔽任何类型的 UIView 的可见区域 到目前为止 我读过的所有答案 教程都描述了使用图像 渐变或创建圆角进行遮罩 这比我所追求的要先进得多 示例 我有一个边界为 0 0 100 100 的 UIView 我想使用蒙版切
  • 从构造函数调用虚函数[重复]

    这个问题在这里已经有答案了 我正在阅读有效的C https en wikipedia org wiki Scott Meyers 还有 第 9 条 在构造或销毁期间切勿调用虚函数 我想知道我的代码是否正确 即使它违反了这条规则 using
  • 使用 Asihttprequest 和 iPhone 的 Json 框架解析 JSON 数据

    我一直在学习如何使用 JSON 框架和 iOS 的 ASIHTTPRequest 来解析 JSON 我已经使用 twitter feed 以及通过社区教程的自定义 feed 进行了测试 一切都很顺利 然后我想我将使用 Microsoft O
  • “System.Int64”类型的表达式不能用于返回类型“System.Object”

    我正在尝试创建以下形式的表达式 e gt e CreationDate CreationDate属于类型long 但是我希望表达式返回一个object反而 我想用object作为返回类型 因为表达式是在运行时根据查询参数动态构建的 查询参数

随机推荐