opencv图片旋转: 先找到图片的中心点,再根据中心点旋转角度,img为获取的图片,rotateImg为旋转后的图片。
cv::Mat img; cv::Point2f center = cv::Point2f(img.cols / 2, img.rows / 2); // 旋转中心 double angle = 270; // 旋转角度 double scale = 1; // 缩放尺度 cv::Mat rotateMat; rotateMat = cv::getRotationMatrix2D(center, angle, scale); cv::Mat rotateImg; cv::warpAffine(img, rotateImg, rotateMat, img.size());
以上是旋转的代码,一般窗口显示图片经过旋转后,比如以上旋转270度后,窗口上除了图片外的区域默认是黑色填充,即为黑边。 有黑边的窗口影响查看图片,现在需要将黑边去掉,让图片充满窗口。 法一,将摄像头分辨率设置到比窗口宽高还大,从获取到的图片中截取窗口宽高大小一样的图片 法二:根据窗口宽高获得窗口相对图片的最大比例(但缩放后的宽高比图片宽高小),再从图片中截取窗口相应比例的图片出来放大显示到窗口。如此会有一个情况是图片是经过放大显示。 /* 比如:窗口是w1=800,h1=600 图片是w2=640,h2=480 则最大缩放比例是2,从图片中截取出图片大小为:w1/2=400, h1/2=300 获取窗口的最大缩放比例,再从图片中截取出该最大比例对应的图片,再放大来适应窗口 */
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++; } }