若该文为原创文章,未经允许不得转载
原博主博客地址:https://blog.csdn.net/qq21497936
原博主博客导航:https://blog.csdn.net/qq21497936/article/details/102478062
本文章博客地址:https://blog.csdn.net/qq21497936/article/details/105633350
各位读者,知识无穷而人力有穷,要么改需求,要么找专业人士,要么自己研究
红胖子(红模仿)的博文大全:开发技术集合(包含Qt实用技术、树莓派、三维、OpenCV、OpenGL、ffmpeg、OSG、单片机、软硬结合等等)持续更新中...(点击传送门).
上一篇:《OpenCV开发笔记(四十四):红胖子8分钟带你深入了解霍夫圆变换(图文并茂+浅显易懂+程序源码)》
下一篇:《OpenCV开发笔记(四十六):红胖子8分钟带你深入了解仿射变化(图文并茂+浅显易懂+程序源码)》
红胖子,来也!!!
本篇章讲解重映射。
图像检测中对图像进行旋转、镜像等操作是可以对原尺寸进行操作的,有专门的旋转、翻转函数进行处理。
《OpenCV开发笔记(八):OpenCV常用操作之计时、缩放、旋转、镜像》
该文章中,也同样实现了部分简单重映射效果,使用的四个函数:
重映射,按照与原图一样大小的尺寸,通过像素下标的序列号的矩阵进行映射得到结果,简而言之,就是把一幅图像中某位置的像素放置到另一个图片指定位置的过程。
void remap( InputArray src,
OutputArray dst,
InputArray map1,
InputArray map2,
int interpolation,
int borderMode = BORDER_CONSTANT,
const Scalar& borderValue = Scalar());
void OpenCVManager::testRemap()
{
QString fileName1 = "E:/qtProject/openCVDemo/openCVDemo/modules/openCVManager/images/1.jpg";
cv::Mat srcMat = cv::imread(fileName1.toStdString());
cv::Mat dstMat;
int width = 400;
int height = 300;
cv::resize(srcMat, srcMat, cv::Size(width, height));
cv::String windowName = _windowTitle.toStdString();
cvui::init(windowName);
cv::Mat windowMat = cv::Mat(cv::Size(srcMat.cols * 2, srcMat.rows * 4),
srcMat.type());
while(true)
{
windowMat = cv::Scalar(0, 0, 0);
cv::Mat mat = windowMat(cv::Range(srcMat.rows * 0, srcMat.rows * 1),
cv::Range(srcMat.cols * 0, srcMat.cols * 1));
cv::addWeighted(mat, 0.0f, srcMat, 1.0f, 0.0f, mat);
cv::Mat mapX;
cv::Mat mapY;
// 第一种x翻转
{
mapX.create(srcMat.size(), CV_32FC1);
mapY.create(srcMat.size(), CV_32FC1);
for(int row = 0; row < srcMat.rows; row++)
{
for(int col = 0; col < srcMat.cols; col++)
{
mapX.at(row, col) = static_cast(col);
mapY.at(row, col) = static_cast(srcMat.rows - row - 1);
}
}
dstMat.create(srcMat.size(), srcMat.type());
cv::remap(srcMat,
dstMat,
mapX,
mapY,
CV_INTER_LINEAR,
cv::BORDER_CONSTANT,
cv::Scalar(255, 0, 0));
mat = windowMat(cv::Range(srcMat.rows * 1, srcMat.rows * 2),
cv::Range(srcMat.cols * 0, srcMat.cols * 1));
cv::addWeighted(mat, 0.0f, dstMat, 1.0f, 0.0f, mat);
}
// 第二种y翻转
{
mapX.create(srcMat.size(), CV_32FC1);
mapY.create(srcMat.size(), CV_32FC1);
for(int row = 0; row < srcMat.rows; row++)
{
for(int col = 0; col < srcMat.cols; col++)
{
mapX.at(row, col) = static_cast(srcMat.cols - col - 1);
mapY.at(row, col) = static_cast(row);
}
}
dstMat.create(srcMat.size(), srcMat.type());
cv::remap(srcMat,
dstMat,
mapX,
mapY,
CV_INTER_LINEAR,
cv::BORDER_CONSTANT,
cv::Scalar(255, 0, 0));
mat = windowMat(cv::Range(srcMat.rows * 0, srcMat.rows * 1),
cv::Range(srcMat.cols * 1, srcMat.cols * 2));
cv::addWeighted(mat, 0.0f, dstMat, 1.0f, 0.0f, mat);
}
// 第三种x,y翻转
{
mapX.create(srcMat.size(), CV_32FC1);
mapY.create(srcMat.size(), CV_32FC1);
for(int row = 0; row < srcMat.rows; row++)
{
for(int col = 0; col < srcMat.cols; col++)
{
mapX.at(row, col) = static_cast(srcMat.cols - col - 1);
mapY.at(row, col) = static_cast(srcMat.rows - row - 1);
}
}
dstMat.create(srcMat.size(), srcMat.type());
cv::remap(srcMat,
dstMat,
mapX,
mapY,
CV_INTER_LINEAR,
cv::BORDER_CONSTANT,
cv::Scalar(255, 0, 0));
mat = windowMat(cv::Range(srcMat.rows * 1, srcMat.rows * 2),
cv::Range(srcMat.cols * 1, srcMat.cols * 2));
cv::addWeighted(mat, 0.0f, dstMat, 1.0f, 0.0f, mat);
}
// 第四种:右半边拉伸一倍
{
mapX.create(srcMat.size(), CV_32FC1);
mapY.create(srcMat.size(), CV_32FC1);
for(int row = 0; row < srcMat.rows; row++)
{
for(int col = 0; col < srcMat.cols; col++)
{
mapX.at(row, col) = static_cast(col / 2);
mapY.at(row, col) = static_cast(row);
}
}
dstMat.create(srcMat.size(), srcMat.type());
cv::remap(srcMat,
dstMat,
mapX,
mapY,
CV_INTER_LINEAR,
cv::BORDER_CONSTANT,
cv::Scalar(255, 0, 0));
mat = windowMat(cv::Range(srcMat.rows * 2, srcMat.rows * 3),
cv::Range(srcMat.cols * 0, srcMat.cols * 1));
cv::addWeighted(mat, 0.0f, dstMat, 1.0f, 0.0f, mat);
}
// 第五种,缩小1/2,并显示在中间,底色为蓝色
{
mapX.create(srcMat.size(), CV_32FC1);
mapY.create(srcMat.size(), CV_32FC1);
for(int row = 0; row < srcMat.rows; row++)
{
for(int col = 0; col < srcMat.cols; col++)
{
if(col < srcMat.cols / 4 || row < srcMat.rows / 4)
{
mapX.at(row, col) = -1;
mapY.at(row, col) = -1;
}else if(col >= srcMat.cols / 4 * 3 || row >= srcMat.rows / 4 * 3)
{
mapX.at(row, col) = -1;
mapY.at(row, col) = -1;
}else{
mapX.at(row, col) = static_cast((col - srcMat.cols / 4) * 2);
mapY.at(row, col) = static_cast((row - srcMat.rows / 4) * 2);
}
}
}
dstMat.create(srcMat.size(), srcMat.type());
cv::remap(srcMat,
dstMat,
mapX,
mapY,
CV_INTER_LINEAR,
cv::BORDER_CONSTANT,
cv::Scalar(255, 0, 0));
mat = windowMat(cv::Range(srcMat.rows * 2, srcMat.rows * 3),
cv::Range(srcMat.cols * 1, srcMat.cols * 2));
cv::addWeighted(mat, 0.0f, dstMat, 1.0f, 0.0f, mat);
}
// 第六种,矩阵旋转90度(输出必须和输入大小一样,此时可以使用resize缩放至快高对调的比例)
{
mapX.create(srcMat.size(), CV_32FC1);
mapY.create(srcMat.size(), CV_32FC1);
for(int row = 0; row < srcMat.rows; row++)
{
for(int col = 0; col < srcMat.cols; col++)
{
mapX.at(row, col) = static_cast(row);
mapY.at(row, col) = static_cast(col);
}
}
dstMat.create(srcMat.size(), srcMat.type());
cv::remap(srcMat,
dstMat,
mapX,
mapY,
CV_INTER_LINEAR,
cv::BORDER_CONSTANT,
cv::Scalar(255, 0, 0));
mat = windowMat(cv::Range(srcMat.rows * 3, srcMat.rows * 4),
cv::Range(srcMat.cols * 0, srcMat.cols * 1));
cv::addWeighted(mat, 0.0f, dstMat, 1.0f, 0.0f, mat);
}
// 第七种,顺时针倾斜45°
{
mapX.create(srcMat.size(), CV_32FC1);
mapY.create(srcMat.size(), CV_32FC1);
for(int row = 0; row < srcMat.rows; row++)
{
for(int col = 0; col < srcMat.cols; col++)
{
mapX.at(row, col) = static_cast((col + (srcMat.cols * 2 - (srcMat.rows - row) - 1)) % srcMat.cols);
mapY.at(row, col) = static_cast(row);
}
}
dstMat.create(srcMat.size(), srcMat.type());
cv::remap(srcMat,
dstMat,
mapX,
mapY,
CV_INTER_LINEAR,
cv::BORDER_CONSTANT,
cv::Scalar(255, 0, 0));
mat = windowMat(cv::Range(srcMat.rows * 3, srcMat.rows * 4),
cv::Range(srcMat.cols * 1, srcMat.cols * 2));
cv::addWeighted(mat, 0.0f, dstMat, 1.0f, 0.0f, mat);
}
// 更新
cvui::update();
// 显示
cv::imshow(windowName, windowMat);
// esc键退出
if(cv::waitKey(25) == 27)
{
break;
}
}
}
对应版本号v1.40.0
上一篇:《OpenCV开发笔记(四十四):红胖子8分钟带你深入了解霍夫圆变换(图文并茂+浅显易懂+程序源码)》
下一篇:《OpenCV开发笔记(四十六):红胖子8分钟带你深入了解仿射变化(图文并茂+浅显易懂+程序源码)》
原博主博客地址:https://blog.csdn.net/qq21497936
原博主博客导航:https://blog.csdn.net/qq21497936/article/details/102478062
本文章博客地址:https://blog.csdn.net/qq21497936/article/details/105633350