<span style="font-size:14px;">#include "stdafx.h"
#include"opencv2/opencv.hpp"
#include <stdio.h>
using namespace cv;
using namespace std;
Mat img, gray, edge, Cedge;
int edgeThresh = 1;
const char * keys = { "{1| |fruits.jpg|input image name}" };
static void help()
{
printf("\nThis sample demonstrates Canny edge detection\n"
"Call:\n"
" /.edge [image_name -- Default is fruits.jpg]\n\n");
}
static void onTrackbar(int, void*)
{
blur(gray, edge, Size(3, 3));
Canny(edge, edge, edgeThresh, edgeThresh * 3, 3);
Cedge = Scalar::all(0);
edge.copyTo(Cedge);
imshow("Edge Img", Cedge);
}
int main(int argc, const char** argv)
{
help();
CommandLineParser parser(argc, argv, keys);
string filename = parser.get<string>("1");
Cedge.create(img.size(), img.type());
img = imread(filename, 1);
if (img.empty())
{
printf("cannot read image file:%s\n", filename.c_str());
return -1;
}
cvtColor(img, gray, CV_BGR2GRAY);
namedWindow("Edge Img", 1);
createTrackbar("canny", "Edge Img", &edgeThresh, 100, onTrackbar);
onTrackbar(0, 0);
waitKey(0);
return 0;
}
</span>
CommandLineParser的类
好像在opencv的c版本中,应该是opencv1.0以前,还没有出现CommandLineParser这个类,最近看到opencv2.3后面的版本里自带的samples,很多都用到了CommandLineParser这个类,那么这个类到底有什么作用呢,从命名大概可以猜出这是个命令行解析类。因为我们知道opencv是一个开源库,所以其很少有图形操作方面的api,基本上还是基于命令行执行的。那么这个类的出现主要是方便用户在命令行使用过程中减少工作量,可以在程序文件中直接指定命令行中的参数指令,方便了调试。
第一行就是这个类的构造函数,前2个参数是命令行传过来的,第3个就是刚刚定义的keys了,keys的结构有一定规律,比如说"{ c | camera | 0 | use camera or not}"都是用大括号和双引号引起来,然后中间的内容分成4断,用”|”分隔开,分别表示简称,文件来源,文件值和帮助语句。第二行和第三行表示打开摄像头和打开文件,文件的文件名等都在keys指针中了。