1、算法简要说明
文中介绍Canny、Sobel和Laplacian三个opencv接口的边缘检测,下面主要介绍三个接口的参数说明并附带测试用例,文中并未介绍算法原理,后期会做介绍。
2 代码示例:
/***************************************************************
*代码通过读取摄像头中的图片进行处理,
*如需要测试其他图片只需要更改Mat结构路径即可
*********************************************************/
#include <iostream>
#include <opencv2/opencv.hpp>
#include <opencv2/highgui/highgui.hpp>
using namespace std;
using namespace cv;
void borderDetect(Mat img, string sType, Mat& dstImg)
{
if (img.empty())
{
cout << "borderDetect no image !" << endl;
return;
}
if (sType == "Canny")
{
Mat grayImg, edge;
if (img.channels() == 1)
{
grayImg = img;
}
else if (img.channels() == 3)
{
cvtColor(img, grayImg, CV_BGR2GRAY);
}
blur(grayImg, edge, Size(5, 5));
Canny(edge, dstImg, 3, 9, 3);
}
else if (sType == "Sobel")
{
Mat grad_x, grad_y;
Mat abs_grad_x, abs_grad_y;
// 求X方向梯度
Sobel(img, grad_x, CV_16S, 1, 0, 3, 1, 1, BORDER_DEFAULT);
convertScaleAbs(grad_x, abs_grad_x);
// 求Y方向梯度
Sobel(img, grad_y, CV_16S, 0, 1, 3, 1, 1, BORDER_DEFAULT);
convertScaleAbs(grad_y, abs_grad_y);
// 合并梯度
addWeighted(abs_grad_x, 0.5, abs_grad_y, 0.5, 0, dstImg);
}
else if (sType == "Laplacian")
{
Mat gray, mask;
GaussianBlur(img, img, Size(3, 3), 0, 0, BORDER_DEFAULT);
cvtColor(img, gray, CV_BGR2GRAY);
Laplacian(gray, mask, CV_16S, 3, 1, 0, BORDER_DEFAULT);
convertScaleAbs(mask, dstImg);
}
}
int main()
{
Mat frame;
VideoCapture videoFiles;
videoFiles.open(0);
if (!videoFiles.isOpened())
{
cout << "open camera failed." << endl;
std::system("pause");
return 0;
}
while (true)
{
videoFiles >> frame;
if (frame.empty())
{
continue;
}
Mat dstImg;
Mat img;
borderDetect(frame, "Canny", dstImg);
if (dstImg.channels() == 1)
{
vector<Mat> vDstImg(3);
vDstImg[0] = dstImg;
vDstImg[1] = dstImg;
vDstImg[2] = dstImg;
merge(vDstImg, img);
}
else if (dstImg.channels() == 3)
{
img = dstImg;
}
Mat showImg(frame.rows, frame.cols * 2, CV_8UC3);
frame.copyTo(showImg(Rect(0, 0, frame.cols, frame.rows)));
img.copyTo(showImg(Rect(frame.cols, 0, frame.cols, frame.rows)));
imshow("border detect", showImg);
waitKey(20);
}
system("pause");
return 0;
}