OpenCV  4.10.0
开源计算机视觉库
加载中...
搜索中...
无匹配项
samples/cpp/laplace.cpp

使用拉普拉斯变换进行边缘检测的示例

#include <ctype.h>
#include <stdio.h>
#include <iostream>
using namespace cv;
using namespace std;
static void help(char** argv)
{
cout <<
"\n该程序演示了使用 OpenCV 函数 Laplacian() 进行拉普拉斯点/边缘检测\n"
"它从您选择的相机捕获图像:0、1、... 默认值为 0\n"
"调用方式:\n"
<< argv[0] << " -c=<相机编号,默认值为 0> -p=<要解码/捕获的下一帧的索引>\n" << endl;
}
enum {GAUSSIAN, BLUR, MEDIAN};
int sigma = 3;
int smoothType = GAUSSIAN;
int main( int argc, char** argv )
{
cv::CommandLineParser parser(argc, argv, "{ c | 0 | }{ p | | }");
help(argv);
string camera = parser.get<string>("c");
if (camera.size() == 1 && isdigit(camera[0]))
cap.open(parser.get<int>("c"));
else
cap.open(samples::findFileOrKeep(camera));
if (!cap.isOpened())
{
cerr << "无法打开相机/视频流: " << camera << endl;
return 1;
}
cout << "视频 " << parser.get<string>("c") <<
": 宽度=" << cap.get(CAP_PROP_FRAME_WIDTH) <<
", 高度=" << cap.get(CAP_PROP_FRAME_HEIGHT) <<
", 帧数=" << cap.get(CAP_PROP_FRAME_COUNT) << endl;
int pos = 0;
if (parser.has("p"))
{
pos = parser.get<int>("p");
}
if (!parser.check())
{
parser.printErrors();
return -1;
}
if (pos != 0)
{
cout << "跳转到帧 #" << pos << endl;
if (!cap.set(CAP_PROP_POS_FRAMES, pos))
{
cerr << "错误: 不支持跳转" << endl;
}
}
namedWindow("Laplacian", WINDOW_AUTOSIZE);
createTrackbar("Sigma", "Laplacian", &sigma, 15, 0);
Mat smoothed, laplace, result;
for(;;)
{
Mat frame;
cap >> frame;
if( frame.empty() )
break;
int ksize = (sigma*5)|1;
if(smoothType == GAUSSIAN)
GaussianBlur(frame, smoothed, Size(ksize, ksize), sigma, sigma);
else if(smoothType == BLUR)
blur(frame, smoothed, Size(ksize, ksize));
else
medianBlur(frame, smoothed, ksize);
Laplacian(smoothed, laplace, CV_16S, 5);
convertScaleAbs(laplace, result, (sigma+1)*0.25);
imshow("Laplacian", result);
char c = (char)waitKey(30);
if( c == ' ' )
smoothType = smoothType == GAUSSIAN ? BLUR : smoothType == BLUR ? MEDIAN : GAUSSIAN;
if( c == 'q' || c == 'Q' || c == 27 )
break;
}
return 0;
}
用于命令行解析的工具。
定义 utility.hpp:820
n 维密集数组类
定义 mat.hpp:812
bool empty() const
如果数组没有元素,则返回 true。
用于指定图像或矩形大小的模板类。
定义 types.hpp:335
用于从视频文件、图像序列或相机捕获视频的类。
定义 videoio.hpp:731
virtual bool open(const String &filename, int apiPreference=CAP_ANY)
打开视频文件、捕获设备或 IP 视频流以进行视频捕获。
virtual bool set(int propId, double value)
在 VideoCapture 中设置属性。
virtual bool isOpened() const
如果视频捕获已初始化,则返回 true。
virtual double get(int propId) const
返回指定的 VideoCapture 属性。
void convertScaleAbs(InputArray src, OutputArray dst, double alpha=1, double beta=0)
缩放、计算绝对值并将结果转换为 8 位。
#define CV_16S
定义 interface.h:76
void imshow(const String &winname, InputArray mat)
在指定的窗口中显示图像。
int waitKey(int delay=0)
等待按下的键。
void namedWindow(const String &winname, int flags=WINDOW_AUTOSIZE)
创建窗口。
int createTrackbar(const String &trackbarname, const String &winname, int *value, int count, TrackbarCallback onChange=0, void *userdata=0)
创建滑块并将其附加到指定的窗口。
void medianBlur(InputArray src, OutputArray dst, int ksize)
使用中值滤波器模糊图像。
void blur(InputArray src, OutputArray dst, Size ksize, Point anchor=Point(-1,-1), int borderType=BORDER_DEFAULT)
使用归一化盒式滤波器模糊图像。
void GaussianBlur(InputArray src, OutputArray dst, Size ksize, double sigmaX, double sigmaY=0, int borderType=BORDER_DEFAULT)
使用高斯滤波器模糊图像。
void Laplacian(InputArray src, OutputArray dst, int ddepth, int ksize=1, double scale=1, double delta=0, int borderType=BORDER_DEFAULT)
计算图像的拉普拉斯算子。
int main(int argc, char *argv[])
定义 highgui_qt.cpp:3
与磁盘上的文件关联的文件存储的“黑盒”表示。
定义 core.hpp:102
STL 命名空间。