我是一名本科生,我正在使用CoreML
制作一些HumanSeg iPhone应用程序。由于我的模型需要在原始视频帧上***调整大小和黑色填充***,我不能依赖Vision
(它只提供调整大小,但没有黑色填充),必须自己进行转换。
我有CVPixelBuffer
帧,我已经使用以下代码将其转换为cv::Mat
:
CVPixelBufferLockBaseAddress(pixelBuffer, 0);
int bufferWidth = (int) CVPixelBufferGetWidth(pixelBuffer);
int bufferHeight = (int) CVPixelBufferGetHeight(pixelBuffer);
int bytePerRow = (int) CVPixelBufferGetBytesPerRow(pixelBuffer);
unsigned char *pixel = (unsigned char *) CVPixelBufferGetBaseAddress(pixelBuffer);
Mat image = Mat(bufferHeight, bufferWidth, CV_8UC4, pixel, bytePerRow);
CVPixelBufferUnlockBaseAddress(pixelBuffer, 0);
/*I'll do my resizing and padding here*/
// How can I implement this function?
convertToCVPixelBuffer(image);
“但是现在,在我完成了预处理工作之后,我必须***将***cv::Mat
***转换回***一个CVPixelBuffer
,然后将其馈送到CoreML
模型中。我该如何实现这一点?(或者Vision可以使用一些特殊的技术来实现黑色填充吗?)”
任何帮助都将不胜感激。
3条答案
按热度按时间wqnecbli1#
请看下面的代码...检查宽度和高度是否可以被64整除是必要的,否则我们会得到奇怪的结果,因为
BytesPerRow
与cv::Mat
和CVPixelBuffer
不匹配x33g5p2x2#
首先,将mat转换为UIImage(或iOS API中的任何其他类),检查此question。然后,将生成的图像转换为
CVPixelBuffer
,如this。jhdbpxl93#
对于那些将要使用新的OpenCV Swift Package 器的人来说,这里是@Abhinava翻译成Swift的代码