2011-11-03 9 views
12

Estoy usando OpenCV 2.3.1 en android. Necesito recortar la imagen a la mitad. Lo que estoy haciendo esCroping image en android usando opencv

Mat mIntermediateMat2 = new Mat(frame_height,frame_width,rgba.type); 
    mIntermediateMat2 = rgba.clone(); 
    mIntermediateMat2 = mIntermediateMat2.rowRange(0,frame_height/2); 

¿El tercer paso hacer el trabajo o tengo que añadir algo más? Vi a Mat :: operator() en la documentación de opencv 2.3 pero desafortunadamente no pude encontrarlo en el paquete de android de opencv.

+2

¿Ha intentado hacerlo de la forma en que se propone más arriba y que no funcionó? –

Respuesta

18

Hay algunos constructores para la clase Mat, uno de los cuales toma una Mat y un ROI (región de interés).

He aquí cómo hacerlo en Android/Java:

Mat uncropped = getUncroppedImage(); 
Rect roi = new Rect(x, y, width, height); 
Mat cropped = new Mat(uncropped, roi); 
+1

solo para aclarar el roi. x, y es la ubicación de inicio del rectángulo que desea establecer como roi, y ancho - alto es el ancho - alto del rectángulo. no es el ancho de la imagen, la altura. por ejemplo, si tiene una imagen de 320 * 240 y desea dividir esa imagen en 2 imágenes nuevas. el primer roi será Rect roi = new Rect (0, 0, ancho/2, alto); el segundo Rect roi = new Rect (160, 0, width/2, height); –

+0

Buena respuesta .... – Aniket

+0

idk ¿por qué? Pero esta lógica me da una excepción – Fay007

2

que siempre he hecho de cultivo de esta manera:

Mat image = ...; // fill it however you want to 
Mat crop(image, Rect(0, 0, image.cols, image.rows/2)); // NOTE: this will only give you a reference to the ROI of the original data 

// if you want a copy of the crop do this: 
Mat output = crop.clone(); 

Espero que ayude!

+0

Gracias por su ayuda. Si utilizo Mat crop para la detección de características sin clonarlo en la salida. ¿Buscará el opencv características en la parte de recorte o en la imagen completa? – akniazi

0

Parece que cv::getRectSubPix hace lo que quiere. Además, no tiene que asignar más espacio del que necesita. También hace las interpolaciones necesarias si el área recortada no está alineada sobre un píxel exacto.

Esto debería hacer lo que quiera. El tipo de entrada será el tipo de salida.

Mat dst; 
getRectSubPix(src, Size(src.rows()/2,src.cols()), Point2f(src.rows()/4, src.cols()/2), dst);