博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
OpenCV图像旋转算法
阅读量:4604 次
发布时间:2019-06-09

本文共 3803 字,大约阅读时间需要 12 分钟。

采用最近邻插值算法的实现代码为:
cv::Mat matSrc = cv::imread("lena.jpg", 2 | 4);	if (matSrc.empty()) return;	const double degree = 45;	double angle = degree * CV_PI / 180.;	double alpha = cos(angle);	double beta = sin(angle);	int iWidth = matSrc.cols;	int iHeight = matSrc.rows;	int iNewWidth = cvRound(iWidth * fabs(alpha) + iHeight * fabs(beta));	int iNewHeight = cvRound(iHeight * fabs(alpha) + iWidth * fabs(beta));	double m[6];	m[0] = alpha;	m[1] = beta;	m[2] = (1 - alpha) * iWidth / 2. - beta * iHeight / 2.;	m[3] = -m[1];	m[4] = m[0];	m[5] = beta * iWidth / 2. + (1 - alpha) * iHeight / 2.;	cv::Mat M = cv::Mat(2, 3, CV_64F, m);	cv::Mat matDst1 = cv::Mat(cv::Size(iNewWidth, iNewHeight), matSrc.type(), cv::Scalar::all(0));	double D = m[0]*m[4] - m[1]*m[3];	D = D != 0 ? 1./D : 0;	double A11 = m[4]*D, A22 = m[0]*D;	m[0] = A11; m[1] *= -D;	m[3] *= -D; m[4] = A22;	double b1 = -m[0]*m[2] - m[1]*m[5];	double b2 = -m[3]*m[2] - m[4]*m[5];	m[2] = b1; m[5] = b2;	int round_delta = 512;//nearest	for (int y=0; y
(m[0] * x * 1024); int bdelta = cv::saturate_cast
(m[3] * x * 1024); int X0 = cv::saturate_cast
((m[1] * y + m[2]) * 1024) + round_delta; int Y0 = cv::saturate_cast
((m[4] * y + m[5]) * 1024) + round_delta; int X = (X0 + adelta) >> 10; int Y = (Y0 + bdelta) >> 10; if ((unsigned)X < iWidth && (unsigned)Y < iHeight) { matDst1.at
(y, x) = matSrc.at
(Y, X); } } } cv::imwrite("rotate_nearest_1.jpg", matDst1); M = cv::getRotationMatrix2D(cv::Point2f(iWidth / 2., iHeight / 2.), degree, 1); cv::Mat matDst2; cv::warpAffine(matSrc, matDst2, M, cv::Size(iNewWidth, iNewHeight), 0, 0, 0); cv::imwrite("rotate_nearest_2.jpg", matDst2);
采用双线性插值算法的实现代码为:
cv::Mat matSrc = cv::imread("lena.jpg", 2 | 4);	if (matSrc.empty()) return;	const double degree = 45;	double angle = degree * CV_PI / 180.;	double alpha = cos(angle);	double beta = sin(angle);	int iWidth = matSrc.cols;	int iHeight = matSrc.rows;	int iNewWidth = cvRound(iWidth * fabs(alpha) + iHeight * fabs(beta));	int iNewHeight = cvRound(iHeight * fabs(alpha) + iWidth * fabs(beta));	double m[6];	m[0] = alpha;	m[1] = beta;	m[2] = (1 - alpha) * iWidth / 2. - beta * iHeight / 2.;	m[3] = -m[1];	m[4] = m[0];	m[5] = beta * iWidth / 2. + (1 - alpha) * iHeight / 2.;	cv::Mat M = cv::Mat(2, 3, CV_64F, m);	cv::Mat matDst1 = cv::Mat(cv::Size(iNewWidth, iNewHeight), matSrc.type(), cv::Scalar::all(0));	double D = m[0]*m[4] - m[1]*m[3];	D = D != 0 ? 1./D : 0;	double A11 = m[4]*D, A22 = m[0]*D;	m[0] = A11; m[1] *= -D;	m[3] *= -D; m[4] = A22;	double b1 = -m[0]*m[2] - m[1]*m[5];	double b2 = -m[3]*m[2] - m[4]*m[5];	m[2] = b1; m[5] = b2;	for (int y=0; y
= iHeight) continue; short cbufy[2]; cbufy[0] = cv::saturate_cast
((1.f - fy) * 2048); cbufy[1] = 2048 - cbufy[0]; int sx = cvFloor(fx); fx -= sx; //if (sx < 0) { // fx = 0, sx = 0; //} //if (sx >= iWidth - 1) { // fx = 0, sx = iWidth - 2; //} if (sx < 0 || sx >= iWidth) continue; short cbufx[2]; cbufx[0] = cv::saturate_cast
((1.f - fx) * 2048); cbufx[1] = 2048 - cbufx[0]; for (int k=0; k
(y, x)[k] = (matSrc.at
(sy, sx)[k] * cbufx[0] * cbufy[0] + matSrc.at
(sy+1, sx)[k] * cbufx[0] * cbufy[1] + matSrc.at
(sy, sx+1)[k] * cbufx[1] * cbufy[0] + matSrc.at
(sy+1, sx+1)[k] * cbufx[1] * cbufy[1]) >> 22; } } } } cv::imwrite("rotate_bilinear_1.jpg", matDst1); M = cv::getRotationMatrix2D(cv::Point2f(iWidth / 2., iHeight / 2.), degree, 1); cv::Mat matDst2; cv::warpAffine(matSrc, matDst2, M, cv::Size(iNewWidth, iNewHeight), 1, 0, 0); cv::imwrite("rotate_bilinear_2.jpg", matDst2);

转载于:https://www.cnblogs.com/Toring/p/6628285.html

你可能感兴趣的文章
SqlSerch 查找不到数据
查看>>
集合相关概念
查看>>
Memcache 统计分析!
查看>>
(Python第四天)字符串
查看>>
个人介绍
查看>>
使用python动态特性时,让pycharm自动补全
查看>>
MySQL数据库免安装版配置
查看>>
你必知必会的SQL面试题
查看>>
html5 Canvas绘制时钟以及绘制运动的圆
查看>>
Unity3D热更新之LuaFramework篇[05]--Lua脚本调用c#以及如何在Lua中使用Dotween
查看>>
JavaScript空判断
查看>>
洛谷 P1439 【模板】最长公共子序列(DP,LIS?)
查看>>
python timeit
查看>>
Wireless Network 并查集
查看>>
51nod 1019 逆序数
查看>>
20145202马超《JAVA》预备作业1
查看>>
云推送注意(MSDN链接)
查看>>
IDEA 生成 jar 包
查看>>
加减乘除混合版
查看>>
linux基础6-bash shell编程
查看>>