OpenCV 4.11.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; 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; -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
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 -1; 0;
}
cv::CommandLineParser
用于命令行解析。
cv::Mat
n维密集数组类
cv::Mat::empty
如果数组没有元素,则返回 true。
用于指定图像或矩形大小的模板类。
定义 types.hpp:335
用于从视频文件、图像序列或摄像头进行视频捕获的类。
定义 videoio.hpp:766
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 Laplacian(InputArray src, OutputArray dst, int ddepth, int ksize=1, double scale=1, double delta=0, int borderType=BORDER_DEFAULT)
计算图像的拉普拉斯算子。
void GaussianBlur(InputArray src, OutputArray dst, Size ksize, double sigmaX, double sigmaY=0, int borderType=BORDER_DEFAULT, AlgorithmHint hint=cv::ALGO_HINT_DEFAULT)
使用高斯滤波器模糊图像。
int main(int argc, char *argv[])
定义 highgui_qt.cpp:3
定义 core.hpp:107
STL命名空间。