opencv编写均值滤波_opencv简单实践5:中值滤波、均值滤波(普通滤波 高斯滤波)、边缘提取和磨皮程序...

本博客通过OpenCV库展示了中值滤波、均值滤波(高斯滤波)及边缘检测的实现。包括从摄像头捕获图像,对图像进行中值滤波、均值滤波和高斯滤波操作,以及使用Sobel算子进行边缘检测。同时,还包含了一个简单的磨皮程序,利用HSV色彩空间和滤波技术使人物皮肤显得平滑。
摘要由CSDN通过智能技术生成

https://github.com/DawnYue/Convolution

练习1 中值滤波:

读取摄像头图像,并对摄像头图像进行中值滤波输入,灰度图或彩色图2.输出3.中值区域size,3,5,7等

#include

#include

using namespace cv;

using namespace std;

//练习1

Mat  g_dstImage;

int main(int argc, char*argv)

{

//实例化一个videocapture类,名称为cap

VideoCapture cap;

//cap(0)表示打开本机的第一个摄像头

cap.open(0);

//isOpened()检查视频是否开启,正常开启返回1

if (!cap.isOpened())

{

std::cout << "不能打开视频文件" << std::endl;

return -1;

}

//获得视频的fps

double fps = cap.get(CAP_PROP_FPS);

std::cout << "fps" << fps << std::endl;

while (1)

{

cv::Mat frame;

bool rSucess = cap.read(frame);

frame.copyTo(g_dstImage);

medianBlur(frame, g_dstImage, 7);

if (!rSucess)

{

std::cout << "不能从视频中读取帧" << std::endl;

break;

}

else

{

imshow("中值滤波", g_dstImage);

}

waitKey(30); //延时30ms

}

return 0;

}

练习2 均值滤波:

读取摄像头图像,并对摄像头图像进行均值滤波输入,灰度图或彩色图 2.输出3.卷积尺寸Size格式 4.锚点,默认为(-1,-1),即中心5.边缘像素,一般设为默认

#include

#include

using namespace cv;

using namespace std;

//练习2

Mat  g_dstImage;

int main(int argc, char*argv)

{

//实例化一个videocapture类,名称为cap

VideoCapture cap;

//cap(0)表示打开本机的第一个摄像头

cap.open(0);

//isOpened()检查视频是否开启,正常开启返回1

if (!cap.isOpened())

{

std::cout << "不能打开视频文件" << std::endl;

return -1;

}

//获得视频的fps

double fps = cap.get(CAP_PROP_FPS);

std::cout << "fps" << fps << std::endl;

while (1)

{

cv::Mat frame;

bool rSucess = cap.read(frame);

frame.copyTo(g_dstImage);

blur(frame, g_dstImage, Size(11, 11), Point(-1, -1));

if (!rSucess)

{

std::cout << "不能从视频中读取帧" << std::endl;

break;

}

else

{

imshow("均值滤波", g_dstImage);

}

waitKey(30); //延时30ms

}

return 0;

}

练习3 均值滤波:

读取摄像头图像,并对摄像头图像进行均值滤波输入,灰度图或彩色图 2.输出3.卷积尺寸,Size格式4.X方向的sigma5.Y方向的sigma6.边缘像素,一般设为默认

#include

#include

using namespace cv;

using namespace std;

//练习3

Mat g_dstImage;

int main(int argc, char*argv)

{

//实例化一个videocapture类,名称为cap

VideoCapture cap;

//cap(0)表示打开本机的第一个摄像头

cap.open(0);

//isOpened()检查视频是否开启,正常开启返回1

if (!cap.isOpened())

{

std::cout << "不能打开视频文件" << std::endl;

return -1;

}

//获得视频的fps

double fps = cap.get(CAP_PROP_FPS);

std::cout << "fps" << fps << std::endl;

while (1)

{

cv::Mat frame;

bool rSucess = cap.read(frame);

frame.copyTo(g_dstImage);

GaussianBlur(frame, g_dstImage, Size(13,13), 0, 0);

if (!rSucess)

{

std::cout << "不能从视频中读取帧" << std::endl;

break;

}

else

{

imshow("高斯滤波", g_dstImage);

}

waitKey(30); //延时30ms

}

return 0;

}

练习4

边缘提取读取摄像头图像,并对摄像头图像进行边缘提取,分别提取x,y方向上的边缘,观察结果有何区别。输入,灰度图或彩色图 2.输出 3.输出图像的类型4 and 5. x方向和y方向的微分阶数6.卷积核尺寸7.卷积核尺寸,输出微分值的缩放因数8.附加值,加载输出结果上。9.边缘像素,

#include

#include

using namespace cv;

using namespace std;

//练习4

int main(int argc, char*argv)

{

//实例化一个videocapture类,名称为cap

VideoCapture cap;

//cap(0)表示打开本机的第一个摄像头

cap.open(0);

//isOpened()检查视频是否开启,正常开启返回1

if (!cap.isOpened())

{

std::cout << "不能打开视频文件" << std::endl;

return -1;

}

//获得视频的fps

double fps = cap.get(CAP_PROP_FPS);

std::cout << "fps" << fps << std::endl;

while (1)

{

cv::Mat frame;

cv::Mat dx,dy;

bool rSucess = cap.read(frame);

if (!rSucess)

{

std::cout << "不能从视频中读取帧" << std::endl;

break;

}

else

{

cvtColor(frame, frame, COLOR_BGR2GRAY);// 将原图像转换为灰度图像

threshold(frame, frame, 0, 255, CV_THRESH_OTSU);//二值化

convertScaleAbs(frame, frame);

Sobel(frame, dx, CV_16SC1, 1, 0,3);//X方向

Sobel(frame, dy, CV_16SC1, 0, 1,3);//Y方向

imshow("Sobel边缘检测dx", dx);

imshow("Sobel边缘检测dy", dy);

}

waitKey(30); //延时30ms

}

return 0;

}

练习5

边缘提取Sobel函数,后3个参数与一般使用默认。

1,0表示x方向求1一阶微分,y方向求0阶,即求x方向的边缘 同理,表示求y方向的边缘

练习5 磨皮程序

使用已经学过的算法,实现一个简单的磨皮程序,即人物皮肤的部分显得光滑。(mask,卷积,HSV范围限制)

#include

#include

using namespace cv;

using namespace std;

//练习5

int main(int argc, char*argv)

{

//HSV

double scale = 0.5;

//0-180肤色

double i_minH = 0;

double i_maxH = 20;

//0-255

double i_minS = 43;

double i_maxS = 255;

//0-255

double i_minV = 55;

double i_maxV = 255;

//实例化一个videocapture类,名称为cap

VideoCapture cap;

//cap(0)表示打开本机的第一个摄像头

cap.open(0);

//isOpened()检查视频是否开启,正常开启返回1

if (!cap.isOpened())

{

std::cout << "不能打开视频文件" << std::endl;

return -1;

}

//获得视频的fps

double fps = cap.get(CAP_PROP_FPS);

std::cout << "fps" << fps << std::endl;

while (1)

{

cv::Mat frame;

cv::Mat hsvMat;

cv::Mat detectMat;

cv::Mat medMat;

cv::Mat dipMat;

bool rSucess = cap.read(frame);

if (!rSucess)

{

std::cout << "不能从视频中读取帧" << std::endl;

break;

}

else

{

Size ResImgSiz = Size(frame.cols*scale, frame.rows*scale);

Mat rFrame = Mat(ResImgSiz, frame.type());

resize(frame, rFrame, ResImgSiz, INTER_LINEAR);

cvtColor(rFrame, hsvMat, COLOR_BGR2HSV);

rFrame.copyTo(detectMat);

cv::inRange(hsvMat, Scalar(i_minH, i_minS, i_minV), Scalar(i_maxH, i_maxS, i_maxV), detectMat);

cv::GaussianBlur(rFrame, medMat, Size(5,5), 3, 3);

rFrame.copyTo(dipMat);

medMat.copyTo(dipMat, detectMat);

imshow("while :in the range", detectMat);

imshow("display", dipMat);

imshow("frame", rFrame);

waitKey(30);

}

waitKey(30); //延时30ms

}

return 0;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值