¿Por qué se cambia el tamaño de cv :: tan lento?

Estoy haciendo una detección de borde en un feed de video en vivo:

- (void)processImage:(Mat&)image; { cv::resize(image, smallImage, cv::Size(288,352), 0, 0, CV_INTER_CUBIC); edgeDetection(smallImage); cv::resize(smallImage, image, image.size(), 0, 0, CV_INTER_LINEAR); } 

edgeDetection realiza un levantamiento bastante pesado, y se ejecutaba a una velocidad de fotogtwigs bastante baja con el tamaño del fotogtwig de video de 1280×720. Agregar las llamadas resize disminuyó drásticamente la velocidad de fotogtwigs, bastante al revés de lo que esperaba. ¿Es solo porque una operación de cambio de tamaño es lenta o porque estoy haciendo algo mal?

smallImage se declara en el encabezado así:

 @interface CameraController : UIViewController <CvVideoCameraDelegate> { Mat smallImage; } 

No hay initialization, y funciona bien.

Cambiar el tamaño de una image es lento, y lo está haciendo dos veces para cada marco procesado. Existen varias maneras de mejorar su solución de alguna manera, pero debe proporcionar más detalles sobre el problema que está tratando de resolver.

Para comenzar, cambiar el tamaño de una image antes de detectar los bordes dará como resultado la alimentación de la detección de bordes con less información, de modo que resultará en la detección de less bordes o, al less, será más difícil detectarlos.

También el algorithm de cambio de tamaño utilizado afecta su velocidad, CV_INTER_LINEAR es el más rápido para cv :: cambiar el tamaño si mi memory no falla, y estás usando CV_INTER_CUBIC para el primer cambio de tamaño.

Una alternativa para cambiar el tamaño de una image es procesar una región más pequeña de la image original. Para eso, debería echar un vistazo a la image de la inversión (región de interés) . Es bastante fácil de hacer, tienes muchas preguntas en este sitio con respecto a ellas. La desventaja es que solo detectará bordes en una región y no para la image completa, que podría estar bien, según el problema.

Si realmente desea cambiar el tamaño de las imágenes, los desarrolladores de opencv usualmente usan las funciones pyrDown y pyrUp cuando quieren procesar imágenes más pequeñas, en lugar de cambiar su tamaño . Creo que es porque es más rápido, pero puedes probarlo para estar seguro. Más información sobre pyrDown y pyrUp en este enlace.

Acerca de cv :: cambiar el tamaño de los algorithms, aquí está la list:

 INTER_NEAREST - a nearest-neighbor interpolation INTER_LINEAR - a bilinear interpolation (used by default) INTER_AREA - resampling using pixel area relation. It may be a prefernetworking method for image decimation, as it gives moire'-free results. But when the image is zoomed, it is similar to the INTER_NEAREST method. INTER_CUBIC - a bicubic interpolation over 4x4 pixel neighborhood INTER_LANCZOS4 - a Lanczos interpolation over 8x8 pixel neighborhood 

No puedo decir con certeza si INTER_LINEAR es el más rápido de todos, pero es seguro más rápido que INTER_CUBIC .