一、邂逅OpenCV
1.OpenCV2到OpenCV3的错误
添加头文件“#include
2.debug 下可以运行,release下不可以运行
eg:因为字符串读取问题引起的诸如图片加载不了、指针越界、内存错误
简单粗暴的方法:
把debug和release下的 .lib 依赖库 都添加进去 =+=
3.简单Demo
图像腐蚀(erode)
#include //OpenCV highgui模块头文件
#include //OpenCV图像处理头文件
using namespace cv; //包含cv命名空间
int main()
{
//载入原图
Mat srcImage = imread("1.jpg");
//显示原图
imshow("【原图】腐蚀操作" , srcImage);
//进行腐蚀操作
Mat element = getStrucingElement(MORPH_RECT,Size(15,15));
Mat dstImage;
erode(srcImage,dstImage,element);
//显示效果图
imshow("【效果图】腐蚀操作",dstImage);
waitKey(0);
return 0;
}
图像模糊(均值滤波操作blur)
blur(srcImage,dstImage,Size(7,7));
边缘检测Canny算子
载入图像,并将其转成灰度图,再用blur函数进行图像模糊以降噪,然后用canny函数进行边缘检测,最后进行显示。
#include //OpenCV highgui模块头文件
#include //OpenCV图像处理头文件
using namespace cv; //包含cv命名空间
int main()
{
Mat srcImage = imread("1.jpg");
imshow("【原图】边缘检测" , srcImage);
Mat edge,grayImage;
//【1】将原始图转换为灰度图像
cvtColor(srcImage,grayImage,cv_BGR2RAY);
//【2】先用3X3内核来降噪
blur(grayImage,edge,Size(3,3));
//【3】运行sunny算子
Canny(edge,edge,3,9,3);
//【4】显示效果图
imshow("【效果图】腐蚀操作",dstImage);
waitKey(0);
return 0;
}
4.视频操作
4.1读取视频
首先,先定义一个Mat变量,用于存储每一帧的图像,接着读取当前帧到Mat变量中,然后调用imshow显示当前的这一帧图像,并用waitKey延迟30毫秒,开始下一次循环。
#include
using namespace cv;
int main()
{
//【1】读入视频
VedioCapture capture("1.avi");
//【2】循环显示每一帧
while(1)
{
Mat frame; //定义一个变量Mat,用于存储每一帧图像
capture>>frame; //读取当前帧
//若视频播放完成,退出循环
if(frame.empty())
{
break;
}
imshow("【读取视频】,frame"); //显示当前帧
waitKey(30);
}
return 0;
}
4.2调用摄像头
#include
using namespace cv;
int main()
{
//【1】从摄像头读入视频
VedioCapture capture(0); //参数设为0 表示调用摄像头
//【2】循环显示每一帧
while(1)
{
Mat frame; //定义一个变量Mat,用于存储每一帧图像
capture>>frame; //读取当前帧
imshow("【读取视频】,frame"); //显示当前帧
waitKey(30); //延迟30ms
}
return 0;
}
下面,通过调用摄像头来配合canny边缘检测,得到canny边缘检测并高斯模糊后的摄像头采集视频
#include
using namespace cv;
int main()
{
//从摄像头读入视频
VedioCapture capture(0); //参数设为0 表示调用摄像头
Mat edges;
//循环显示每一帧
while(1)
{
//【1】读入图像
Mat frame; //定义一个变量Mat,用于存储每一帧图像
capture>>frame; //读取当前帧
//【2】将原图像转换为灰度图像
cvtColor(frame,edges,COLOR_BGR2GRAY);//转化BRG彩色图为灰度图
//【3】使用3X3内核降噪(2X3+1 = 7)
blur(edges,edges,Size(7,7));
//【4】进行canny边缘检测并显示
Canny(edges,edges,0,30,3);
imshow("【被Canny后的视频】",edges); //显示当前帧
if( waitKey(30) >= 0) break; //延迟30ms
}
return 0;
}