函数介绍:
saturate_cast 处理数值的溢出问题
参数:要处理的数据类型
cv::saturate_cast<uchar> 这里将数据处理成uchar类型 小于0返回0 大于255返回255 0<=参数<=255返回参数
#include "CMainWindow.h"
#include <QMessageBox>
#include <QPushButton>
#include <opencv2/opencv.hpp>
CMainWindow::CMainWindow(QWidget *parent)
: QMainWindow(parent)
{
ui.setupUi(this);
QPushButton* pButton = new QPushButton(ui.centralWidget);
pButton->setText(QString::fromLocal8Bit("加载图片"));
connect(pButton, &QPushButton::clicked, this, &CMainWindow::onBtnClick);
}
void CMainWindow::onBtnClick()
{
//读取图像
cv::Mat imageSrc = cv::imread("G:/Saved Pictures/6306b8677191b8b0267fb566.jpg");
if (imageSrc.empty())
{
QMessageBox::information(this, "error", "load image error");
return;
}
cv::imshow("src image", imageSrc);
cv::Mat imageDst(imageSrc.size(), imageSrc.type());
//增强图像的模版
cv::Mat kernel = (cv::Mat_<char>(3, 3) << 0, -1, 0, -1, 5, -1, 0, -1, 0);
//进行卷积运算
cv::filter2D(imageSrc, imageDst, imageSrc.depth(), kernel);
cv::imshow("dest image", imageDst);
//自己实现
//mat存储的列数 rgb为例 一个图像的像素为 imageSrc.rows * imageSrc.cols 一个像素点由rgb三个255组成
int nCols = imageSrc.cols * imageSrc.channels();
//mat存储的行数
int nRows = imageSrc.rows;
cv::Mat myMat = cv::Mat::zeros(imageSrc.size(), imageSrc.type());
int nOffsetX = imageSrc.channels();
//从第2行开始 循环到倒数第二行
for (int nRow = 1; nRow < nRows - 1; nRow++)
{
//获取上一行的指针
const uchar* pPrev = imageSrc.ptr<uchar>(nRow - 1);
//当前行的指针
const uchar* pCur = imageSrc.ptr<uchar>(nRow);
//下一行的指针
const uchar* pNext = imageSrc.ptr<uchar>(nRow + 1);
//保存到新的Mat中
uchar* pOut = myMat.ptr<uchar>(nRow);
for (int nCol = imageSrc.channels(); nCol < nCols; nCol++)
{
pOut[nCol] = cv::saturate_cast<uchar>(5 * pCur[nCol] - (pCur[nCol - nOffsetX] + pCur[nCol + nOffsetX] + pPrev[nCol] + pNext[nCol]));
}
}
cv::imshow("my image", myMat);
}