J'ai lu tous les documents que je peux trouver, mais je n'arrive pas à obtenir un simple appel de vImage. J'ai juste besoin d'un vrai exemple. La documentation est très clairsemée.Est-ce que quelqu'un a un exemple de code pour le traitement de vImage sur iOS?
Répondre
La documentation n'existe pas car les bibliothèques vImage ne sont pas disponibles sur iOS.
vImage est disponible sur iOS depuis la version 5.0. The documentation is here.
Je crois qu'ils font partie du cadre Accelerate. Je peux obtenir vImage_Buffer et similaires à compiler. – akaru
@akaru - C'est sur le Mac, pas iOS. vDSP et BLAS sont sur iOS, mais pas sur les autres bibliothèques: http://developer.apple.com/library/ios/#documentation/Accelerate/Reference/AccelerateFWRef/_index.html Vous pourriez obtenir le code vImage pour compiler si vous ciblez le simulateur, car celui-ci fonctionne sur un Mac, mais il ne fonctionnera pas sur un appareil iOS. –
@brad Merci pour les heads up. J'utilisais le simulateur. D'oh! – akaru
Mise à jour de la réponse d'Ole Bermann: le framework Accelerate a été ajouté dans iOS 5.0.
Si vous traitez la vidéo en temps réel, et votre entrée est traitée dans un tampon de pixel, voici comment copier ce tampon dans un vImage, à quel point vous pouvez appeler ce que vous des commandes comme:
- (CVPixelBufferRef)copyRenderedPixelBuffer:(CVPixelBufferRef)pixelBuffer
{
CVPixelBufferLockBaseAddress(pixelBuffer, 0);
// vImage processing
vImage_Error err;
vImage_Buffer buffer;
buffer.data = (unsigned char *)CVPixelBufferGetBaseAddress(pixelBuffer);
buffer.rowBytes = CVPixelBufferGetBytesPerRow(pixelBuffer);
buffer.width = CVPixelBufferGetWidth(pixelBuffer);
buffer.height = CVPixelBufferGetHeight(pixelBuffer);
vImageCVImageFormatRef vformat = vImageCVImageFormat_CreateWithCVPixelBuffer(pixelBuffer);
vImage_CGImageFormat cgformat = {
.bitsPerComponent = 8,
.bitsPerPixel = 32,
.bitmapInfo = kCGBitmapByteOrderDefault,
.colorSpace = NULL, //sRGB
};
const CGFloat bgColor[3] = {0.0, 0.0, 0.0};
vImageBuffer_InitWithCVPixelBuffer(&buffer, &cgformat, pixelBuffer, vformat, bgColor, kvImageNoAllocate);
vImage_Buffer outbuffer;
void *tempBuffer;
tempBuffer = malloc(CVPixelBufferGetBytesPerRow(pixelBuffer) * CVPixelBufferGetHeight(pixelBuffer));
outbuffer.data = tempBuffer;
outbuffer.rowBytes = CVPixelBufferGetBytesPerRow(pixelBuffer);
outbuffer.width = CVPixelBufferGetWidth(pixelBuffer);
outbuffer.height = CVPixelBufferGetHeight(pixelBuffer);
err = vImageEqualization_ARGB8888(&buffer, &outbuffer, kvImageNoFlags);
if(err != -1)
err = vImageContrastStretch_ARGB8888(&buffer, &outbuffer, kvImageNoFlags);
if(err != -1)
err = vImageBuffer_CopyToCVPixelBuffer(&outbuffer, &cgformat, pixelBuffer, vformat, bgColor, kvImageNoFlags);
if(err != -1)
free(tempBuffer);
CVPixelBufferUnlockBaseAddress(pixelBuffer, 0);
return (CVPixelBufferRef)CFRetain(pixelBuffer);
}
Un exemple encore plus avancé, avec l'optimisation des fonctions d'égalisation et d'étirement (ignorer en commentaire le code, mais vous pouvez l'utiliser-il fonctionne aussi:
- (CVPixelBufferRef)copyRenderedPixelBuffer:(CVPixelBufferRef)pixelBuffer {
CVPixelBufferLockBaseAddress(pixelBuffer, 0);
unsigned char *base = (unsigned char *)CVPixelBufferGetBaseAddress(pixelBuffer);
size_t width = CVPixelBufferGetWidth(pixelBuffer);
size_t height = CVPixelBufferGetHeight(pixelBuffer);
size_t stride = CVPixelBufferGetBytesPerRow(pixelBuffer);
vImage_Buffer _img = {
.data = base,
.height = height,
.width = width,
.rowBytes = stride
};
vImage_Error err;
vImage_Buffer _dstA, _dstR, _dstG, _dstB;
err = vImageBuffer_Init(&_dstA, height, width, 8 * sizeof(uint8_t), kvImageNoFlags);
if (err != kvImageNoError)
NSLog(@"vImageBuffer_Init (alpha) error: %ld", err);
err = vImageBuffer_Init(&_dstR, height, width, 8 * sizeof(uint8_t), kvImageNoFlags);
if (err != kvImageNoError)
NSLog(@"vImageBuffer_Init (red) error: %ld", err);
err = vImageBuffer_Init(&_dstG, height, width, 8 * sizeof(uint8_t), kvImageNoFlags);
if (err != kvImageNoError)
NSLog(@"vImageBuffer_Init (green) error: %ld", err);
err = vImageBuffer_Init(&_dstB, height, width, 8 * sizeof(uint8_t), kvImageNoFlags);
if (err != kvImageNoError)
NSLog(@"vImageBuffer_Init (blue) error: %ld", err);
err = vImageConvert_ARGB8888toPlanar8(&_img, &_dstA, &_dstR, &_dstG, &_dstB, kvImageNoFlags);
if (err != kvImageNoError)
NSLog(@"vImageConvert_ARGB8888toPlanar8 error: %ld", err);
err = vImageEqualization_Planar8(&_dstR, &_dstR, kvImageNoFlags);
if (err != kvImageNoError)
NSLog(@"vImageEqualization_Planar8 (red) error: %ld", err);
err = vImageEqualization_Planar8(&_dstG, &_dstG, kvImageNoFlags);
if (err != kvImageNoError)
NSLog(@"vImageEqualization_Planar8 (green) error: %ld", err);
err = vImageEqualization_Planar8(&_dstB, &_dstB, kvImageNoFlags);
if (err != kvImageNoError)
NSLog(@"vImageEqualization_Planar8 (blue) error: %ld", err);
err = vImageConvert_Planar8toARGB8888(&_dstA, &_dstR, &_dstG, &_dstB, &_img, kvImageNoFlags);
if (err != kvImageNoError)
NSLog(@"vImageConvert_Planar8toARGB8888 error: %ld", err);
err = vImageContrastStretch_ARGB8888(&_img, &_img, kvImageNoError);
if (err != kvImageNoError)
NSLog(@"vImageContrastStretch_ARGB8888 error: %ld", err);
err = vImagePermuteChannels_ARGB8888(&_img, &_img, map, kvImageNoFlags);
if (err != kvImageNoError)
NSLog(@"vImagePermuteChannels_ARGB8888 error: %ld", err);
free(_dstA.data);
free(_dstR.data);
free(_dstG.data);
free(_dstB.data);
CVPixelBufferUnlockBaseAddress(pixelBuffer, 0);
return (CVPixelBufferRef)CFRetain(pixelBuffer);
}
Se e 'http: // stackoverflow.com/questions/10068095/uiimage-devenir-fuzzy-when-it-was-scaled-whyios-5-0' pour un exemple de code –