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;
}