ios - Artifacts when scaling Ycbcr (420f) with Accelerate -


i cannot find documentation or example on how resize ycbcr biplanar, supposedly main format should use on ios according apple. tried resize 2 planes this:

    // resize luma     vimage_buffer originalybuffer = { cvpixelbuffergetbaseaddressofplane(pixelbuffer, 0), cvpixelbuffergetheightofplane(pixelbuffer, 0), cvpixelbuffergetwidthofplane(pixelbuffer, 0), cvpixelbuffergetbytesperrowofplane(pixelbuffer, 0) };     vimage_buffer resizedybuffer;     vimagebuffer_init(&resizedybuffer, image_height, image_width, 8 * sizeof(pixel_8), kvimagenoflags);     error = vimagescale_planar8(&originalybuffer, &resizedybuffer, null, kvimagenoflags);     assert(!error);     cv::mat grey(image_height, image_width, cv_8uc1, resizedybuffer.data);      // resize chroma     vimage_buffer originaluvbuffer = { cvpixelbuffergetbaseaddressofplane(pixelbuffer, 1), cvpixelbuffergetheightofplane(pixelbuffer, 1), cvpixelbuffergetwidthofplane(pixelbuffer, 1), cvpixelbuffergetbytesperrowofplane(pixelbuffer, 1) };     vimage_buffer resizeduvbuffer;     vimagebuffer_init(&resizeduvbuffer, image_height / 2, image_width / 2, 8 * sizeof(pixel_16u), kvimagenoflags);     error = vimagescale_planar8(&originaluvbuffer, &resizeduvbuffer, null, kvimagenoflags);     assert(!error); 

but colors totally borked. luma channel works itself, it's problem chroma. format supposed use 2 bytes chroma, although not totally sure. if use vimagescale_planar8 half of screen green, else if use vimagescale_planar16u blue/yellow noise on image.

you can use vimagescale_cbcr8 uv buffer, it's ios 10+ :

// resize luma     vimage_buffer originalybuffer = { cvpixelbuffergetbaseaddressofplane(pixelbuffer, 0), cvpixelbuffergetheightofplane(pixelbuffer, 0), cvpixelbuffergetwidthofplane(pixelbuffer, 0), cvpixelbuffergetbytesperrowofplane(pixelbuffer, 0) };     vimage_buffer resizedybuffer;     vimagebuffer_init(&resizedybuffer, image_height, image_width, 8 * sizeof(pixel_8), kvimagenoflags);     error = vimagescale_planar(&originalybuffer, &resizedybuffer, null, kvimagenoflags);     assert(!error);     cv::mat grey(image_height, image_width, cv_8uc1, resizedybuffer.data);      // resize chroma     vimage_buffer originaluvbuffer = { cvpixelbuffergetbaseaddressofplane(pixelbuffer, 1), cvpixelbuffergetheightofplane(pixelbuffer, 1), cvpixelbuffergetwidthofplane(pixelbuffer, 1), cvpixelbuffergetbytesperrowofplane(pixelbuffer, 1) };     vimage_buffer resizeduvbuffer;     vimagebuffer_init(&resizeduvbuffer, image_height / 2, image_width / 2, 8 * sizeof(pixel_16u), kvimagenoflags);     error = vimagescale_cbcr8(&originaluvbuffer, &resizeduvbuffer, null, kvimagenoflags);     assert(!error); 

Comments