0
所以,我有一個問題:C++ opencv的重縮放邊界矩形
Im做android的OpenCV中和,因爲,即時通訊與我的手機拍攝的圖像非常高的分辨率,我想調整圖像以較小的,得到輪廓和處理圖像,然後在原始圖像上創建邊界矩形。爲此,我需要縮放邊界框,以便它完美地適合我的原始圖像。我的代碼與原始圖像上的處理和繪圖邊界框非常吻合,但是,如何進行縮放?以下是代碼片段:
Mat &image = *(Mat *) matAddrRgba;
//over here I should resize image and do the processing with the resized one, and in the end, scale everything back so I can draw the bounding box to the original
Rect bounding_rect;
Mat thr(image.rows, image.cols, CV_8UC1);
cvtColor(image, thr, CV_BGR2GRAY); //Convert to gray
threshold(thr, thr, 150, 255, THRESH_BINARY + THRESH_OTSU); //Threshold the gray
vector<vector<Point> > contours; // Vector for storing contour
vector<Vec4i> hierarchy;
RotatedRect rect;
findContours(thr, contours, hierarchy, CV_RETR_CCOMP,
CV_CHAIN_APPROX_SIMPLE); // Find the contours in the image
sort(contours.begin(), contours.end(),
compareContourAreas); //Store the index of largest contour
bounding_rect = boundingRect(contours[0]);
rect = minAreaRect(contours[0]);
// matrices we'll use
Mat rot_mat, rotated;
// get angle and size from the bounding box
float angle = rect.angle;
Size rect_size = rect.size;
if (rect.angle < -45.) {
angle += 90.0;
swap(rect_size.width, rect_size.height);
}
rot_mat = getRotationMatrix2D(rect.center, angle, 1);
warpAffine(image, rotated, rot_mat, image.size(), INTER_CUBIC);
image = rotated;
cvtColor(image, thr, CV_BGR2GRAY); //Convert to gray
threshold(thr, thr, 150, 255, THRESH_BINARY + THRESH_OTSU); //Threshold the gray
findContours(thr, contours, hierarchy, CV_RETR_CCOMP, CV_CHAIN_APPROX_SIMPLE);
sort(contours.begin(), contours.end(), compareContourAreas);
bounding_rect = boundingRect(contours[0]);
image = Mat(image, bounding_rect);
「如何進行縮放」 - 除非是指攀爬或從物體上移除刻度,那麼*乘法*往往會起到訣竅的作用。你可以在新的寬度和高度上增加一個「scale-1」的偏移量,使它更好一些。拿一張方形紙畫出來 - 這不應該花費太多工作才能弄清楚。 –
@DanMašek我得到了我的計算結果的旋轉矩形。然後旋轉圖像使其與我的設備完美對齊。在那之後,我用這個旋轉矩形切割(從它創建邊界矩形)。如何擴展/放大/擴大邊界矩形? –
例如,如果您將圖像的寬度和高度加倍,則相同的縮放係數適用於座標。所以邊界框的x和y座標會加倍,寬度和高度會加倍。 –