使用open cv以来,一直对指针操作有点糊涂,不太明白。近来仔细研读了指针操作的相关文章,发现指针这个东西让很多人都头疼。你会用它时,也就那么回事,而当你不明不白,就会用的漏洞百出,很小的bug都困扰你半天,让人十分头疼。此为我练习写的小程序,也让我对指针有了更深层次的理解。
1.题目
2.代码部分
编译环境为vs2017+open cv 3.4.0,图片为RGB图像,来源网络。
#include "pch.h"
#include <opencv2/opencv.hpp>
#include <iostream>
#include <math.h>
using namespace cv;
using namespace std;
int main(int argc, char** grav) {
Mat src = imread("C:\\Users\\Pictures\\Saved Pictures\\704-160P1221011.jpg");
if (!src.data)
{
cout << "can not load the picture" << endl;
return -1;
}
//获取图像宽度、高度、通道数
int cols = (src.cols-1)*src.channels();
int rows = src.rows;
int offsets = src.channels();
//创建一个和原图像同样大小的图像,并把所有像素赋予0
Mat dst=Mat::zeros(src.size(), src.type());
for (int row = 1; row < rows - 1; row++)//列数控制
{
//获取三行像素
const uchar* current = src.ptr<uchar>(row);
const uchar* previous = src.ptr<uchar>(row - 1);
const uchar* next = src.ptr<uchar>(row + 1);
uchar* output = dst.ptr<uchar>(row);
for (int col = offsets; col < cols; col++)
{
output[col] =saturate_cast<uchar>(5 * current[col] - (previous[col] + next[col] + current[col + offsets] + current[col - offsets]));
}
}
imshow("【原图】",src);
imshow("【成果图】", dst);
//获取执行时间
double t = getTickCount();
double timecount = (getTickCount() - t) / getTickFrequency();
cout << "time cousume: " <<endl<<setprecision(5)<<timecount;
waitKey(0);
return 0;
}
3.效果图
4.注解
我们在计算过程中使用了“像素范围处理saturate_cast”函数限制其像素范围在0-255之间。而如果不用这个函数,就会出现很多不合理的像素。效果图如下:
5.api函数
整个掩膜处理过程可以用api函数filter2D实现。实现代码:
Mat kernal = (Mat_<char>(3, 3) << 0, -1, 0, -1, 5, -1, 0, -1, 0);
filter2D(src, dst, src.depth(), kernal)
效果题主已经测试,与我们之前的效果一样。
今天的已经完毕,谢谢大家!