Avn*_*arr 4 opencv frameworks ios
我想做发现教程在这里与OpenCV的框架ios的视频处理.
我已成功将ios openCv框架加载到我的项目中 - 但我的框架与教程中提供的框架之间似乎存在不匹配,我希望有人可以帮助我.
OpenCv使用cv::Mat类型来表示图像.当使用AVfoundation委托来处理来自相机的图像时 - 我需要将所有内容转换CMSampleBufferRef为该类型.
看来教程中提供的openCV框架提供了一个名为using的库
#import <opencv2/highgui/cap_ios.h>
Run Code Online (Sandbox Code Playgroud)
使用新的委托命令:
任何人都可以指出我在哪里可以找到这个框架或者可能在CMSampleBufferRef和之间快速转换cv::Mat
编辑
opencv框架中有很多细分(至少对于ios).我已经通过各种"官方"网站下载了它,并使用他们的说明使用fink和brew等工具.我甚至比较了安装到/ usr/local/include/opencv /的头文件.他们每次都不同.下载openCV项目时 - 同一个项目中有各种cmake文件和冲突的自述文件.我认为我成功地为IOS构建了一个好的版本,<opencv2/highgui/cap_ios.h>通过此链接内置了框架(使用此标头)的avcapture功能 ,然后使用命令在ios目录中使用python脚本构建库python opencv/ios/build_framework.py ios.我会尝试更新
Ham*_*mer 13
这是我使用的转换.你锁定像素缓冲区,创建一个cv :: Mat,用cv :: Mat处理,然后解锁像素缓冲区.
- (void)captureOutput:(AVCaptureOutput *)captureOutput didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer fromConnection:(AVCaptureConnection *)connection
{
CVImageBufferRef pixelBuffer = CMSampleBufferGetImageBuffer(sampleBuffer);
CVPixelBufferLockBaseAddress( pixelBuffer, 0 );
int bufferWidth = CVPixelBufferGetWidth(pixelBuffer);
int bufferHeight = CVPixelBufferGetHeight(pixelBuffer);
int bytesPerRow = CVPixelBufferGetBytesPerRow(pixelBuffer);
unsigned char *pixel = (unsigned char *)CVPixelBufferGetBaseAddress(pixelBuffer);
cv::Mat image = cv::Mat(bufferHeight,bufferWidth,CV_8UC4,pixel, bytesPerRow); //put buffer in open cv, no memory copied
//Processing here
//End processing
CVPixelBufferUnlockBaseAddress( pixelBuffer, 0 );
}
Run Code Online (Sandbox Code Playgroud)
上面的方法不会复制任何内存,因此你不拥有内存,pixelBuffer会为你释放它.如果你想要自己的缓冲区副本,那就行了
cv::Mat copied_image = image.clone();
Run Code Online (Sandbox Code Playgroud)
这是之前接受的答案中代码的更新版本,可以与任何iOS设备一起使用.
由于至少在iPhone 6和iPhone 6+上bufferWidth不等于bytePerRow,我们需要指定每行中的字节数作为cv :: Mat构造函数的最后一个参数.
CVImageBufferRef pixelBuffer = CMSampleBufferGetImageBuffer(sampleBuffer);
CVPixelBufferLockBaseAddress(pixelBuffer, 0);
int bufferWidth = CVPixelBufferGetWidth(pixelBuffer);
int bufferHeight = CVPixelBufferGetHeight(pixelBuffer);
int bytePerRow = CVPixelBufferGetBytesPerRow(pixelBuffer);
unsigned char *pixel = (unsigned char *) CVPixelBufferGetBaseAddress(pixelBuffer);
cv::Mat image = cv::Mat(bufferHeight, bufferWidth, CV_8UC4, pixel, bytePerRow);
// Process you cv::Mat here
CVPixelBufferUnlockBaseAddress(pixelBuffer, 0);
Run Code Online (Sandbox Code Playgroud)
该代码已经在运行iOS 10的iPhone5,iPhone6和iPhone6 +上进行了测试.
| 归档时间: |
|
| 查看次数: |
5259 次 |
| 最近记录: |