1 Test.cpp
2 #include<iostream>
3 #include<opencv2core.hpp>
4 #include<opencv2highgui.hpp>
5 #include<opencv2imgproc.hpp>
6 #include <opencv2imgcodecs.hpp>
7 using namespace cv;
8 using namespace std;
9
10 Mat img,src_gray;
11 Mat dst,detected_edges;//源图像,灰度
12 int edgeThresh = 1;
13 int lowThreshold;//用户移动轨迹栏输入的值(下限)
14 int const max_lowThreshold = 100;//检测器的上限
15 int ratio = 3;//在程序中设置为下限阈值的三倍(在Canny的建议之后)
16 int kernel_size = 3;//要在内部使用的Sobel内核的大小
17 const char* window_name = "原图";
18 const char* window_name1 = "提取边缘图";
19 static void CannyThreshold(int,void*)
20 {
21 blur(src_gray,detected_edges,Size(3,3));//内核大小为3的过滤器模糊图像
22 Canny(detected_edges,lowThreshold,lowThreshold*::ratio,kernel_size);//源图像、检测器的输出(可以与输入相同)、、、
23 dst = Scalar::all(0);//零填充dst图像(意味着图像是完全黑色的)
24 img.copyTo(dst,detected_edges);//仅映射被识别为边缘的图像的区域(在黑色背景上)
25 imshow(window_name1,dst);
26 }
27
28 int main(int argc,char** argv)
29 {
30 if (argc != 2)
31 {
32 cout << "参数为空!" << endl;
33 return -1;
34 }
35 img = imread(argv[1],IMREAD_COLOR); // 读取Img
36 if (img.empty())
37 {
38 return -1;
39 }
40 namedWindow(window_name,WINDOW_AUTOSIZE);//创建新窗口进行展示原图
41 imshow(window_name,img);
42
43 dst.create(img.size(),img.type());//创建一个相同类型和大小的img(为dst)的矩阵
44 cvtColor(img,src_gray,COLOR_BGR2GRAY);//图像转换为灰度级
45 namedWindow(window_name1,WINDOW_AUTOSIZE);//创建新窗口进行展示结果图
46 createTrackbar("Min Threshold:",window_name1,&lowThreshold,max_lowThreshold,CannyThreshold);//创建一个跟踪栏,供用户输入Canny检测器的下限
47 CannyThreshold(0,0);
48 waitKey(0);//等待 用户按任何键时退出
49 return 0;
50 }
51
52 在PIE SDK调用时的写法
53 using PIE.Framework;
54 using System;
55 using System.Collections.Generic;
56 using System.Diagnostics;
57 using System.Linq;
58 using System.Text;
59 using System.Threading;
60
61 namespace OpenCVMapApplication
62 {
63 /// <summary>
64 /// PIESDK和Opencv结合命令
65 /// </summary>
66 class OpenCVTestCommand : DesktopCommand
67 {
68 /// <summary>
69 /// 构造函数
70 /// </summary>
71 public OpenCVTestCommand()
72 {
73 this.Caption = "OpenCVTestCommand";
74 this.Name = "OpenCVTestCommand";
75 }
76
77 /// <summary>
78 /// 单击事件
79 /// </summary>
80 public override void OnClick()
81 {
82 string exe_path = @"D:codeC++OpencvTestx64DebugOpencvTest.exe"; // 执行调用exe路径
83 string[] the_args = { @"D:PicDatawindow7.png" }; // exe执行的参数
84 bool result = StartProcess(exe_path,the_args);
85 if (result == false)
86 {
87 System.Windows.Forms.MessageBox.Show("执行失败!");
88 }
89 }
90 /// <summary>
91 /// 进程调用
92 /// </summary>
93 /// <param name="exePath">exe执行程序调用</param>
94 /// <param name="args">参数</param>
95 /// <returns></returns>
96 public bool StartProcess(string exePath,params string[] args)
97 {
98 string s = "";
99 foreach (string arg in args)
100 {
101 s = s + arg + " ";
102 }
103 s = s.Trim();
104 Process process = new Process();//创建进程对象
105 ProcessStartInfo startInfo = new ProcessStartInfo(exePath,s); // 括号里是(程序名,参数)
106 process.StartInfo = startInfo;
107 process.Start();
108 return true;
109 }
110 }
111 }
112 注意:
113 Test.cpp和OpenCVTestCommand.cs的关系是后者调用前者的生成结果文件OpencvTest.exe;
114 最后一步如何在PIE搭建的程序调用OpenCVTestCommand命令呢?
115 首先在PIE搭建的界面上创建创建一个按钮,点击按钮的Click事件为toolStripButton_LoadOpenCV_Click
116 /// <summary>
117 /// 调用OpenCV例子
118 /// </summary>
119 /// <param name="sender">事件触发器</param>
120 /// <param name="e">事件参数</param>
121 private void toolStripButton_LoadOpenCV_Click(object sender,EventArgs e)
122 {
123 ICommand command = new OpenCVTestCommand(); //调用命令
124 command.OnCreate(mapControlMain);
125 command.OnClick();
126 }