1. 程式人生 > >opencv圖片旋轉後圖片無法填滿視窗有黑邊解決方法

opencv圖片旋轉後圖片無法填滿視窗有黑邊解決方法


cv::Mat cutImg;
int dw = g_rect.Width(), dh = g_rect.Height();
int imgw = rotateImg.cols, imgh = rotateImg.rows;
if (imgw >= dw && imgh >= dh)  //法一
{
// 直接擷取
cutImg = rotateImg(cv::Rect((imgw-dw)/2, (imgh-dh)/2, dw, dh));
}
else  // 法二
{
/*
比如:視窗是w1=800,h1=600
圖片是w2=640,h2=480
則最大縮放比例是2,從圖片中截取出圖片大小為:w1/2=400, h1/2=300
獲取視窗的最大縮放比例,再從圖片中截取出該最大比例對應的圖片,用以適應視窗
*/
// 縮放再擷取
static int cutScale = 0;
if (cutScale == 0)
{
cutScale = GetImgToWndScale(dw, dh, imgw, imgh);
}
if (cutScale != 0)
{
// 取得縮放後在原圖中擷取的位置
int x = (imgw - dw / cutScale) / 2;
int y = (imgh - dh / cutScale) / 2;
int w = dw / cutScale;
int h = dh / cutScale;
cutImg = rotateImg(cv::Rect(x, y, w, h));
}
}

// 獲取視窗的最大縮放比例,縮放後的長寬大小小於圖片長寬大小
int GetImgToWndScale(int windw, int windh, int imgw, int imgh)
{
if (windw <= 0 || windh <= 0 || imgw <= 0 || imgh <= 0)
{
return 0;
}

int scale = 1;
while (1)
{
int sw = windw / scale;
int sh = windh / scale;
if (sw <= imgw && sh <= imgh)
{
return scale;
}
scale++;
}
}