简体   繁体   English

如何将CMSampleBuffer转换为std :: vector <char> ?

[英]How to convert CMSampleBuffer to std::vector<char>?

I have image stream from my AVCaptureVideoDataOutputSampleBufferDelegate method: 我的AVCaptureVideoDataOutputSampleBufferDelegate方法具有图像流:

- (void)captureOutput:(AVCaptureOutput )captureOutput didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer fromConnection:(AVCaptureConnection )connection;

Then I want to take sampleBuffer and provide it for C++ openalrp library to recognize which takes image bytes or raw pixel data. 然后,我想获取sampleBuffer并将其提供给C ++ openalrp库,以识别哪个需要图像字节或原始像素数据。 What function should I use and how to convert sampleBuffer to suitable input type, std::vector<char> or unsigned char* pixelData ? 我应该使用什么函数以及如何将sampleBuffer转换为合适的输入类型std::vector<char>unsigned char* pixelData

From alpr.h file: alpr.h文件:

  // Recognize from an image on disk
  AlprResults recognize(std::string filepath);

  // Recognize from byte data representing an encoded image (e.g., BMP, PNG, JPG, GIF etc).
  AlprResults recognize(std::vector<char> imageBytes);

  // Recognize from byte data representing an encoded image (e.g., BMP, PNG, JPG, GIF etc).
  AlprResults recognize(std::vector<char> imageBytes, std::vector<AlprRegionOfInterest> regionsOfInterest);

  // Recognize from raw pixel data.  
  AlprResults recognize(unsigned char* pixelData, int bytesPerPixel, int imgWidth, int imgHeight, std::vector<AlprRegionOfInterest> regionsOfInterest);

Finally, I've found the answer: 最后,我找到了答案:

CVPixelBufferRef imageBuffer = CMSampleBufferGetImageBuffer(sampleBuffer);
CVPixelBufferLockBaseAddress(imageBuffer, 0);
unsigned char *tempAddress = (unsigned char *)CVPixelBufferGetBaseAddress(imageBuffer);
size_t bytesPerRow = CVPixelBufferGetBytesPerRow(imageBuffer);
size_t width = CVPixelBufferGetWidth(imageBuffer);
size_t height = CVPixelBufferGetHeight(imageBuffer);
CVPixelBufferUnlockBaseAddress(imageBuffer, 0);

CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
CGContextRef newContext = CGBitmapContextCreate(tempAddress, width, height, 8, bytesPerRow, colorSpace, kCGBitmapByteOrder32Little | kCGImageAlphaPremultipliedFirst);
CGImageRef newImage = CGBitmapContextCreateImage(newContext);
CGContextRelease(newContext);
CGColorSpaceRelease(colorSpace);
UIImage *image = [UIImage imageWithCGImage:newImage];

NSData *data = UIImagePNGRepresentation(image);

if (data) {
    unsigned long int len = data.length;
    std::vector<char> v((char *)data.bytes, (char *)data.bytes + len);
    alpr::AlprResults results = delegate->recognize(v);
}

CGImageRelease(newImage);

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM