I am using this. My cv:Mat configured in BGR (8UC3) colorFormat.
CVImageBufferRef β cv :: Mat
- (cv::Mat) matFromImageBuffer: (CVImageBufferRef) buffer { cv::Mat mat ; CVPixelBufferLockBaseAddress(buffer, 0); void *address = CVPixelBufferGetBaseAddress(buffer); int width = (int) CVPixelBufferGetWidth(buffer); int height = (int) CVPixelBufferGetHeight(buffer); mat = cv::Mat(height, width, CV_8UC4, address, 0); //cv::cvtColor(mat, _mat, CV_BGRA2BGR); CVPixelBufferUnlockBaseAddress(buffer, 0); return mat; }
cv :: Mat β CVImageBufferRef (CVPixelBufferRef)
- (CVImageBufferRef) getImageBufferFromMat: (cv::Mat) mat { cv::cvtColor(mat, mat, CV_BGR2BGRA); int width = mat.cols; int height = mat.rows; NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys: // [NSNumber numberWithBool:YES], kCVPixelBufferCGImageCompatibilityKey, // [NSNumber numberWithBool:YES], kCVPixelBufferCGBitmapContextCompatibilityKey, [NSNumber numberWithInt:width], kCVPixelBufferWidthKey, [NSNumber numberWithInt:height], kCVPixelBufferHeightKey, nil]; CVPixelBufferRef imageBuffer; CVReturn status = CVPixelBufferCreate(kCFAllocatorMalloc, width, height, kCVPixelFormatType_32BGRA, (CFDictionaryRef) CFBridgingRetain(options), &imageBuffer) ; NSParameterAssert(status == kCVReturnSuccess && imageBuffer != NULL); CVPixelBufferLockBaseAddress(imageBuffer, 0); void *base = CVPixelBufferGetBaseAddress(imageBuffer) ; memcpy(base, mat.data, _mat.total()*4); CVPixelBufferUnlockBaseAddress(imageBuffer, 0); return imageBuffer; }
newinH
source share