2011-11-03 558 views
12

我在android中使用OpenCV 2.3.1。我需要將圖像裁剪成一半。 我在做什麼是使用opencv在android中裁剪圖像

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

將在第三步做的工作或我要補充更多的東西? 我在opencv 2.3文檔中看到了Mat :: operator(),但不幸的是無法在opencv android包中找到它。

+2

您是否嘗試過做它,你上面提出的方式,它沒有工作? –

回答

18

有一些Mat類的構造函數,其中一個需要Mat和ROI(感興趣的區域)。

這裏是如何做到這一點在Android中/ Java的:

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

只是爲了澄清roi。 x,y是要設置爲roi的矩形的起始位置,width - height是矩形的寬度 - 高度。它不是圖像的寬度 - 高度。例如,如果您有320 * 240的圖片,並且想要將圖片分成兩張新圖片。第一個roi將是Rect roi = new Rect(0,0,width/2,height);第二個Rect roi =新Rect(160,0,寬度/ 2,高度); –

+0

好的回答.... – Aniket

+0

idk爲什麼但這個邏輯給我例外 – Fay007

2

我一直做裁剪這種方式:

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(); 

希望幫助!

+0

感謝您的幫助。如果我使用Mat裁剪進行特徵檢測而無需克隆它輸出。 opencv會在裁剪部分或完整圖像中查找特徵嗎? – akniazi

0

似乎cv::getRectSubPix做你想做的。另外,您不必分配比您需要的更多空間。如果裁剪區域沒有對準確切的像素,它也需要插值。

這應該做你想做的。輸入類型將是輸出類型。

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