-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathsearch.xml
168 lines (80 loc) · 541 KB
/
search.xml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
<?xml version="1.0" encoding="utf-8"?>
<search>
<entry>
<title>浅谈如何使用python进行爬虫操作</title>
<link href="/2022/02/12/%E6%B5%85%E8%B0%88%E5%A6%82%E4%BD%95%E4%BD%BF%E7%94%A8python%E8%BF%9B%E8%A1%8C%E7%88%AC%E8%99%AB%E6%93%8D%E4%BD%9C/"/>
<url>/2022/02/12/%E6%B5%85%E8%B0%88%E5%A6%82%E4%BD%95%E4%BD%BF%E7%94%A8python%E8%BF%9B%E8%A1%8C%E7%88%AC%E8%99%AB%E6%93%8D%E4%BD%9C/</url>
<content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="\assets\css\APlayer.min.css"><script src="\assets\js\APlayer.min.js" class="aplayer-secondary-script-marker"></script><p>近期对爬虫比较感兴趣,就利用春节几天简单学习了一下。<br>本篇文章就是简单总结一下近期所学。<br>对于爬虫,大致可以分成三步:</p><ol><li>分析要爬取的网站构成,如果在“元素”中找不到待爬取的内容,则在“network”中寻找</li><li>利用requests或者urllib库可以提取网页元素,或者是json数据或者是HTML或者是图片、视频等等</li><li>利用beautifulSoap或者lxml可以解析第二步提取的数据,从而获得想要的信息</li></ol><h1 id="提取url"><a href="#提取url" class="headerlink" title="提取url"></a>提取url</h1><h2 id="requests"><a href="#requests" class="headerlink" title="requests"></a>requests</h2><h3 id="爬取B站某一视频评论"><a href="#爬取B站某一视频评论" class="headerlink" title="爬取B站某一视频评论"></a>爬取B站某一视频评论</h3><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> pandas <span class="keyword">as</span> pd</span><br><span class="line"><span class="keyword">import</span> time</span><br><span class="line"><span class="keyword">import</span> re</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">def</span> <span class="title">convertTime</span>(<span class="params">ctime</span>):</span> </span><br><span class="line"> timeArray = time.localtime(ctime)<span class="comment">#将GPS时间转为时间类型的数据结构</span></span><br><span class="line"> <span class="comment">#例如</span></span><br><span class="line"> <span class="comment">#将00000 转为 time.struct_time(tm_year=1970, tm_mon=1, tm_mday=1, tm_hour=8, tm_min=0, tm_sec=0, tm_wday=3, tm_yday=1, tm_isdst=0)</span></span><br><span class="line"> myTime = time.strftime(<span class="string">"%Y.%m.%d"</span>, timeArray) <span class="comment">#时间规范为某一类型字符串</span></span><br><span class="line"> <span class="keyword">return</span> myTime</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment">#获取aid</span></span><br><span class="line"><span class="function"><span class="keyword">def</span> <span class="title">get_oid</span>(<span class="params">bvid</span>):</span></span><br><span class="line"> video_url = <span class="string">'https://www.bilibili.com/video/'</span> + bvid</span><br><span class="line"> page = requests.get(video_url).text</span><br><span class="line"> aid = re.search(<span class="string">r'"aid":[0-9]+'</span>, page).group()[<span class="number">6</span>:]</span><br><span class="line"> <span class="keyword">return</span> aid</span><br><span class="line"></span><br><span class="line">ID = <span class="string">"BV1244y1p7kt"</span></span><br><span class="line">page = <span class="number">0</span></span><br><span class="line">authorMap = []</span><br><span class="line"><span class="keyword">while</span> <span class="literal">True</span>:</span><br><span class="line"> time.sleep(<span class="number">0.05</span>) <span class="comment">#用于防止被服务器认为是dos攻击</span></span><br><span class="line"> </span><br><span class="line"> r = requests.get(<span class="string">"https://api.bilibili.com/x/v2/reply/main?jsonp=jsonp&next={}&type=1&oid={}&mode=3&plat=1&_=1644128621860"</span>.<span class="built_in">format</span>(page,get_oid(ID)))</span><br><span class="line"> </span><br><span class="line"> data = json.loads(r.text)</span><br><span class="line"> </span><br><span class="line"> <span class="comment">#以下就是从json中读取要用的数据</span></span><br><span class="line"> <span class="keyword">if</span> data[<span class="string">'data'</span>][<span class="string">'replies'</span>]:</span><br><span class="line"> <span class="keyword">for</span> i <span class="keyword">in</span> data[<span class="string">'data'</span>][<span class="string">'replies'</span>]: </span><br><span class="line"> authorMap.append([i[<span class="string">'member'</span>][<span class="string">'uname'</span>],i[<span class="string">'content'</span>][<span class="string">'message'</span>],convertTime(i[<span class="string">'ctime'</span>])])</span><br><span class="line"> <span class="keyword">if</span> i[<span class="string">'replies'</span>] != <span class="literal">None</span>:</span><br><span class="line"> <span class="keyword">for</span> j <span class="keyword">in</span> i[<span class="string">'replies'</span>]:</span><br><span class="line"> authorMap.append([j[<span class="string">'member'</span>][<span class="string">'uname'</span>],j[<span class="string">'content'</span>][<span class="string">'message'</span>],convertTime(j[<span class="string">'ctime'</span>])])</span><br><span class="line"> <span class="keyword">else</span>:</span><br><span class="line"> i = data[<span class="string">'data'</span>][<span class="string">'top'</span>][<span class="string">'upper'</span>]</span><br><span class="line"> authorMap.append([i[<span class="string">'member'</span>][<span class="string">'uname'</span>],i[<span class="string">'content'</span>][<span class="string">'message'</span>],convertTime(i[<span class="string">'ctime'</span>])])</span><br><span class="line"> <span class="keyword">if</span> i[<span class="string">'replies'</span>] != <span class="literal">None</span>:</span><br><span class="line"> <span class="keyword">for</span> j <span class="keyword">in</span> i[<span class="string">'replies'</span>]:</span><br><span class="line"> authorMap.append([j[<span class="string">'member'</span>][<span class="string">'uname'</span>],j[<span class="string">'content'</span>][<span class="string">'message'</span>],convertTime(j[<span class="string">'ctime'</span>])])</span><br><span class="line"> </span><br><span class="line"> <span class="comment">#循环读取所有页数的评论</span></span><br><span class="line"> <span class="keyword">if</span> data[<span class="string">'data'</span>][<span class="string">'cursor'</span>][<span class="string">'is_end'</span>] ==<span class="literal">True</span>:</span><br><span class="line"> <span class="keyword">break</span></span><br><span class="line"> <span class="keyword">else</span>:</span><br><span class="line"> page+=<span class="number">1</span></span><br></pre></td></tr></table></figure><h3 id="爬取慕课视频"><a href="#爬取慕课视频" class="headerlink" title="爬取慕课视频"></a>爬取慕课视频</h3><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> requests</span><br><span class="line"><span class="keyword">import</span> json</span><br><span class="line"><span class="keyword">from</span> ffmpy <span class="keyword">import</span> FFmpeg</span><br><span class="line"><span class="keyword">import</span> os</span><br><span class="line"></span><br><span class="line">m3u8url = <span class="string">f"https://mooc2vod.stu.126.net/nos/hls/2020/11/03/693/15bc7544-1305-4aee-bffd-9b33a4c43316_8.m3u8?ak=7909bff134372bffca53cdc2c17adc27a4c38c6336120510aea1ae1790819de8dd311591b24bac29eff49e0d7a7721ff70e0fc008011ee997b6e824dffac03753059f726dc7bb86b92adbc3d5b34b132ef8f2d0c2972470a66a7ee77174b2162b8ae77e29788836745b7125f174b3914"</span></span><br><span class="line"><span class="comment">#m3u8文件存储了该视频对应的所有ts文件地址</span></span><br><span class="line"><span class="comment">#例如: 15bc7544-1305-4aee-bffd-9b33a4c43316_8_01.ts</span></span><br><span class="line"></span><br><span class="line"><span class="comment">#该函数用于将m3u8文件中的ts地址读出存为列表</span></span><br><span class="line"><span class="function"><span class="keyword">def</span> <span class="title">Fromm3u8GetTs</span>(<span class="params">m3u8url</span>):</span></span><br><span class="line"> lasts = m3u8url.rfind(<span class="string">'/'</span>) </span><br><span class="line"> prefix = m3u8url[:lasts+<span class="number">1</span>] <span class="comment">#取出https://mooc2vod.stu.126.net/nos/hls/2020/11/03/693/</span></span><br><span class="line"> </span><br><span class="line"> </span><br><span class="line"> m3u8 = requests.get(m3u8url)</span><br><span class="line"> str_m3u8 = m3u8.text</span><br><span class="line"> strLine = str_m3u8.splitlines()</span><br><span class="line"> tsList=[]</span><br><span class="line"> <span class="keyword">for</span> i <span class="keyword">in</span> strLine:</span><br><span class="line"> <span class="keyword">if</span> i.endswith(<span class="string">'.ts'</span>): <span class="comment">#如果这一行字符串以.ts结尾,则代表这个字符串是ts文件地址</span></span><br><span class="line"> tsList.append(prefix+i)</span><br><span class="line"> <span class="keyword">return</span> tsList</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">tsList = Fromm3u8GetTs(m3u8url)</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment">##以下内容用于下载ts文件</span></span><br><span class="line"><span class="keyword">if</span> <span class="keyword">not</span> os.path.exists(<span class="string">"temp"</span>):</span><br><span class="line"> os.mkdir(<span class="string">"temp"</span>)</span><br><span class="line">filename=<span class="string">""</span> </span><br><span class="line"><span class="keyword">for</span> ts <span class="keyword">in</span> tsList:</span><br><span class="line"> response = requests.get(ts)</span><br><span class="line"> <span class="keyword">with</span> <span class="built_in">open</span>(<span class="string">"temp/{}"</span>.<span class="built_in">format</span>(ts[-<span class="number">13</span>:]),mode=<span class="string">'wb'</span>) <span class="keyword">as</span> f:</span><br><span class="line"> f.write(response.content) <span class="comment">#读取响应文件为二进制数</span></span><br><span class="line"> filename+=(<span class="string">"file '"</span>+os.path.join(os.path.abspath(<span class="string">"temp"</span>),ts[-<span class="number">13</span>:])+<span class="string">"'\n"</span>)</span><br><span class="line"><span class="keyword">with</span> <span class="built_in">open</span>(<span class="string">"temp/filename.txt"</span>,mode=<span class="string">"w"</span>) <span class="keyword">as</span> fl:</span><br><span class="line"> fl.write(filename)</span><br><span class="line"> </span><br><span class="line"><span class="comment">##利用FFmpeg合并ts </span></span><br><span class="line">ff = FFmpeg(</span><br><span class="line"> global_options=<span class="string">"-f concat -safe 0"</span>,</span><br><span class="line"> inputs={<span class="string">'D:\\myTemp\\python\\jupyter notebook\\爬虫\\temp\\filename.txt'</span>:<span class="literal">None</span>},</span><br><span class="line"> outputs={<span class="string">'D:\\myTemp\\python\\jupyter notebook\\爬虫\\temp\\output.mp4'</span>:<span class="string">'-c copy'</span>}</span><br><span class="line"> </span><br><span class="line">)</span><br><span class="line"><span class="comment">#ffmpeg -f concat -safe 0 -i filename.txt -c copy output.mp4</span></span><br><span class="line">ff.run()</span><br><span class="line"><span class="keyword">if</span> os.path.exists(<span class="string">"temp/output.mp4"</span>):</span><br><span class="line"> <span class="keyword">for</span> i <span class="keyword">in</span> (os.listdir(<span class="string">"temp"</span>)):</span><br><span class="line"> j = os.path.join(os.path.join(os.getcwd(),<span class="string">"temp"</span>),i)</span><br><span class="line"> <span class="keyword">if</span> j.endswith(<span class="string">".ts"</span>):</span><br><span class="line"> os.remove(j) </span><br><span class="line"> </span><br></pre></td></tr></table></figure><p>对于requests还有许多方法,</p><p>例如,在get/post的时候还可以添加 headers等参数</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line">myheader = {</span><br><span class="line"> <span class="string">"Host"</span>: <span class="string">"dxx.scyol.com"</span>,</span><br><span class="line"> <span class="string">"Connection"</span>: <span class="string">"keep-alive"</span>,</span><br><span class="line"> <span class="string">"User-Agent"</span>: <span class="string">"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.4758.80 Safari/537.36 Edg/98.0.1108.43"</span>,</span><br><span class="line"> <span class="string">"Accept"</span>: <span class="string">"text/css,*/*;q=0.1"</span>,</span><br><span class="line"> <span class="string">"Referer"</span>: <span class="string">"http://dxx.scyol.com/dxxBackend/"</span>,</span><br><span class="line"> <span class="string">"Accept-Encoding"</span>: <span class="string">"gzip, deflate"</span>,</span><br><span class="line"> <span class="string">"Accept-Language"</span>: <span class="string">"zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6"</span></span><br><span class="line">}</span><br><span class="line"></span><br><span class="line">d = {<span class="string">'key1'</span>: <span class="string">'value1'</span>, <span class="string">'key2'</span>: <span class="string">'value2'</span>}</span><br><span class="line"></span><br><span class="line">r = requests.post(<span class="string">"http://dxx.scyol.com/backend/study/student/list"</span>,headers = myheader,data=d)</span><br></pre></td></tr></table></figure><p>其他使用方法见:<a href="https://docs.python-requests.org/zh_CN/latest/">Requests: 让 HTTP 服务人类 — Requests 2.18.1 文档 (python-requests.org)</a></p><h2 id="urllib"><a href="#urllib" class="headerlink" title="urllib"></a>urllib</h2><p><a href="https://blog.csdn.net/weixin_42510360/article/details/111912820">python urllib和requests区别_urllib2和requests的区别_SEX专家的博客-CSDN博客</a></p><p>利用<code>url.request.urlretrieve</code>下载url的文件到特定本地地址,其中reporthook可以等于一个回调函数,用于显示进度条</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> urllib</span><br><span class="line"><span class="keyword">global</span> downloaded</span><br><span class="line">downloaded = <span class="number">0</span></span><br><span class="line"><span class="function"><span class="keyword">def</span> <span class="title">show_progress</span>(<span class="params">count, block_size, total_size</span>):</span></span><br><span class="line"> <span class="keyword">global</span> downloaded</span><br><span class="line"> downloaded += block_size</span><br><span class="line"> num = <span class="built_in">round</span>(((downloaded*<span class="number">100.0</span>) / total_size))</span><br><span class="line"> <span class="keyword">if</span> num<=<span class="number">100</span>:</span><br><span class="line"> <span class="built_in">print</span>(<span class="string">'downloading ... %d%%'</span> %num )</span><br><span class="line"> <span class="keyword">else</span>:</span><br><span class="line"> <span class="built_in">print</span>(<span class="string">'downloading ... 100%'</span>)</span><br><span class="line">source_url = <span class="string">"https://pubs.usgs.gov/fs/2020/3062/fs20203062.pdf"</span></span><br><span class="line">target_file = <span class="string">"build/newss.pdf"</span></span><br><span class="line"><span class="built_in">print</span>(<span class="string">'downloading ... '</span>)</span><br><span class="line">urllib.request.urlretrieve(source_url, filename=target_file, reporthook=show_progress)</span><br><span class="line"><span class="built_in">print</span>(<span class="string">'downloading ... done'</span>)</span><br></pre></td></tr></table></figure><p><a href="https://www.jb51.net/article/153001.htm">使用urllib库的urlretrieve()方法下载网络文件到本地的方法</a>,这一篇文章还利用xpath解析html批量下载了该页面下的图片</p><h1 id="解析网页数据"><a href="#解析网页数据" class="headerlink" title="解析网页数据"></a>解析网页数据</h1><h2 id="BeautifulSoap"><a href="#BeautifulSoap" class="headerlink" title="BeautifulSoap"></a>BeautifulSoap</h2><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> requests</span><br><span class="line"><span class="keyword">from</span> bs4 <span class="keyword">import</span> BeautifulSoup</span><br><span class="line"></span><br><span class="line">res=requests.get(<span class="string">'https://localprod.pandateacher.com/python-manuscript/crawler-html/spider-men5.0.html'</span>)</span><br><span class="line">html=res.text</span><br><span class="line"><span class="comment">#print(html)</span></span><br><span class="line">soup=BeautifulSoup(res.text,<span class="string">'html.parser'</span>)</span><br><span class="line">items=soup.find_all(class_=<span class="string">'books'</span>)</span><br><span class="line"><span class="keyword">for</span> item <span class="keyword">in</span> items:</span><br><span class="line"> name=item.find(<span class="string">'h2'</span>)</span><br><span class="line"> title = item.find(class_=<span class="string">'title'</span>) <span class="comment"># 在列表中的每个元素里,匹配属性class_='title'提取出数据</span></span><br><span class="line"> brief = item.find(class_=<span class="string">'info'</span>) <span class="comment"># 在列表中的每个元素里,匹配属性class_='info'提取出数据</span></span><br><span class="line"> <span class="built_in">print</span>(name.text, <span class="string">'\n'</span>, title.text, <span class="string">'\n'</span>, brief.text) <span class="comment"># 打印提取出的数据</span></span><br></pre></td></tr></table></figure><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">nav_id = soup.find_all(<span class="built_in">id</span>=<span class="string">"nav"</span>)[<span class="number">0</span>]</span><br><span class="line">catlog0 = nav_id.find_all(class_ = <span class="string">"catlog"</span>)[<span class="number">0</span>]</span><br><span class="line">catlog0.text</span><br></pre></td></tr></table></figure><p>这个模块本质上就是快速从html等文本中解析数据</p><p>我们可以利用<code>find</code>和<code>find_all</code>方式获取相应位置,<code>text</code>属性可以提取文字</p><p>其他详细用法可参照<a href="https://beautifulsoup.readthedocs.io/zh_CN/v4.4.0/">Beautiful Soup 4.4.0 文档 — Beautiful Soup 4.2.0 中文 文档</a></p><h2 id="lxml"><a href="#lxml" class="headerlink" title="lxml"></a>lxml</h2><p>我们可以通过简单的例子了解如何利用lxml解析网页:</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> requests</span><br><span class="line"><span class="keyword">from</span> lxml <span class="keyword">import</span> etree</span><br><span class="line"></span><br><span class="line">url=<span class="string">'https://bj.58.com/ershoufang/'</span></span><br><span class="line">headers={</span><br><span class="line"> <span class="string">'User-Agent'</span>:<span class="string">'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4577.63 Safari/537.36 Edg/93.0.961.47'</span></span><br><span class="line">}</span><br><span class="line">res_text=requests.get(url=url,headers=headers).text</span><br><span class="line"></span><br><span class="line"><span class="comment">## 以下是基本操作流程!!!</span></span><br><span class="line">my_etree=etree.HTML(res_text)</span><br><span class="line">ii=my_etree.xpath(<span class="string">'/html/body/div[1]//text()'</span>)</span><br></pre></td></tr></table></figure><p>此外我们不仅仅可以捕获文本,我们也可以收集图片,下面这个例子就是如何利用lxml提取图片</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br></pre></td><td class="code"><pre><span class="line">url=<span class="string">'https://pic.netbian.com/4kmeinv/'</span></span><br><span class="line">headers = {</span><br><span class="line"> <span class="string">'User-Agent'</span>: <span class="string">'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4577.63 Safari/537.36 Edg/93.0.961.47'</span></span><br><span class="line">}</span><br><span class="line">response=requests.get(url=url, headers=headers)</span><br><span class="line"><span class="comment">#response.encoding='gbk' #可行</span></span><br><span class="line">res_text = response.text</span><br><span class="line"></span><br><span class="line">my_etree=etree.HTML(res_text)</span><br><span class="line"><span class="comment">##li_list=my_etree.xpath('/html/body/div[@class="wrap clearfix"]/div/div[@class="slist"]/ul/li')</span></span><br><span class="line">li_list = my_etree.xpath(<span class="string">'//div[@class="slist"]/ul/li'</span>)</span><br><span class="line"></span><br><span class="line"><span class="keyword">if</span> <span class="keyword">not</span> os.path.exists(<span class="string">'./PicDic'</span>):</span><br><span class="line"> os.mkdir(<span class="string">'./PicDic'</span>)</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="keyword">for</span> li <span class="keyword">in</span> li_list:</span><br><span class="line"> img_src=<span class="string">'https://pic.netbian.com'</span>+li.xpath(<span class="string">'./a/img/@src'</span>)[<span class="number">0</span>]</span><br><span class="line"> img_name=li.xpath(<span class="string">'./a/img/@alt'</span>)[<span class="number">0</span>]+<span class="string">'.jpg'</span></span><br><span class="line"></span><br><span class="line"> img_name=img_name.encode(<span class="string">'iso-8859-1'</span>).decode(<span class="string">'gbk'</span>)</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"> <span class="built_in">print</span>(img_name+<span class="string">'+'</span>+img_src+<span class="string">'\n'</span>)</span><br><span class="line"> <span class="comment">#将图片持久化保存</span></span><br><span class="line"> img_data=requests.get(img_src,headers=headers).content <span class="comment">#二进制数据</span></span><br><span class="line"> img_path=<span class="string">'PicDic/'</span>+img_name</span><br><span class="line"> <span class="keyword">with</span> <span class="built_in">open</span>(img_path,<span class="string">'wb'</span>) <span class="keyword">as</span> fp:</span><br><span class="line"> fp.write(img_data)</span><br><span class="line"> <span class="built_in">print</span>(img_name+<span class="string">'下载成功!\n'</span>)</span><br></pre></td></tr></table></figure><p><a href="https://www.runoob.com/xpath/xpath-syntax.html">XPath 语法 | 菜鸟教程 (runoob.com)</a></p><h1 id="关于爬虫的其他内容"><a href="#关于爬虫的其他内容" class="headerlink" title="关于爬虫的其他内容"></a>关于爬虫的其他内容</h1><h2 id="selenium"><a href="#selenium" class="headerlink" title="selenium"></a>selenium</h2><p>这是一个自动化模块,可以实现模拟登陆</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">from</span> selenium <span class="keyword">import</span> webdriver</span><br><span class="line"></span><br><span class="line">prefs = {<span class="string">"download.default_directory"</span>: <span class="string">"D:\\myTemp\\python\\爬虫\\learn01\\zidonghua\\files"</span>}</span><br><span class="line">chromeOptions.add_experimental_option(<span class="string">"prefs"</span>, prefs) <span class="comment">#定义默认下载地址</span></span><br><span class="line">chrome_driver=webdriver.Chrome(<span class="string">"./chromedriver.exe"</span>, options=chromeOptions)<span class="comment">#可以添加选项</span></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment">#获取地址</span></span><br><span class="line">chrome_driver.get(<span class="string">'https://www.taobao.com/'</span>)</span><br><span class="line"></span><br><span class="line"><span class="comment">#标签定位</span></span><br><span class="line">search_keys=chrome_driver.find_element_by_id(<span class="string">'q'</span>)</span><br><span class="line"><span class="comment">#标签交互</span></span><br><span class="line">search_keys.send_keys(<span class="string">'袜子'</span>)</span><br><span class="line"></span><br><span class="line"><span class="comment">#通过class定位</span></span><br><span class="line">search_button=chrome_driver.find_element_by_class_name(<span class="string">'btn-search'</span>)</span><br><span class="line">search_button.click()</span><br><span class="line"></span><br><span class="line"><span class="comment">#通过xpath定位</span></span><br><span class="line">btn_banji = bro.find_element_by_xpath(</span><br><span class="line"> <span class="string">'/html/body/div[1]/div/div[2]/section/div/div[3]/div/div[3]/table/tbody/tr/td[7]/div/button[4]'</span>)</span><br><span class="line"></span><br><span class="line">btn_banji.click()</span><br><span class="line">sleep(<span class="number">2.5</span>)</span><br></pre></td></tr></table></figure><h2 id="tarfile"><a href="#tarfile" class="headerlink" title="tarfile"></a>tarfile</h2><p>这是一个解压tar文件的模块<br><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> tarfile</span><br><span class="line">tar = tarfile.<span class="built_in">open</span>(target_file, <span class="string">"r:gz"</span>)</span><br><span class="line">tar.extractall()</span><br><span class="line"><span class="comment">#TarFile.extractall(path='.', members=None, *, numeric_owner=False)</span></span><br><span class="line"><span class="comment">#将归档中的所有成员提取到当前工作目录或 path 目录。 如果给定了可选的 members,则它必须为 getmembers() 所返回的列表的一个子集。 字典信息例如所有者、修改时间和权限会在所有成员提取完毕后被设置。 这样做是为了避免两个问题:目录的修改时间会在每当在其中创建文件时被重置。 并且如果目录的权限不允许写入,提取文件到目录的操作将失败。</span></span><br><span class="line">tar.close()</span><br><span class="line">os.remove(target_file)</span><br></pre></td></tr></table></figure></p><div class="table-container"><table><thead><tr><th style="text-align:center">模式</th><th style="text-align:center">action</th></tr></thead><tbody><tr><td style="text-align:center"><code>'r' or 'r:*'</code></td><td style="text-align:center">打开和读取使用透明压缩(推荐)。</td></tr><tr><td style="text-align:center"><code>'r:'</code></td><td style="text-align:center">打开和读取不使用压缩。</td></tr><tr><td style="text-align:center"><code>'r:gz'</code></td><td style="text-align:center">打开和读取使用gzip 压缩。</td></tr><tr><td style="text-align:center"><code>'r:bz2'</code></td><td style="text-align:center">打开和读取使用bzip2 压缩。</td></tr><tr><td style="text-align:center"><code>'r:xz'</code></td><td style="text-align:center">打开和读取使用lzma 压缩。</td></tr><tr><td style="text-align:center"><code>'x'</code> 或 <code>'x:'</code></td><td style="text-align:center">创建tarfile不进行压缩。如果文件已经存在,则抛出 <a href="https://docs.python.org/zh-cn/3/library/exceptions.html#FileExistsError"><code>FileExistsError</code></a> 异常。</td></tr><tr><td style="text-align:center"><code>'x:gz'</code></td><td style="text-align:center">使用gzip压缩创建tarfile。如果文件已经存在,则抛出 <a href="https://docs.python.org/zh-cn/3/library/exceptions.html#FileExistsError"><code>FileExistsError</code></a> 异常。</td></tr><tr><td style="text-align:center"><code>'x:bz2'</code></td><td style="text-align:center">使用bzip2 压缩创建tarfile。如果文件已经存在,则抛出 <a href="https://docs.python.org/zh-cn/3/library/exceptions.html#FileExistsError"><code>FileExistsError</code></a> 异常。</td></tr><tr><td style="text-align:center"><code>'x:xz'</code></td><td style="text-align:center">使用lzma 压缩创建tarfile。如果文件已经存在,则抛出 <a href="https://docs.python.org/zh-cn/3/library/exceptions.html#FileExistsError"><code>FileExistsError</code></a> 异常。</td></tr><tr><td style="text-align:center"><code>'a' or 'a:'</code></td><td style="text-align:center">打开以便在没有压缩的情况下追加。如果文件不存在,则创建该文件。</td></tr><tr><td style="text-align:center"><code>'w' or 'w:'</code></td><td style="text-align:center">打开用于未压缩的写入。</td></tr><tr><td style="text-align:center"><code>'w:gz'</code></td><td style="text-align:center">打开用于 gzip 压缩的写入。</td></tr><tr><td style="text-align:center"><code>'w:bz2'</code></td><td style="text-align:center">打开用于 bzip2 压缩的写入。</td></tr><tr><td style="text-align:center"><code>'w:xz'</code></td><td style="text-align:center">打开用于 lzma 压缩的写入。</td></tr></tbody></table></div><h2 id="爬虫其他问题"><a href="#爬虫其他问题" class="headerlink" title="爬虫其他问题"></a>爬虫其他问题</h2><h4 id="如何处理devtool打开后,无法刷新网页的问题"><a href="#如何处理devtool打开后,无法刷新网页的问题" class="headerlink" title="如何处理devtool打开后,无法刷新网页的问题"></a>如何处理devtool打开后,无法刷新网页的问题</h4><p>通常我们在分析网站的时候是通过打开DevTool后,按“刷新”按钮,监测“network”加载情况。然而当分析慕课等网站的时候,在打开了devtool后,网页就无法刷新了,并弹出下图所示弹框。</p><p><img src="https://img-blog.csdnimg.cn/0a926ab60e46467692699fc82ded02ab.png#pic_center" alt="在这里插入图片描述"></p><p>在这一情况下,我们可以点击下图的“停用断点”,然后再点击上图的播放按钮,即可恢复正常刷新功能。</p><p><img src="https://img-blog.csdnimg.cn/45c88a4f62fa41a8a785d19a0106f5c1.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA6ZSD5YWJ55Om5Lqu55qE5p6V5bCP6Lev,size_16,color_FFFFFF,t_70,g_se,x_16#pic_center" alt="在这里插入图片描述"></p><h4 id="如何在python环境中安装ffmpeg-ffmpy"><a href="#如何在python环境中安装ffmpeg-ffmpy" class="headerlink" title="如何在python环境中安装ffmpeg ffmpy"></a>如何在python环境中安装ffmpeg ffmpy</h4><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">#安装ffmpeg</span><br><span class="line">conda install ffmpeg</span><br><span class="line"></span><br><span class="line">#安装ffmpy</span><br><span class="line">pip install ffmpy</span><br></pre></td></tr></table></figure><p><a href="https://ffmpy.readthedocs.io/en/latest/">ffmpy文档</a></p>]]></content>
<tags>
<tag> python </tag>
<tag> 爬虫 </tag>
</tags>
</entry>
<entry>
<title>eigen基础</title>
<link href="/2021/11/12/eigen%E5%9F%BA%E7%A1%80%E6%93%8D%E4%BD%9C/"/>
<url>/2021/11/12/eigen%E5%9F%BA%E7%A1%80%E6%93%8D%E4%BD%9C/</url>
<content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="\assets\css\APlayer.min.css"><script src="\assets\js\APlayer.min.js" class="aplayer-secondary-script-marker"></script><h1 id="Matrix基本使用"><a href="#Matrix基本使用" class="headerlink" title="Matrix基本使用"></a>Matrix基本使用</h1><p><a href="https://yueyuebird-su.github.io/2020/11/16/Eigen/">Eigen概述 - Go吧LpengSu | Blog (yueyuebird-su.github.io)</a></p><p><a href="https://blog.csdn.net/f_zyj/article/details/82531991?utm_medium=distribute.pc_relevant.none-task-blog-searchFromBaidu-1.control&depth_1-utm_source=distribute.pc_relevant.none-task-blog-searchFromBaidu-1.control">Eigen 学习笔记(一)_逐梦者-CSDN博客_eigen</a></p><p>Eigen中Matrix 与Vector相似</p><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">Matrix<<span class="keyword">typename</span> Scalar, <span class="comment">//类型</span></span><br><span class="line"> <span class="keyword">int</span> RowsAtCompileTime,</span><br><span class="line"> <span class="keyword">int</span> ColsAtCompileTime,</span><br><span class="line"> <span class="keyword">int</span> Options = <span class="number">0</span>, <span class="comment">//默认是列优先</span></span><br><span class="line"> <span class="keyword">int</span> MaxRowsAtCompileTime = RowsAtCompileTime,</span><br><span class="line"> <span class="keyword">int</span> MaxColsAtCompileTime = ColsAtCompileTime></span><br><span class="line"></span><br></pre></td></tr></table></figure><h2 id="基本运算"><a href="#基本运算" class="headerlink" title="基本运算"></a>基本运算</h2><p>支持相同维数矩阵加减</p><p>支持乘除标量数</p><p>乘法(*)是矩阵乘法,不是对应元素相乘</p><h2 id="基本方法"><a href="#基本方法" class="headerlink" title="基本方法"></a>基本方法</h2><h3 id="求转置、共轭矩阵、伴随矩阵"><a href="#求转置、共轭矩阵、伴随矩阵" class="headerlink" title="求转置、共轭矩阵、伴随矩阵"></a>求转置、共轭矩阵、伴随矩阵</h3><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line">m.<span class="built_in">transpose</span>();</span><br><span class="line">m.<span class="built_in">conjugate</span>();</span><br><span class="line">m.<span class="built_in">adjoint</span>();</span><br><span class="line"></span><br><span class="line">注意:</span><br><span class="line">不能是</span><br><span class="line">m=m.<span class="built_in">transpose</span>();<span class="comment">//因为会在转置运算结束之前就开始把结果写进a</span></span><br><span class="line">所以必须是:</span><br><span class="line">b=a.<span class="built_in">transpose</span>(); </span><br></pre></td></tr></table></figure><h3 id="其他用法"><a href="#其他用法" class="headerlink" title="其他用法"></a>其他用法</h3><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">v.<span class="built_in">dot</span>(w); <span class="comment">//点乘</span></span><br><span class="line">v.<span class="built_in">cross</span>(w);<span class="comment">//叉乘</span></span><br></pre></td></tr></table></figure><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line">Eigen::Matrix2d mat;</span><br><span class="line"> mat << <span class="number">1</span>, <span class="number">2</span>,</span><br><span class="line"> <span class="number">3</span>, <span class="number">4</span>;</span><br><span class="line"> cout << <span class="string">"Here is mat.sum(): "</span> << mat.<span class="built_in">sum</span>() << endl;</span><br><span class="line"> cout << <span class="string">"Here is mat.prod(): "</span> << mat.<span class="built_in">prod</span>() << endl;</span><br><span class="line"> cout << <span class="string">"Here is mat.mean(): "</span> << mat.<span class="built_in">mean</span>() << endl;</span><br><span class="line"> cout << <span class="string">"Here is mat.minCoeff(): "</span> << mat.<span class="built_in">minCoeff</span>() << endl;</span><br><span class="line"> cout << <span class="string">"Here is mat.maxCoeff(): "</span> << mat.<span class="built_in">maxCoeff</span>() << endl;</span><br><span class="line"> cout << <span class="string">"Here is mat.trace(): "</span> << mat.<span class="built_in">trace</span>() << endl;<span class="comment">//矩阵的迹等价于mat对角化后对角线元素之和a.diagonal().sum()</span></span><br><span class="line"></span><br></pre></td></tr></table></figure><blockquote><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">Here is mat.sum(): 10</span><br><span class="line">Here is mat.prod(): 24</span><br><span class="line">Here is mat.mean(): 2.5</span><br><span class="line">Here is mat.minCoeff(): 1</span><br><span class="line">Here is mat.maxCoeff(): 4</span><br><span class="line">Here is mat.trace(): 5</span><br></pre></td></tr></table></figure></blockquote><p><a href="http://eigen.tuxfamily.org/dox/classEigen_1_1MatrixBase.html#ac7a03a61014f37ddd2fe61ebac0c9539">Eigen: Eigen::MatrixBase< Derived > Class Template Reference</a></p><h3 id="访问元素"><a href="#访问元素" class="headerlink" title="访问元素"></a>访问元素</h3><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><span class="function">MatrixXf <span class="title">m</span><span class="params">(<span class="number">2</span>, <span class="number">2</span>)</span></span>;</span><br><span class="line">m = MatrixXf::<span class="built_in">Random</span>(<span class="number">2</span>, <span class="number">2</span>);</span><br><span class="line">cout << <span class="built_in">m</span>(<span class="number">1</span>, <span class="number">1</span>) << endl;</span><br><span class="line">cout << m[<span class="number">0</span>][<span class="number">0</span>] << endl; <span class="comment">//这样是错误的,对于matrix必须是括号访问</span></span><br><span class="line"><span class="function">VectorXd <span class="title">v</span><span class="params">(<span class="number">3</span>)</span></span>;</span><br><span class="line">v = Vector3d::<span class="built_in">Random</span>(<span class="number">3</span>);</span><br><span class="line">cout << v[<span class="number">0</span>];</span><br><span class="line">cout << <span class="built_in">v</span>(<span class="number">1</span>);</span><br></pre></td></tr></table></figure><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">Matrix3f m = Matrix3f::<span class="built_in">Random</span>();</span><br><span class="line"> std::<span class="keyword">ptrdiff_t</span> i, j;</span><br><span class="line"> <span class="keyword">float</span> minOfM = m.<span class="built_in">minCoeff</span>(&i,&j); <span class="comment">//将m矩阵中最小数的位置传到i j ;把最小数传到minOfm</span></span><br><span class="line"> cout << <span class="string">"Here is the matrix m:\n"</span> << m << endl;</span><br><span class="line"> cout << <span class="string">"Its minimum coefficient ("</span> << minOfM </span><br><span class="line"> << <span class="string">") is at position ("</span> << i << <span class="string">","</span> << j << <span class="string">")\n\n"</span>;</span><br></pre></td></tr></table></figure><p>另外,Eigen提供了MatrixXf::Index ,</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">MatrixXf::Index rownum,colnum;//可以存储行列号</span><br></pre></td></tr></table></figure><h2 id="Array(数组)使用"><a href="#Array(数组)使用" class="headerlink" title="Array(数组)使用"></a>Array(数组)使用</h2><blockquote><p>如果你需要做线性代数运算,如矩阵乘法,那么你应该使用矩阵;如果需要进行系数方面的操作,那么应该使用数组。</p></blockquote><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">Array<<span class="keyword">float</span>,<span class="number">3</span>,<span class="number">3</span>>a,b;</span><br><span class="line">```</span><br><span class="line">a*b;<span class="comment">//此处是a与b各个元素相乘</span></span><br><span class="line"></span><br></pre></td></tr></table></figure><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">//array与Matrix不能混用,需要转换类型</span><br><span class="line">.array();</span><br><span class="line">.matrix();</span><br></pre></td></tr></table></figure><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">main</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>{</span><br><span class="line"> <span class="function">MatrixXf <span class="title">m</span><span class="params">(<span class="number">2</span>,<span class="number">2</span>)</span></span>;</span><br><span class="line"> <span class="function">MatrixXf <span class="title">n</span><span class="params">(<span class="number">2</span>,<span class="number">2</span>)</span></span>;</span><br><span class="line"> <span class="function">MatrixXf <span class="title">result</span><span class="params">(<span class="number">2</span>,<span class="number">2</span>)</span></span>;</span><br><span class="line"> </span><br><span class="line"> m << <span class="number">1</span>,<span class="number">2</span>,</span><br><span class="line"> <span class="number">3</span>,<span class="number">4</span>;</span><br><span class="line"> n << <span class="number">5</span>,<span class="number">6</span>,</span><br><span class="line"> <span class="number">7</span>,<span class="number">8</span>;</span><br><span class="line"> </span><br><span class="line"> result = m * n;</span><br><span class="line"> cout << <span class="string">"-- Matrix m*n: --"</span> << endl << result << endl << endl;</span><br><span class="line"> <span class="comment">//Eigen allows assigning array expressions to matrix variables</span></span><br><span class="line"> result = m.<span class="built_in">array</span>() * n.<span class="built_in">array</span>();</span><br><span class="line"> cout << <span class="string">"-- Array m*n: --"</span> << endl << result << endl << endl;</span><br><span class="line"> result = m.<span class="built_in">cwiseProduct</span>(n);</span><br><span class="line"> cout << <span class="string">"-- With cwiseProduct: --"</span> << endl << result << endl << endl;</span><br><span class="line"> result = m.<span class="built_in">array</span>() + <span class="number">4</span>;</span><br><span class="line"> cout << <span class="string">"-- Array m + 4: --"</span> << endl << result << endl << endl;</span><br><span class="line">}</span><br></pre></td></tr></table></figure><h2 id="block分块"><a href="#block分块" class="headerlink" title="block分块"></a>block分块</h2><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">main</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>{</span><br><span class="line"> <span class="function">Eigen::MatrixXf <span class="title">m</span><span class="params">(<span class="number">4</span>,<span class="number">4</span>)</span>,<span class="title">a</span><span class="params">(<span class="number">2</span>,<span class="number">2</span>)</span></span>;</span><br><span class="line"> m << <span class="number">1</span>, <span class="number">2</span>, <span class="number">3</span>, <span class="number">4</span>,</span><br><span class="line"> <span class="number">5</span>, <span class="number">6</span>, <span class="number">7</span>, <span class="number">8</span>,</span><br><span class="line"> <span class="number">9</span>,<span class="number">10</span>,<span class="number">11</span>,<span class="number">12</span>,</span><br><span class="line"> <span class="number">13</span>,<span class="number">14</span>,<span class="number">15</span>,<span class="number">16</span>;</span><br><span class="line"> cout << <span class="string">"Block in the middle"</span> << endl;</span><br><span class="line"> cout << m.block<<span class="number">2</span>,<span class="number">2</span>>(<span class="number">1</span>,<span class="number">1</span>) << endl << endl;</span><br><span class="line"> </span><br><span class="line"> <span class="keyword">for</span> (<span class="keyword">int</span> i = <span class="number">1</span>; i <= <span class="number">3</span>; ++i)</span><br><span class="line"> {</span><br><span class="line"> cout << <span class="string">"Block of size "</span> << i << <span class="string">"x"</span> << i << endl;</span><br><span class="line"> cout << m.<span class="built_in">block</span>(<span class="number">0</span>,<span class="number">0</span>,i,i) << endl << endl;</span><br><span class="line"> }</span><br><span class="line"> </span><br><span class="line"> m.block<<span class="number">2</span>,<span class="number">2</span>>(<span class="number">1</span>,<span class="number">1</span>)=a; <span class="comment">//可以赋值 </span></span><br><span class="line">}</span><br></pre></td></tr></table></figure><blockquote><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br></pre></td><td class="code"><pre><span class="line">Block in the middle</span><br><span class="line">6 7</span><br><span class="line">10 11</span><br><span class="line"></span><br><span class="line">Block of size 1x1</span><br><span class="line">1</span><br><span class="line"></span><br><span class="line">Block of size 2x2</span><br><span class="line">1 2</span><br><span class="line">5 6</span><br><span class="line"></span><br><span class="line">Block of size 3x3</span><br><span class="line">1 2 3</span><br><span class="line">5 6 7</span><br><span class="line">9 10 11</span><br></pre></td></tr></table></figure></blockquote><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">testblock</span><span class="params">()</span> </span>{</span><br><span class="line">Matrix<<span class="keyword">float</span>, <span class="number">2</span>, <span class="number">2</span>> m;</span><br><span class="line">m = Matrix<<span class="keyword">float</span>, <span class="number">2</span>, <span class="number">2</span>>::<span class="built_in">Constant</span>(<span class="number">12</span>);</span><br><span class="line">cout << m << endl; <span class="comment">//输出2*2的都是12的矩阵</span></span><br><span class="line">}</span><br></pre></td></tr></table></figure><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">//取某行或某列操作</span></span><br><span class="line">m.<span class="built_in">col</span>(<span class="number">2</span>) += <span class="number">3</span> * m.<span class="built_in">col</span>(<span class="number">0</span>);</span><br></pre></td></tr></table></figure><p><img src="https://img-blog.csdnimg.cn/c0b22d7067264fe3ae0cc51ae1502cdf.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA6ZSD5YWJ55Om5Lqu55qE5p6V5bCP6Lev,size_20,color_FFFFFF,t_70,g_se,x_16" alt="在这里插入图片描述"></p><h3 id="对于Vector"><a href="#对于Vector" class="headerlink" title="对于Vector"></a>对于Vector</h3><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">main</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>{</span><br><span class="line"> <span class="function">Eigen::ArrayXf <span class="title">v</span><span class="params">(<span class="number">6</span>)</span></span>;</span><br><span class="line"> v << <span class="number">1</span>, <span class="number">2</span>, <span class="number">3</span>, <span class="number">4</span>, <span class="number">5</span>, <span class="number">6</span>;</span><br><span class="line"> cout << <span class="string">"v.head(3) ="</span> << endl << v.<span class="built_in">head</span>(<span class="number">3</span>) << endl << endl;</span><br><span class="line"> cout << <span class="string">"v.tail<3>() = "</span> << endl << v.tail<<span class="number">3</span>>() << endl << endl;</span><br><span class="line"> v.<span class="built_in">segment</span>(<span class="number">1</span>,<span class="number">4</span>) *= <span class="number">2</span>;</span><br><span class="line"> cout << <span class="string">"after 'v.segment(1,4) *= 2', v ="</span> << endl << v << endl;</span><br><span class="line">}</span><br></pre></td></tr></table></figure><blockquote><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br></pre></td><td class="code"><pre><span class="line">v.head(3) =</span><br><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line"></span><br><span class="line">v.tail<3>() = </span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line"></span><br><span class="line">after 'v.segment(1,4) *= 2', v =</span><br><span class="line">1</span><br><span class="line">4</span><br><span class="line">6</span><br><span class="line">8</span><br><span class="line">10</span><br><span class="line">6</span><br></pre></td></tr></table></figure></blockquote><h2 id="赋值方法"><a href="#赋值方法" class="headerlink" title="赋值方法"></a>赋值方法</h2><p>1.“<<”+逗号赋值法 前提:==待赋值矩阵必须大小确定==</p><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line"><span class="function">RowVectorXd <span class="title">vec1</span><span class="params">(<span class="number">3</span>)</span></span>;</span><br><span class="line">vec1 << <span class="number">1</span>, <span class="number">2</span>, <span class="number">3</span>;</span><br><span class="line">std::cout << <span class="string">"vec1 = "</span> << vec1 << std::endl;</span><br><span class="line"> </span><br><span class="line"><span class="function">RowVectorXd <span class="title">vec2</span><span class="params">(<span class="number">4</span>)</span></span>;</span><br><span class="line">vec2 << <span class="number">1</span>, <span class="number">4</span>, <span class="number">9</span>, <span class="number">16</span>;</span><br><span class="line">std::cout << <span class="string">"vec2 = "</span> << vec2 << std::endl;</span><br><span class="line"> </span><br><span class="line"><span class="function">RowVectorXd <span class="title">joined</span><span class="params">(<span class="number">7</span>)</span></span>;</span><br><span class="line">joined << vec1, vec2;</span><br><span class="line">std::cout << <span class="string">"joined = "</span> << joined << std::endl;</span><br></pre></td></tr></table></figure><p>2.特殊赋值</p><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">Array33f::<span class="built_in">Zero</span>();</span><br><span class="line">MatrixXf::<span class="built_in">Ones</span>(<span class="number">3</span>,<span class="number">2</span>);</span><br><span class="line">MatrixXf::<span class="built_in">Constant</span>(<span class="number">5</span>,<span class="number">2</span>,<span class="number">1.58</span>);</span><br><span class="line">MatrixXf mat = MatrixXf::<span class="built_in">Random</span>(<span class="number">2</span>, <span class="number">3</span>);</span><br></pre></td></tr></table></figure><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="function">ArrayXXf <span class="title">table</span><span class="params">(<span class="number">10</span>, <span class="number">4</span>)</span></span>;</span><br><span class="line">table.<span class="built_in">col</span>(<span class="number">0</span>) = ArrayXf::<span class="built_in">LinSpaced</span>(<span class="number">10</span>, <span class="number">0</span>, <span class="number">90</span>); <span class="comment">//0--90 取10个数</span></span><br><span class="line">table.<span class="built_in">col</span>(<span class="number">1</span>) = M_PI / <span class="number">180</span> * table.<span class="built_in">col</span>(<span class="number">0</span>);</span><br><span class="line">table.<span class="built_in">col</span>(<span class="number">2</span>) = table.<span class="built_in">col</span>(<span class="number">1</span>).<span class="built_in">sin</span>();</span><br><span class="line">table.<span class="built_in">col</span>(<span class="number">3</span>) = table.<span class="built_in">col</span>(<span class="number">1</span>).<span class="built_in">cos</span>();</span><br><span class="line">std::cout << <span class="string">" Degrees Radians Sine Cosine\n"</span>;</span><br><span class="line">std::cout << table << std::endl;</span><br></pre></td></tr></table></figure><h2 id="Reductions-visitors-and-broadcasting"><a href="#Reductions-visitors-and-broadcasting" class="headerlink" title="Reductions, visitors and broadcasting"></a><strong>Reductions, visitors and broadcasting</strong></h2><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">main</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>{</span><br><span class="line"> <span class="function">VectorXf <span class="title">v</span><span class="params">(<span class="number">2</span>)</span></span>;</span><br><span class="line"> <span class="function">MatrixXf <span class="title">m</span><span class="params">(<span class="number">2</span>,<span class="number">2</span>)</span>, <span class="title">n</span><span class="params">(<span class="number">2</span>,<span class="number">2</span>)</span></span>;</span><br><span class="line"> </span><br><span class="line"> v << <span class="number">-1</span>,</span><br><span class="line"> <span class="number">2</span>;</span><br><span class="line"> </span><br><span class="line"> m << <span class="number">1</span>,<span class="number">-2</span>,</span><br><span class="line"> <span class="number">-3</span>,<span class="number">4</span>;</span><br><span class="line"> </span><br><span class="line"> cout << <span class="string">"v.squaredNorm() = "</span> << v.<span class="built_in">squaredNorm</span>() << endl; <span class="comment">//计算平方范数 5 </span></span><br><span class="line"> cout << <span class="string">"v.norm() = "</span> << v.<span class="built_in">norm</span>() << endl; <span class="comment">//计算平方范数的根 2.23607</span></span><br><span class="line"> cout << <span class="string">"v.lpNorm<1>() = "</span> << v.lpNorm<<span class="number">1</span>>() << endl; <span class="comment">//求取矩阵一范数 3</span></span><br><span class="line"> cout << <span class="string">"v.lpNorm<Infinity>() = "</span> << v.lpNorm<Infinity>() << endl; <span class="comment">//求取无穷范数 2</span></span><br><span class="line"> </span><br><span class="line"> cout << endl;</span><br><span class="line"> cout << <span class="string">"m.squaredNorm() = "</span> << m.<span class="built_in">squaredNorm</span>() << endl;</span><br><span class="line"> cout << <span class="string">"m.norm() = "</span> << m.<span class="built_in">norm</span>() << endl;</span><br><span class="line"> cout << <span class="string">"m.lpNorm<1>() = "</span> << m.lpNorm<<span class="number">1</span>>() << endl;</span><br><span class="line"> cout << <span class="string">"m.lpNorm<Infinity>() = "</span> << m.lpNorm<Infinity>() << endl;</span><br><span class="line">}</span><br></pre></td></tr></table></figure><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">test03</span><span class="params">()</span> </span>{</span><br><span class="line"><span class="function">ArrayXXf <span class="title">a</span><span class="params">(<span class="number">2</span>, <span class="number">2</span>)</span></span>;</span><br><span class="line">a << <span class="number">1</span>, <span class="number">2</span>,</span><br><span class="line"><span class="number">3</span>, <span class="number">4</span>;</span><br><span class="line">cout << <span class="string">"(a > 0).all() = "</span> << (a > <span class="number">0</span>).<span class="built_in">all</span>() << endl; <span class="comment">//1</span></span><br><span class="line">cout << <span class="string">"(a > 0).any() = "</span> << (a > <span class="number">0</span>).<span class="built_in">any</span>() << endl; <span class="comment">//1</span></span><br><span class="line">cout << <span class="string">"(a > 0).count() = "</span> << (a > <span class="number">0</span>).<span class="built_in">count</span>() << endl; <span class="comment">//4</span></span><br><span class="line">cout << endl;</span><br><span class="line">}</span><br></pre></td></tr></table></figure><h3 id="colwise-and-broadcasting"><a href="#colwise-and-broadcasting" class="headerlink" title="colwise() and broadcasting"></a>colwise() and broadcasting</h3><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">test04</span><span class="params">()</span> </span>{</span><br><span class="line"><span class="function">Eigen::MatrixXf <span class="title">mat</span><span class="params">(<span class="number">2</span>, <span class="number">4</span>)</span></span>;</span><br><span class="line">mat << <span class="number">1</span>, <span class="number">2</span>, <span class="number">6</span>, <span class="number">9</span>,</span><br><span class="line"><span class="number">3</span>, <span class="number">1</span>, <span class="number">7</span>, <span class="number">2</span>;</span><br><span class="line"></span><br><span class="line">std::cout << <span class="string">"Column's maximum: "</span> << std::endl</span><br><span class="line"><< mat.<span class="built_in">colwise</span>().<span class="built_in">maxCoeff</span>() << std::endl; <span class="comment">//</span></span><br><span class="line"> <span class="comment">//如果单纯mat.maxCoeff();返回的是整个mat最大值,此时返回值只有9;</span></span><br><span class="line"> <span class="comment">//但是有了colwise(),则为按列求取最大值,返回值为各列最大值 3 2 7 9 </span></span><br><span class="line">}</span><br></pre></td></tr></table></figure><p>colwise还可以实现如下功能</p><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line"><span class="function">Eigen::MatrixXf <span class="title">mat</span><span class="params">(<span class="number">2</span>,<span class="number">4</span>)</span></span>;</span><br><span class="line"><span class="function">Eigen::VectorXf <span class="title">v</span><span class="params">(<span class="number">2</span>)</span></span>;</span><br><span class="line"> </span><br><span class="line">mat << <span class="number">1</span>, <span class="number">2</span>, <span class="number">6</span>, <span class="number">9</span>,</span><br><span class="line"> <span class="number">3</span>, <span class="number">1</span>, <span class="number">7</span>, <span class="number">2</span>;</span><br><span class="line"> </span><br><span class="line">v << <span class="number">0</span>,</span><br><span class="line"> <span class="number">1</span>;</span><br><span class="line"> </span><br><span class="line"><span class="comment">//add v to each column of m</span></span><br><span class="line">mat.<span class="built_in">colwise</span>() += v;</span><br><span class="line"><span class="comment">//1 2 6 9</span></span><br><span class="line"><span class="comment">//4 2 8 3</span></span><br></pre></td></tr></table></figure><p>col-wise同理</p><p>需要注意的是:“+”后面的那个必须是Vector,否则程序报错</p><h3 id="broadcasting与其他操作可以结合"><a href="#broadcasting与其他操作可以结合" class="headerlink" title="broadcasting与其他操作可以结合"></a>broadcasting与其他操作可以结合</h3><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">main</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>{</span><br><span class="line"> <span class="function">Eigen::MatrixXf <span class="title">m</span><span class="params">(<span class="number">2</span>,<span class="number">4</span>)</span></span>;</span><br><span class="line"> <span class="function">Eigen::VectorXf <span class="title">v</span><span class="params">(<span class="number">2</span>)</span></span>;</span><br><span class="line"> </span><br><span class="line"> m << <span class="number">1</span>, <span class="number">23</span>, <span class="number">6</span>, <span class="number">9</span>,</span><br><span class="line"> <span class="number">3</span>, <span class="number">11</span>, <span class="number">7</span>, <span class="number">2</span>;</span><br><span class="line"> </span><br><span class="line"> v << <span class="number">2</span>,</span><br><span class="line"> <span class="number">3</span>;</span><br><span class="line"> </span><br><span class="line"> MatrixXf::Index index;</span><br><span class="line"> <span class="comment">// find nearest neighbour</span></span><br><span class="line"> (m.<span class="built_in">colwise</span>() - v).<span class="built_in">colwise</span>().<span class="built_in">squaredNorm</span>().<span class="built_in">minCoeff</span>(&index);</span><br><span class="line"> </span><br><span class="line"> cout << <span class="string">"Nearest neighbour is column "</span> << index << <span class="string">":"</span> << endl; <span class="comment">//0</span></span><br><span class="line"> cout << m.<span class="built_in">col</span>(index) << endl; <span class="comment">//1 3</span></span><br><span class="line">}</span><br></pre></td></tr></table></figure><h2 id="Map"><a href="#Map" class="headerlink" title="Map"></a>Map</h2><p>Map中提供了Eigen与C++基本数组转换的方法,即通过指针与所占内存空间进行转换</p><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">testMap02</span><span class="params">()</span> </span>{</span><br><span class="line"><span class="keyword">int</span> data[] = { <span class="number">1</span>,<span class="number">2</span>,<span class="number">3</span>,<span class="number">4</span>,<span class="number">5</span>,<span class="number">6</span>,<span class="number">7</span>,<span class="number">8</span>,<span class="number">9</span> };</span><br><span class="line"><span class="function">Map<RowVectorXi> <span class="title">v</span><span class="params">(data, <span class="number">4</span>)</span></span>;</span><br><span class="line">cout << <span class="string">"The mapped vector v is: "</span> << v << <span class="string">"\n"</span>;</span><br><span class="line"><span class="keyword">new</span> (&v) Map<RowVectorXi>(data + <span class="number">4</span>, <span class="number">5</span>);</span><br><span class="line">cout << <span class="string">"Now v is: "</span> << v << <span class="string">"\n"</span>;</span><br><span class="line">}</span><br></pre></td></tr></table></figure><p>目前还不知道如何将Map与std::vector直接转换</p><h2 id="矩阵内部重叠问题"><a href="#矩阵内部重叠问题" class="headerlink" title="矩阵内部重叠问题"></a>矩阵内部重叠问题</h2><p>Eigen中用aliasing描述这一问题</p><p>1.在以下例子中重叠没有问题:</p><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">mat.<span class="built_in">bottomRightCorner</span>(<span class="number">2</span>,<span class="number">2</span>) = mat.<span class="built_in">topLeftCorner</span>(<span class="number">2</span>,<span class="number">2</span>); <span class="comment">//相当于将矩阵自身左上角四个元素赋值给右下角</span></span><br></pre></td></tr></table></figure><p>2.但是当<code>a = a.transpose();</code>时就会因为重叠出现非编译错误</p><p>所以如何解决aliasing问题?</p><p>我们可以使用eval()函数:</p><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">a = a.<span class="built_in">transpose</span>().<span class="built_in">eval</span>();<span class="comment">//原理大概是预先取一块内存空间,暂存a.transpose()结果,然后再复制给等式左边</span></span><br></pre></td></tr></table></figure><p>当然对于转置,Eigen提供了:</p><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">a.<span class="built_in">transposeInPlace</span>();<span class="comment">//在原位置直接实现转置</span></span><br></pre></td></tr></table></figure><h3 id="其他常用方法的重叠解决方法"><a href="#其他常用方法的重叠解决方法" class="headerlink" title="其他常用方法的重叠解决方法"></a>其他常用方法的重叠解决方法</h3><p><img src="https://img-blog.csdnimg.cn/9586251cce194853a1bc283871925c78.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA6ZSD5YWJ55Om5Lqu55qE5p6V5bCP6Lev,size_17,color_FFFFFF,t_70,g_se,x_16" alt="在这里插入图片描述"></p><h3 id="总结"><a href="#总结" class="headerlink" title="总结"></a>总结</h3><p>1.alias对于标量计算、array和Matrrix加法是没有威胁的</p><p>2.当你使用矩阵乘法时,他默认会发生重叠。当你肯定重叠不会产生影响时,则可以使用<strong>noalias()</strong> </p><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line"><span class="function">MatrixXf <span class="title">matA</span><span class="params">(<span class="number">2</span>,<span class="number">2</span>)</span>, <span class="title">matB</span><span class="params">(<span class="number">2</span>,<span class="number">2</span>)</span></span>; </span><br><span class="line">matA << <span class="number">2</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">2</span>;</span><br><span class="line"> </span><br><span class="line"><span class="comment">// Simple but not quite as efficient</span></span><br><span class="line">matB = matA * matA;</span><br><span class="line">cout << matB << endl << endl;</span><br><span class="line"> </span><br><span class="line"><span class="comment">// More complicated but also more efficient</span></span><br><span class="line">matB.<span class="built_in">noalias</span>() = matA * matA;</span><br><span class="line">cout << matB; </span><br><span class="line"><span class="comment">//两个B一样</span></span><br></pre></td></tr></table></figure><p>3.其他情况下,Eigen都默认不会重叠,所以需要判断,视情况加.eval();</p><p>4.从版本3.3之后,对于矩阵乘法,如果矩阵shape改变并且乘积结果不是直接赋值给左边,则也默认不会重叠!!</p><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="function">MatrixXf <span class="title">A</span><span class="params">(<span class="number">2</span>,<span class="number">2</span>)</span>, <span class="title">B</span><span class="params">(<span class="number">3</span>,<span class="number">2</span>)</span></span>;</span><br><span class="line">B << <span class="number">2</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">3</span>, <span class="number">1</span>, <span class="number">1</span>;</span><br><span class="line">A << <span class="number">2</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">-2</span>;</span><br><span class="line">A = (B * A).<span class="built_in">cwiseAbs</span>(); <span class="comment">//由于B*A后面跟了方法,不是直接赋值,所以此处发生重叠,结果错误</span></span><br><span class="line"><span class="comment">//必须是:</span></span><br><span class="line">A = (B * A).<span class="built_in">eval</span>().<span class="built_in">cwiseAbs</span>();</span><br><span class="line">cout << A;</span><br></pre></td></tr></table></figure><h2 id="ColMajor-amp-RowMajor"><a href="#ColMajor-amp-RowMajor" class="headerlink" title="ColMajor&RowMajor"></a>ColMajor&RowMajor</h2><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">ColRowMajor</span><span class="params">()</span> </span>{</span><br><span class="line">Matrix<<span class="keyword">int</span>, <span class="number">3</span>, <span class="number">3</span>, ColMajor> m;</span><br><span class="line">m << <span class="number">1</span>, <span class="number">2</span>, <span class="number">3</span>, <span class="number">4</span>, <span class="number">5</span>, <span class="number">6</span>, <span class="number">7</span>, <span class="number">8</span>, <span class="number">9</span>;</span><br><span class="line"><span class="keyword">for</span> (<span class="keyword">int</span> i = <span class="number">0</span>; i < <span class="number">9</span>; i++) {</span><br><span class="line">cout << *(m.<span class="built_in">data</span>() + i) << endl;<span class="comment">//结果是:1 4 7 2 5 8 3 6 9</span></span><br><span class="line">}</span><br><span class="line">}</span><br></pre></td></tr></table></figure><p>如何选择:一般选择行存储,则按行遍历更快;Eigen默认是列,里面很多算法都是列优先,所以我们在选择时最好还是按照列优先</p><h1 id="线性代数和分解"><a href="#线性代数和分解" class="headerlink" title="线性代数和分解"></a>线性代数和分解</h1><p><img src="https://img-blog.csdnimg.cn/b89eae282a88498d874ba86936f0fde8.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA6ZSD5YWJ55Om5Lqu55qE5p6V5bCP6Lev,size_20,color_FFFFFF,t_70,g_se,x_16" alt="在这里插入图片描述"></p><p>上表都是矩阵分解的方法,第一列是类名,第二列是类成员函数。这些类都有solve函数以及inverse函数</p><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">//以下形式便于理解类型</span></span><br><span class="line"><span class="function">ColPivHouseholderQR<Matrix3f> <span class="title">dec</span><span class="params">(A)</span></span>;</span><br><span class="line">Vector3f x = dec.<span class="built_in">solve</span>(b);</span><br></pre></td></tr></table></figure><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="function">HouseholderQR<MatrixXf> <span class="title">qr</span><span class="params">(<span class="number">50</span>,<span class="number">50</span>)</span></span>;</span><br><span class="line">MatrixXf A = MatrixXf::<span class="built_in">Random</span>(<span class="number">50</span>,<span class="number">50</span>);</span><br><span class="line">qr.<span class="built_in">compute</span>(A); <span class="comment">// no dynamic memory allocation</span></span><br><span class="line">qr.<span class="built_in">inverse</span>();</span><br></pre></td></tr></table></figure><p>//一般用以下方法求解<script type="math/tex">Ax=b</script></p><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">Matrix2f x = A.<span class="built_in">ldlt</span>().<span class="built_in">solve</span>(b);</span><br></pre></td></tr></table></figure><p>一般用以下方法求$A^{-1}$</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">A.colPivHouseholderQr().inverse();</span><br></pre></td></tr></table></figure><p>检验显示:<code>m.colPivHouseholderQr().inverse()</code>求解逆矩阵比<code>m.inverse()</code> 更准确</p><h2 id="特征值-特征向量"><a href="#特征值-特征向量" class="headerlink" title="特征值 特征向量"></a>特征值 特征向量</h2><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">eigenvalues</span><span class="params">()</span> </span>{</span><br><span class="line">Matrix2f A;</span><br><span class="line">A << <span class="number">1</span>, <span class="number">2</span>, <span class="number">2</span>, <span class="number">3</span>;</span><br><span class="line">cout << <span class="string">"Here is the matrix A:\n"</span> << A << endl;</span><br><span class="line"><span class="function">SelfAdjointEigenSolver<Matrix2f> <span class="title">eigensolver</span><span class="params">(A)</span></span>;</span><br><span class="line"><span class="keyword">if</span> (eigensolver.<span class="built_in">info</span>() != Success) <span class="built_in">abort</span>();</span><br><span class="line">cout << <span class="string">"The eigenvalues of A are:\n"</span> << eigensolver.<span class="built_in">eigenvalues</span>() << endl; <span class="comment">//特征值</span></span><br><span class="line">cout << <span class="string">"Here's a matrix whose columns are eigenvectors of A \n"</span></span><br><span class="line"><< <span class="string">"corresponding to these eigenvalues:\n"</span></span><br><span class="line"><< eigensolver.<span class="built_in">eigenvectors</span>() << endl; <span class="comment">//特征向量</span></span><br><span class="line">}</span><br></pre></td></tr></table></figure><p>注意:此时的特征值 特征向量不是从大到小排列</p><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="function">EigenSolver<MatrixXf> <span class="title">solver</span><span class="params">(covMat)</span></span>;</span><br><span class="line">featureValue = solver.<span class="built_in">pseudoEigenvalueMatrix</span>().<span class="built_in">diagonal</span>();</span><br><span class="line">featureVector = solver.<span class="built_in">pseudoEigenvectors</span>();</span><br></pre></td></tr></table></figure><h1 id="稀疏矩阵"><a href="#稀疏矩阵" class="headerlink" title="稀疏矩阵"></a>稀疏矩阵</h1><p>稀疏矩阵(Sparse Martix)需要include以下头文件<br><img src="https://img-blog.csdnimg.cn/e9221ae29fc34c14b9c97bf690edd05e.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA6ZSD5YWJ55Om5Lqu55qE5p6V5bCP6Lev,size_20,color_FFFFFF,t_70,g_se,x_16" alt="在这里插入图片描述"></p><h1 id="几何模块"><a href="#几何模块" class="headerlink" title="几何模块"></a>几何模块</h1><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="meta-keyword">include</span> <span class="meta-string"><Eigen/Geometry></span> </span></span><br></pre></td></tr></table></figure><h2 id="AlignedBox"><a href="#AlignedBox" class="headerlink" title="AlignedBox"></a>AlignedBox</h2><p>这一模块用于包围盒操作</p><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">Eigen::AlignedBox< Scalar, AmbientDim ><span class="comment">//<float,3></span></span><br></pre></td></tr></table></figure><p>简单实例:<br><img src="https://img-blog.csdnimg.cn/36ab8d7c8fd4467a9ae332e27efa4139.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA6ZSD5YWJ55Om5Lqu55qE5p6V5bCP6Lev,size_20,color_FFFFFF,t_70,g_se,x_16" alt="在这里插入图片描述"></p><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">testAlignedBox</span><span class="params">()</span> </span>{</span><br><span class="line">AlignedBox2d myAlignedBox;</span><br><span class="line">Vector2d m;</span><br><span class="line">m << <span class="number">1</span>, <span class="number">0.5</span>;</span><br><span class="line">myAlignedBox.<span class="built_in">extend</span>(m);</span><br><span class="line">m << <span class="number">2</span>, <span class="number">2</span>;</span><br><span class="line">myAlignedBox.<span class="built_in">extend</span>(m);</span><br><span class="line">cout <<<span class="string">"max():"</span><<myAlignedBox.<span class="built_in">max</span>() << endl;<span class="comment">//返回最大的corner</span></span><br><span class="line">m << <span class="number">3</span>, <span class="number">4</span>;</span><br><span class="line">cout << <span class="string">"exteriorDistance():"</span> << myAlignedBox.<span class="built_in">exteriorDistance</span>(m) <span class="comment">//外部一个向量m与包围盒距离</span></span><br><span class="line"><< <span class="string">"squaredExteriorDistance():"</span> << myAlignedBox.<span class="built_in">squaredExteriorDistance</span>(m) << endl;<span class="comment">//外部一向量与包围盒距离平方</span></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment">//再构建一个alignedBox</span></span><br><span class="line">AlignedBox2d myAlignedBox2,myalignedBox3;</span><br><span class="line">Vector2d b;</span><br><span class="line">b << <span class="number">0.5</span>, <span class="number">0.5</span>;</span><br><span class="line">myAlignedBox2.<span class="built_in">extend</span>(b);</span><br><span class="line">b << <span class="number">1.5</span>, <span class="number">1.5</span>;</span><br><span class="line">myAlignedBox2.<span class="built_in">extend</span>(b);</span><br><span class="line">myalignedBox3 = myAlignedBox2.<span class="built_in">intersection</span>(myAlignedBox);<span class="comment">//1 2 做交集 此外,intersects()返回的是bool值</span></span><br><span class="line">cout << myalignedBox3.BottomLeft << endl;</span><br><span class="line">b << <span class="number">1.25</span>, <span class="number">1</span>;</span><br><span class="line">cout <<<span class="string">"contains (0 or 1):"</span><< myalignedBox3.<span class="built_in">contains</span>(b) << endl;<span class="comment">//看b是否在myalignedBox3中,参数也可以是box</span></span><br><span class="line">cout << <span class="string">"diagonal():"</span> << myalignedBox3.<span class="built_in">diagonal</span>() << endl;<span class="comment">//对角线向量</span></span><br><span class="line"></span><br><span class="line">cout << <span class="string">"random sample:"</span> << myAlignedBox.<span class="built_in">sample</span>() << endl;<span class="comment">//以均匀分布抽样的边界框内的随机点</span></span><br><span class="line"></span><br><span class="line">cout << <span class="string">"sizes():"</span> << myalignedBox3.<span class="built_in">sizes</span>() << endl;<span class="comment">//myalignBox3的长宽//vector</span></span><br><span class="line">}</span><br></pre></td></tr></table></figure><p>cornerType:<br><img src="https://img-blog.csdnimg.cn/9ae8020a1d5e477c8bcfce1fa59c603e.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA6ZSD5YWJ55Om5Lqu55qE5p6V5bCP6Lev,size_10,color_FFFFFF,t_70,g_se,x_16" alt="在这里插入图片描述"></p><p>transform和translate稍后再看</p><h2 id="AngleAxis"><a href="#AngleAxis" class="headerlink" title="AngleAxis"></a><strong>AngleAxis</strong></h2><p>注意:AngleAxis运用时:Axis的轴需要<strong>归一化</strong></p><blockquote><p>首先,Eigen在MatrixBase中定义了</p><p>UnitX(); UnitY(); UnitZ(); UnitW(); 作为默认的四个轴</p><p>例如:<code>Vector3d::UnitX();</code> 必须是固定大小的</p></blockquote><h1 id="附录"><a href="#附录" class="headerlink" title="附录"></a>附录</h1><h2 id="将特征值特征向量按特征值大小排列"><a href="#将特征值特征向量按特征值大小排列" class="headerlink" title="将特征值特征向量按特征值大小排列"></a>将特征值特征向量按特征值大小排列</h2><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">using</span> eigMatrix = Eigen::Matrix<<span class="keyword">float</span>, Eigen::Dynamic, Eigen::Dynamic>;</span><br><span class="line"><span class="keyword">using</span> eigVector = Eigen::Matrix<<span class="keyword">float</span>, Eigen::Dynamic, <span class="number">1</span>>;</span><br><span class="line"><span class="keyword">using</span> stdTupleEigen = std::tuple<<span class="keyword">float</span>, eigMatrix>;</span><br><span class="line"><span class="keyword">using</span> stdVectorTuple = std::vector<stdTupleEigen>;</span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">sortEigenVectorByValues</span><span class="params">(eigVector& eigenValues, eigMatrix& eigenVectors)</span></span></span><br><span class="line"><span class="function"></span>{</span><br><span class="line">stdVectorTuple eigenValueAndVector;</span><br><span class="line"><span class="keyword">int</span> size = <span class="keyword">static_cast</span><<span class="keyword">int</span>>(eigenValues.<span class="built_in">size</span>()); <span class="comment">//强制转换</span></span><br><span class="line"></span><br><span class="line">eigenValueAndVector.<span class="built_in">reserve</span>(size);</span><br><span class="line"><span class="keyword">for</span> (<span class="keyword">int</span> i = <span class="number">0</span>; i < size; ++i)</span><br><span class="line">eigenValueAndVector.<span class="built_in">push_back</span>(<span class="built_in">stdTupleEigen</span>(eigenValues[i], eigenVectors.<span class="built_in">col</span>(i)));</span><br><span class="line"></span><br><span class="line"><span class="comment">// 使用标准库中的sort,按从大到小排序</span></span><br><span class="line">std::<span class="built_in">sort</span>(eigenValueAndVector.<span class="built_in">begin</span>(), eigenValueAndVector.<span class="built_in">end</span>(),</span><br><span class="line">[&](<span class="keyword">const</span> stdTupleEigen& a, <span class="keyword">const</span> stdTupleEigen& b) -> <span class="keyword">bool</span> {</span><br><span class="line"><span class="keyword">return</span> std::get<<span class="number">0</span>>(a) > std::get<<span class="number">0</span>>(b);</span><br><span class="line">});</span><br><span class="line"></span><br><span class="line"><span class="keyword">for</span> (<span class="keyword">int</span> i = <span class="number">0</span>; i < size; ++i) {</span><br><span class="line">eigenValues[i] = std::get<<span class="number">0</span>>(eigenValueAndVector[i]); <span class="comment">// 排序后的特征值</span></span><br><span class="line">eigenVectors.<span class="built_in">col</span>(i).<span class="built_in">swap</span>(std::get<<span class="number">1</span>>(eigenValueAndVector[i])); <span class="comment">// 排序后的特征向量</span></span><br><span class="line">}</span><br><span class="line">}</span><br></pre></td></tr></table></figure>]]></content>
<tags>
<tag> c++ </tag>
<tag> eigen </tag>
</tags>
</entry>
<entry>
<title>opencv c++版本基础</title>
<link href="/2021/02/12/openCV-cpp/"/>
<url>/2021/02/12/openCV-cpp/</url>
<content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="\assets\css\APlayer.min.css"><script src="\assets\js\APlayer.min.js" class="aplayer-secondary-script-marker"></script><p><a href="https://docs.opencv.org/2.4/doc/tutorials/tutorials.html">OpenCV Tutorials — OpenCV 2.4.13.7 documentation</a></p><p><a href="http://www.opencv.org.cn/opencvdoc/2.3.2/html/">Welcome to opencv documentation! — OpenCV 2.3.2 documentation</a></p><p><a href="https://docs.opencv.org/3.4/examples.html">OpenCV: Examples</a></p><p><a href="https://github.com/sileixinhua/OpenCV_C-_tutorials">https://github.com/sileixinhua/OpenCV_C-_tutorials</a></p><h2 id="include"><a href="#include" class="headerlink" title="include"></a>include</h2><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string"><iostream></span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string"><opencv2/core.hpp></span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string"><opencv2/highgui.hpp></span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string"><opencv2/opencv.hpp></span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string"><opencv2/imgproc/types_c.h></span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string"><string></span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string"><vector></span></span></span><br><span class="line"><span class="keyword">using</span> <span class="keyword">namespace</span> std;</span><br><span class="line"><span class="keyword">using</span> <span class="keyword">namespace</span> cv;</span><br></pre></td></tr></table></figure><h2 id="mat矩阵"><a href="#mat矩阵" class="headerlink" title="mat矩阵"></a>mat矩阵</h2><h3 id="创建mat矩阵"><a href="#创建mat矩阵" class="headerlink" title="创建mat矩阵"></a>创建mat矩阵</h3><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="function">cv::Mat <span class="title">mats</span><span class="params">(<span class="number">500</span>, <span class="number">400</span>, CV_8U,<span class="number">100</span>)</span></span>;</span><br><span class="line">Matx<<span class="keyword">double</span>, <span class="number">5</span>, <span class="number">3</span>> matrix;</span><br><span class="line">matrix << <span class="number">1</span>, <span class="number">2</span>, <span class="number">3</span>, <span class="number">4</span>, <span class="number">5</span>,</span><br><span class="line"> <span class="number">6</span>, <span class="number">7</span>, <span class="number">8</span>, <span class="number">9</span>, <span class="number">10</span>,</span><br><span class="line"> <span class="number">11</span>, <span class="number">12</span>, <span class="number">13</span>, <span class="number">14</span>, <span class="number">15</span>;</span><br></pre></td></tr></table></figure><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">//以下为新建mat</span></span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">creatMat</span><span class="params">()</span> </span>{</span><br><span class="line"><span class="comment">//mat创建标准矩阵具有同一种类的构造</span></span><br><span class="line"><span class="keyword">int</span> rows = <span class="number">5</span>;</span><br><span class="line"><span class="keyword">int</span> cols = <span class="number">5</span>;</span><br><span class="line"><span class="comment">//1.1 创建单位矩阵</span></span><br><span class="line">Mat eyeMat = Mat::<span class="built_in">eye</span>(rows, cols, CV_8UC1);</span><br><span class="line"><span class="comment">//1.2 创建全零矩阵</span></span><br><span class="line">Size zeroSize = Size_<<span class="keyword">int</span>>(<span class="number">5</span>, <span class="number">5</span>);<span class="comment">//系统定义的size:typedef Size_<int>Size2i; typedef Size2i Size;</span></span><br><span class="line">Mat zeroMat = Mat::<span class="built_in">zeros</span>(zeroSize, CV_8UC1);</span><br><span class="line"><span class="comment">//1.3 创建全1矩阵</span></span><br><span class="line">Mat onesMat = Mat::<span class="built_in">ones</span>(rows, cols, CV_8UC1);</span><br><span class="line">cout << eyeMat << <span class="string">"\n----\n"</span> << zeroMat << <span class="string">"\n----\n"</span> << onesMat << endl;</span><br><span class="line">}</span><br></pre></td></tr></table></figure><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">//利用构造函数创建矩阵</span></span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">createMat2</span><span class="params">()</span> </span>{</span><br><span class="line"><span class="keyword">int</span> rows = <span class="number">5</span>;</span><br><span class="line"><span class="keyword">int</span> cols = <span class="number">5</span>;</span><br><span class="line"><span class="comment">//1.1 </span></span><br><span class="line"><span class="function">Mat <span class="title">mat1</span><span class="params">(rows, cols, CV_8UC1)</span></span>;</span><br><span class="line"><span class="comment">//1.2</span></span><br><span class="line"><span class="function">Mat <span class="title">mat2</span><span class="params">(cv::Size(rows, cols), CV_8UC1)</span></span>;</span><br><span class="line"><span class="comment">//1.3</span></span><br><span class="line"><span class="function">Mat <span class="title">mat3</span><span class="params">(rows, cols, CV_8UC3, Scalar(<span class="number">2</span>, <span class="number">3</span>, <span class="number">1</span>))</span></span>;</span><br><span class="line"><span class="comment">//1.4</span></span><br><span class="line"><span class="function">Mat <span class="title">mat4</span><span class="params">(std::vector<<span class="keyword">int</span>>(rows, cols), CV_8UC3)</span></span>;</span><br><span class="line"><span class="comment">//COPY</span></span><br><span class="line"><span class="function">Mat <span class="title">mat5</span><span class="params">(mat3)</span></span>;</span><br><span class="line"> <span class="comment">//1.6</span></span><br><span class="line"> <span class="function">Mat <span class="title">imageROI</span><span class="params">(mat5,Rect(<span class="number">10</span>,<span class="number">10</span>,<span class="number">500</span>,<span class="number">400</span>))</span></span></span><br><span class="line"><span class="function">}</span></span><br><span class="line"><span class="function"></span></span><br><span class="line"><span class="function"><span class="comment">//先定义后创建</span></span></span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">define_create</span><span class="params">()</span> </span>{</span><br><span class="line"><span class="keyword">int</span> rows = <span class="number">5</span>;</span><br><span class="line"><span class="keyword">int</span> cols = <span class="number">5</span>;</span><br><span class="line">Mat mat;</span><br><span class="line">mat.<span class="built_in">create</span>(rows, cols, CV_8UC3);</span><br><span class="line">Mat mat1;</span><br><span class="line">mat1.<span class="built_in">create</span>(<span class="built_in">Size</span>(rows, cols), CV_8UC1);</span><br><span class="line">}</span><br></pre></td></tr></table></figure><blockquote><p>mat3输出结果:</p><p>[ 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3, 1;<br>2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3, 1;<br>2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3, 1;<br>2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3, 1;<br>2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3, 1]</p></blockquote><h3 id="矩阵mat赋值"><a href="#矩阵mat赋值" class="headerlink" title="矩阵mat赋值"></a>矩阵mat赋值</h3><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">//矩阵初始化</span></span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">MatrixInit</span><span class="params">()</span> </span>{</span><br><span class="line"><span class="keyword">int</span> rows = <span class="number">5</span>;</span><br><span class="line"><span class="keyword">int</span> cols = <span class="number">5</span>;</span><br><span class="line"><span class="comment">//3.1 创建并初始化矩阵</span></span><br><span class="line">Mat mat8 = (Mat_<uchar>(rows, cols) << <span class="number">1</span>, <span class="number">2</span>, <span class="number">3</span>, <span class="number">4</span>, <span class="number">5</span>, <span class="number">6</span>, <span class="number">7</span>, <span class="number">8</span>, <span class="number">9</span>);</span><br><span class="line">cout << <span class="string">"采用Mat_类构造矩阵\n"</span> << mat8 << endl;</span><br><span class="line"><span class="comment">//3.2 构造初始化</span></span><br><span class="line"><span class="function">Mat <span class="title">mat9</span><span class="params">(rows, cols, CV_8UC3, Scalar(<span class="number">255</span>))</span></span>;</span><br><span class="line">cout << <span class="string">"构造初始化\n"</span> << mat9 << endl;</span><br><span class="line"><span class="comment">//3.3 采用at初始化单通道</span></span><br><span class="line"><span class="function">Mat <span class="title">mat1</span><span class="params">(rows, cols, CV_8UC1)</span></span>;</span><br><span class="line"><span class="keyword">for</span> (<span class="keyword">int</span> i = <span class="number">0</span>; i < mat1.rows; i++) {</span><br><span class="line"><span class="keyword">for</span> (<span class="keyword">int</span> j = <span class="number">0</span>; j < mat1.cols; j++) {</span><br><span class="line">mat1.at<uchar>(i, j) = <span class="number">12</span>;</span><br><span class="line">}</span><br><span class="line">}</span><br><span class="line">cout << <span class="string">"单通道矩阵\n"</span> << mat1 << endl;</span><br><span class="line"><span class="comment">//3.4 采用at初始化多通道</span></span><br><span class="line"><span class="function">Mat <span class="title">mat6</span><span class="params">(rows, cols, CV_8UC3)</span></span>;</span><br><span class="line"><span class="keyword">for</span> (<span class="keyword">int</span> i = <span class="number">0</span>; i < mat6.rows; i++) {</span><br><span class="line"><span class="keyword">for</span> (<span class="keyword">int</span> j = <span class="number">0</span>; j < mat6.cols; j++) {</span><br><span class="line">mat6.at<cv::Vec3b>(i, j) = cv::<span class="built_in">Vec3b</span>(<span class="number">1</span>, <span class="number">3</span>, <span class="number">2</span>); <span class="comment">//Vec<uchar, 3></span></span><br><span class="line">}</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment">//3.5 采用行指针ptr初始化单通道</span></span><br><span class="line"><span class="keyword">for</span> (<span class="keyword">int</span> i = <span class="number">0</span>; i < mat1.rows; i++) {</span><br><span class="line">uchar *ptr = mat1.ptr<uchar>(i); </span><br><span class="line"><span class="comment">//Vec3b *ptr = mat1.ptr<Vec3b>(i); 多通道</span></span><br><span class="line"><span class="keyword">for</span> (<span class="keyword">int</span> j = <span class="number">0</span>; j < mat1.cols; j++) {</span><br><span class="line">ptr[j] = <span class="number">132</span>;</span><br><span class="line">}</span><br><span class="line">}</span><br><span class="line">}</span><br></pre></td></tr></table></figure><h3 id="拷贝"><a href="#拷贝" class="headerlink" title="拷贝"></a>拷贝</h3><p><strong>1.浅拷贝</strong><br><code>B = A</code><br><code>B(A)</code><br>这类拷贝方法仅创建了新的矩阵头,共用同一个内存空间,在修改新对象的时候,旧对象也会改变。</p><p><strong>2.深拷贝</strong><br><code>B = A.clone()</code><br><code>A.copyTo(B)</code><br>这类拷贝方法为新的矩阵申请了新的内存空间,在修改新对象的时候,旧对象不会改变。</p><h4 id="在此辨析setTo与copyTo"><a href="#在此辨析setTo与copyTo" class="headerlink" title="在此辨析setTo与copyTo"></a>在此辨析setTo与copyTo</h4><p><strong>利用setTo()赋值</strong></p><p>切记:setTo只能给矩阵赋一个标量值,即第一个参数必须是数值,不能是图像</p><p>用法:</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">新图像.setTo(数值,mask);</span><br></pre></td></tr></table></figure><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">Mat mat1;</span><br><span class="line">mat1.<span class="built_in">create</span>(rows,cols,CV_8UC1);</span><br><span class="line">mat1.<span class="built_in">setTo</span>(<span class="number">5</span>); <span class="comment">//全部赋值为5</span></span><br></pre></td></tr></table></figure><p>setTo可以利用mask蒙版</p><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">Mat mmat;</span><br><span class="line">mmat.<span class="built_in">create</span>(rows,cols,CV_8UC1);</span><br><span class="line">mmat.<span class="built_in">setTo</span>(<span class="number">0</span>, mmat < <span class="number">85</span>); <span class="comment">//mmat<85 生成蒙版,小于85的为0,大于等于85的是255</span></span><br></pre></td></tr></table></figure><p>第二个参数相当于:</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">Mat mask = (mmat<85)</span><br></pre></td></tr></table></figure><p><strong>copyTo</strong></p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">旧图像.copyTo(新图像,mask);</span><br></pre></td></tr></table></figure><h3 id="Mat属性"><a href="#Mat属性" class="headerlink" title="Mat属性"></a>Mat属性</h3><ul><li><strong>data</strong> uchar型的指针。Mat类分为了两个部分:矩阵头和指向矩阵数据部分的指针,data就是指向矩阵数据的指针。</li><li><strong>dims</strong> 矩阵的维度,例如5*6矩阵是二维矩阵,则dims=2,三维矩阵dims=3.</li><li><strong>rows</strong> 矩阵的行数</li><li><strong>cols</strong> 矩阵的列数</li><li><strong>size</strong> 矩阵的大小,size(cols,rows),如果矩阵的维数大于2,则是size(-1,-1)</li><li><strong>channels</strong> 矩阵元素拥有的通道数,例如常见的彩色图像,每一个像素由RGB三部分组成,则channels = 3</li></ul><p>下面的几个属性是和Mat中元素的数据类型相关的。</p><ul><li><p>type</p><p>表示了矩阵中元素的类型以及矩阵的通道个数,它是一系列的预定义的常量,其命名规则为CV_(位数)+(数据类型)+(通道数)。具体的有以下值:</p><p>| CV_8UC1 | CV_8UC2 | CV_8UC3 | CV_8UC4 |<br>| ———— | ———— | ———— | ———— |<br>| CV_8SC1 | CV_8SC2 | CV_8SC3 | CV_8SC4 |<br>| CV_16UC1 | CV_16UC2 | CV_16UC3 | CV_16UC4 |<br>| CV_16SC1 | CV_16SC2 | CV_16SC3 | CV_16SC4 |<br>| CV_32SC1 | CV_32SC2 | CV_32SC3 | CV_32SC4 |<br>| CV_32FC1 | CV_32FC2 | CV_32FC3 | CV_32FC4 |<br>| CV_64FC1 | CV_64FC2 | CV_64FC3 | CV_64FC4 |</p><p>这里U(unsigned integer)表示的是无符号整数,S(signed integer)是有符号整数,F(float)是浮点数。</p><p>例如:CV_16UC2,表示的是元素类型是一个16位的无符号整数,通道为2.</p><p>C1,C2,C3,C4则表示通道是1,2,3,4</p><p>type一般是在创建Mat对象时设定,如果要取得Mat的元素类型,则无需使用type,使用下面的depth</p></li><li><p><strong>depth</strong><br>矩阵中元素的一个通道的数据类型,这个值和type是相关的。例如 type为 CV_16SC2,一个2通道的16位的有符号整数。那么,depth则是CV_16S。depth也是一系列的预定义值,<br>将type的预定义值去掉通道信息就是depth值:<br>CV_8U CV_8S CV_16U CV_16S CV_32S CV_32F CV_64F</p></li></ul><h2 id="图像基本计算"><a href="#图像基本计算" class="headerlink" title="图像基本计算"></a>图像基本计算</h2><h3 id="利用函数进行加减乘除等"><a href="#利用函数进行加减乘除等" class="headerlink" title="利用函数进行加减乘除等"></a>利用函数进行加减乘除等</h3><p>对于<code>add</code> 函数,只能两个大小、通道数相同的两个矩阵相加</p><p>可以添加mask矩阵,mask矩阵中,数值为0的地方,最终输出矩阵的对应元素值为0;数值不为0的地方,最终输出矩阵的对应元素值为两个矩阵对应元素的相加值。</p><p>例如下例中,</p><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">Add</span><span class="params">()</span> </span>{</span><br><span class="line">cv::Mat src1, src2, dst;</span><br><span class="line"><span class="keyword">int</span> rows = <span class="number">10</span>;</span><br><span class="line"><span class="keyword">int</span> cols = <span class="number">10</span>;</span><br><span class="line"></span><br><span class="line">src1.<span class="built_in">create</span>(rows, cols, CV_8UC1);</span><br><span class="line">src1.<span class="built_in">setTo</span>(<span class="number">20</span>);</span><br><span class="line">src2.<span class="built_in">create</span>(rows, cols, CV_8UC1);</span><br><span class="line">src2.<span class="built_in">setTo</span>(<span class="number">100</span>);</span><br><span class="line"><span class="function">Mat <span class="title">mask</span><span class="params">(rows, cols, CV_8UC1, Scalar(<span class="number">0</span>))</span></span>;</span><br><span class="line"><span class="keyword">for</span> (<span class="keyword">int</span> i = <span class="number">0</span>; i < mask.rows/<span class="number">2</span>; i++) {</span><br><span class="line"><span class="keyword">for</span> (<span class="keyword">int</span> j = <span class="number">0</span>; j < mask.cols/<span class="number">2</span>; j++) {</span><br><span class="line">mask.at<uchar>(i, j) = <span class="number">1</span>;</span><br><span class="line">}</span><br><span class="line">}</span><br><span class="line"><span class="built_in">add</span>(src1, src2, dst, mask);</span><br><span class="line">cout << dst << endl;</span><br><span class="line"><span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">}</span><br></pre></td></tr></table></figure><p><strong>其他的还有:</strong></p><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">add</span><span class="params">(InputArray src1, InputArray src2, OutputArray dst,InputArray mask=noArray(), <span class="keyword">int</span> dtype=<span class="number">-1</span>)</span></span>;<span class="comment">//dst = src1 + src2</span></span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">subtract</span><span class="params">(InputArray src1, InputArray src2, OutputArray dst,InputArray mask=noArray(), <span class="keyword">int</span> dtype=<span class="number">-1</span>)</span></span>;<span class="comment">//dst = src1 - src2</span></span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">multiply</span><span class="params">(InputArray src1, InputArray src2,OutputArray dst, <span class="keyword">double</span> scale=<span class="number">1</span>, <span class="keyword">int</span> dtype=<span class="number">-1</span>)</span></span>;<span class="comment">//dst = scale*src1*src2</span></span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">divide</span><span class="params">(InputArray src1, InputArray src2, OutputArray dst,<span class="keyword">double</span> scale=<span class="number">1</span>, <span class="keyword">int</span> dtype=<span class="number">-1</span>)</span></span>;<span class="comment">//dst = scale*src1/src2</span></span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">divide</span><span class="params">(<span class="keyword">double</span> scale, InputArray src2,OutputArray dst, <span class="keyword">int</span> dtype=<span class="number">-1</span>)</span></span>;<span class="comment">//dst = scale/src2</span></span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">scaleAdd</span><span class="params">(InputArray src1, <span class="keyword">double</span> alpha, InputArray src2, OutputArray dst)</span></span>;<span class="comment">//dst = alpha*src1 + src2</span></span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">addWeighted</span><span class="params">(InputArray src1, <span class="keyword">double</span> alpha, InputArray src2,<span class="keyword">double</span> beta, <span class="keyword">double</span> gamma, OutputArray dst, <span class="keyword">int</span> dtype=<span class="number">-1</span>)</span></span>;<span class="comment">//dst = alpha*src1 + beta*src2 + gamma</span></span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">sqrt</span><span class="params">(InputArray src, OutputArray dst)</span></span>;<span class="comment">//计算每个矩阵元素的平方根</span></span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">pow</span><span class="params">(InputArray src, <span class="keyword">double</span> power, OutputArray dst)</span></span>;<span class="comment">//src的power次幂</span></span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">exp</span><span class="params">(InputArray src, OutputArray dst)</span></span>;<span class="comment">//dst = e**src(**表示指数的意思)</span></span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">log</span><span class="params">(InputArray src, OutputArray dst)</span></span>;<span class="comment">//dst = log(abs(src))</span></span><br></pre></td></tr></table></figure><h3 id="重载运算符"><a href="#重载运算符" class="headerlink" title="重载运算符"></a>重载运算符</h3><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">learn_operator</span><span class="params">()</span> </span>{</span><br><span class="line">cv::Mat src1, src2, dst,multiply,add,subtract,divide, divide2, multiply2, add2, subtract2;</span><br><span class="line"><span class="keyword">int</span> rows = <span class="number">10</span>;</span><br><span class="line"><span class="keyword">int</span> cols = <span class="number">10</span>;</span><br><span class="line"></span><br><span class="line">src1.<span class="built_in">create</span>(rows, cols, CV_8UC1);</span><br><span class="line">src1.<span class="built_in">setTo</span>(<span class="number">2</span>);</span><br><span class="line">src2.<span class="built_in">create</span>(rows, cols, CV_8UC1);</span><br><span class="line">src2.<span class="built_in">setTo</span>(<span class="number">100</span>);</span><br><span class="line"><span class="function">Mat <span class="title">mask</span><span class="params">(rows, cols, CV_8UC1, Scalar(<span class="number">0</span>))</span></span>;</span><br><span class="line"><span class="keyword">for</span> (<span class="keyword">int</span> i = <span class="number">0</span>; i < mask.rows / <span class="number">2</span>; i++) {</span><br><span class="line"><span class="keyword">for</span> (<span class="keyword">int</span> j = <span class="number">0</span>; j < mask.cols / <span class="number">2</span>; j++) {</span><br><span class="line">mask.at<uchar>(i, j) = <span class="number">1</span>;</span><br><span class="line">}</span><br><span class="line">}</span><br><span class="line">divide = src2 / src1;</span><br><span class="line">divide2 = src2 / <span class="number">10</span>;</span><br><span class="line">multiply = src1 * <span class="number">5</span>;</span><br><span class="line">add = src1 + src2;</span><br><span class="line">add2 = src1 + <span class="number">37</span>;</span><br><span class="line">subtract = src2 - src1;</span><br><span class="line">subtract2 = src2 - <span class="number">43</span>;</span><br><span class="line"></span><br><span class="line"><span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">}</span><br></pre></td></tr></table></figure><p>我们可以看出在opencv中可以运用+-/*,得出一个矩阵。</p><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="function">Mat <span class="title">rand_mat</span><span class="params">(rows, cols, CV_8UC1)</span></span>;</span><br><span class="line"><span class="built_in">randn</span>(rand_mat, <span class="number">100</span>, <span class="number">10</span>);</span><br><span class="line">cout << rand_mat << endl;</span><br><span class="line">cout << <span class="string">"--------result------------"</span> << endl;</span><br><span class="line">cout << (rand_mat < <span class="number">100</span>) << endl;</span><br></pre></td></tr></table></figure><blockquote><p>[100, 102, 93, 96, 112;<br> 97, 94, 103, 105, 89;<br> 108, 100, 113, 80, 81;<br> 95, 93, 119, 103, 86;<br> 115, 92, 75, 85, 86]<br>————result——————<br>[ 0, 0, 255, 255, 0;<br> 255, 255, 0, 0, 255;<br> 0, 0, 0, 255, 255;<br> 255, 255, 0, 0, 255;<br> 0, 255, 255, 255, 255]</p></blockquote><p>由此可以看出<code>(rand_mat < 100)</code>的作用可以生成蒙版,这一启示可以帮助我们在<code>setTo</code>等函数中构建mask</p><h2 id="在图像上绘制"><a href="#在图像上绘制" class="headerlink" title="在图像上绘制"></a>在图像上绘制</h2><p><strong>绘制矩形</strong></p><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br></pre></td><td class="code"><pre><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">DrawRect</span><span class="params">()</span> </span>{</span><br><span class="line"><span class="keyword">const</span> <span class="keyword">char</span>* filename = <span class="string">"D:\\myTemp\\cv\\image\\test.jpg"</span>;</span><br><span class="line"></span><br><span class="line">cv::Mat mat = cv::<span class="built_in">imread</span>(filename);</span><br><span class="line"><span class="keyword">if</span> (mat.<span class="built_in">empty</span>()) {</span><br><span class="line"><span class="keyword">throw</span>(<span class="string">"Faild open file."</span>);</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line">cv::Point p0 = cv::<span class="built_in">Point</span>(mat.cols / <span class="number">8</span>, mat.rows / <span class="number">8</span>);</span><br><span class="line">cv::Point p1 = cv::<span class="built_in">Point</span>(mat.cols * <span class="number">7</span> / <span class="number">8</span>, mat.rows * <span class="number">7</span> / <span class="number">8</span>);</span><br><span class="line"></span><br><span class="line"><span class="built_in">rectangle</span>(mat, p0, p1, cv::<span class="built_in">Scalar</span>(<span class="number">0</span>, <span class="number">255</span>, <span class="number">0</span>), <span class="number">5</span>, <span class="number">8</span>);</span><br><span class="line"></span><br><span class="line">cv::Point p2 = cv::<span class="built_in">Point</span>(mat.cols * <span class="number">2</span> / <span class="number">8</span>, mat.rows * <span class="number">2</span> / <span class="number">8</span>);</span><br><span class="line">cv::Point p3 = cv::<span class="built_in">Point</span>(mat.cols * <span class="number">6</span> / <span class="number">8</span>, mat.rows * <span class="number">6</span> / <span class="number">8</span>);</span><br><span class="line"></span><br><span class="line"><span class="built_in">rectangle</span>(mat, p2, p3, cv::<span class="built_in">Scalar</span>(<span class="number">0</span>, <span class="number">255</span>, <span class="number">255</span>), <span class="number">2</span>, <span class="number">4</span>);</span><br><span class="line"> <span class="comment">//或者</span></span><br><span class="line"> <span class="comment">//rectangle(base, cv::Rect(50, 50, 100, 150), cv::Scalar({ 255,255,255 }), 2,4);</span></span><br><span class="line"><span class="comment">//#第二个参数是矩形的位置和大小,第三个是颜色值,第四个是线条宽度,第五个是线性</span></span><br><span class="line"></span><br><span class="line">cv::<span class="built_in">imshow</span>(<span class="string">"mat"</span>, mat);</span><br><span class="line">cv::<span class="built_in">waitKey</span>();</span><br><span class="line"></span><br><span class="line"><span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">}</span><br></pre></td></tr></table></figure><p><strong>绘制圆</strong></p><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">Circles</span><span class="params">()</span> </span>{</span><br><span class="line"><span class="function">cv::Mat <span class="title">img0</span><span class="params">(<span class="number">400</span>, <span class="number">400</span>, CV_8UC3, cv::Scalar(<span class="number">150</span>, <span class="number">150</span>, <span class="number">150</span>))</span></span>;</span><br><span class="line"><span class="built_in">circle</span>(img0, cv::<span class="built_in">Point</span>(<span class="number">200</span>, <span class="number">200</span>), <span class="number">50</span>, cv::<span class="built_in">Scalar</span>(<span class="number">255</span>, <span class="number">0</span>, <span class="number">0</span>)); <span class="comment">///颜色是B G R</span></span><br><span class="line"> <span class="comment">/// 第五个参数thickness默认 = 1</span></span><br><span class="line">cv::<span class="built_in">imwrite</span>(<span class="string">"CirclesImg0.jpg"</span>, img0);</span><br><span class="line"></span><br><span class="line"><span class="function">cv::Mat <span class="title">img1</span><span class="params">(<span class="number">400</span>, <span class="number">400</span>, CV_8UC3, cv::Scalar(<span class="number">150</span>, <span class="number">150</span>, <span class="number">150</span>))</span></span>;</span><br><span class="line"><span class="built_in">circle</span>(img1, cv::<span class="built_in">Point</span>(<span class="number">200</span>, <span class="number">200</span>), <span class="number">100</span>, cv::<span class="built_in">Scalar</span>(<span class="number">0</span>, <span class="number">255</span>, <span class="number">0</span>), <span class="number">3</span>);</span><br><span class="line">cv::<span class="built_in">imwrite</span>(<span class="string">"CirclesImg1.jpg"</span>, img1);</span><br><span class="line"></span><br><span class="line"><span class="function">cv::Mat <span class="title">img2</span><span class="params">(<span class="number">400</span>, <span class="number">400</span>, CV_8UC3, cv::Scalar(<span class="number">150</span>, <span class="number">150</span>, <span class="number">150</span>))</span></span>;</span><br><span class="line"><span class="built_in">circle</span>(img2, cv::<span class="built_in">Point</span>(<span class="number">200</span>, <span class="number">200</span>), <span class="number">150</span>, cv::<span class="built_in">Scalar</span>(<span class="number">0</span>, <span class="number">0</span>, <span class="number">255</span>), <span class="number">-1</span>);</span><br><span class="line"> <span class="comment">/// 第五个参数<0,代表内部全部填充</span></span><br><span class="line">cv::<span class="built_in">imwrite</span>(<span class="string">"CirclesImg2.jpg"</span>, img2);</span><br><span class="line"></span><br><span class="line">cv::<span class="built_in">waitKey</span>();</span><br><span class="line"><span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">}</span><br></pre></td></tr></table></figure><p><strong>绘制直线</strong></p><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">Lines</span><span class="params">()</span> </span>{</span><br><span class="line"><span class="keyword">const</span> <span class="keyword">char</span>* filename = <span class="string">"D:\\myTemp\\cv\\image\\test.jpg"</span>;</span><br><span class="line"></span><br><span class="line">cv::Mat mat = cv::<span class="built_in">imread</span>(filename);</span><br><span class="line"><span class="keyword">if</span> (mat.<span class="built_in">empty</span>()) {</span><br><span class="line"><span class="keyword">throw</span>(<span class="string">"Faild open file."</span>);</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="keyword">int</span> x0 = mat.cols / <span class="number">4</span>;</span><br><span class="line"><span class="keyword">int</span> x1 = mat.cols * <span class="number">3</span> / <span class="number">4</span>;</span><br><span class="line"><span class="keyword">int</span> y0 = mat.rows / <span class="number">4</span>;</span><br><span class="line"><span class="keyword">int</span> y1 = mat.rows * <span class="number">3</span> / <span class="number">4</span>;</span><br><span class="line"></span><br><span class="line">cv::Point p0 = cv::<span class="built_in">Point</span>(x0, y0);</span><br><span class="line">cv::Point p1 = cv::<span class="built_in">Point</span>(x1, y1);</span><br><span class="line">cv::<span class="built_in">line</span>(mat, p0, p1, cv::<span class="built_in">Scalar</span>(<span class="number">0</span>, <span class="number">0</span>, <span class="number">255</span>), <span class="number">3</span>, <span class="number">4</span>);</span><br><span class="line">p0.y = y1;</span><br><span class="line">p1.y = y0;</span><br><span class="line">cv::<span class="built_in">line</span>(mat, p0, p1, cv::<span class="built_in">Scalar</span>(<span class="number">255</span>, <span class="number">0</span>, <span class="number">0</span>), <span class="number">3</span>, <span class="number">4</span>);</span><br><span class="line"></span><br><span class="line">cv::<span class="built_in">imshow</span>(<span class="string">"mat"</span>, mat);</span><br><span class="line">cv::<span class="built_in">waitKey</span>();</span><br><span class="line"><span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">}</span><br></pre></td></tr></table></figure><p><strong>添加文字</strong></p><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">DrawText</span><span class="params">()</span> </span>{</span><br><span class="line"><span class="keyword">const</span> <span class="keyword">char</span>* filename = <span class="string">"D:\\myTemp\\cv\\image\\test.jpg"</span>;</span><br><span class="line"></span><br><span class="line">cv::Mat mat = cv::<span class="built_in">imread</span>(filename);</span><br><span class="line"><span class="keyword">if</span> (mat.<span class="built_in">empty</span>()) {</span><br><span class="line"><span class="keyword">throw</span>(<span class="string">"Faild open file."</span>);</span><br><span class="line">}</span><br><span class="line">cv::Point p = cv::<span class="built_in">Point</span>(<span class="number">50</span>, mat.rows / <span class="number">2</span> - <span class="number">50</span>);</span><br><span class="line">cv::<span class="built_in">putText</span>(mat, <span class="string">"Hello OpenCV"</span>, p, cv::FONT_HERSHEY_TRIPLEX, <span class="number">1.5</span>, cv::<span class="built_in">Scalar</span>(<span class="number">255</span>, <span class="number">200</span>, <span class="number">200</span>), <span class="number">2</span>);</span><br><span class="line"> <span class="comment">//1.5是缩放比例 p是文字放置点 2是bool值,是否左对齐</span></span><br><span class="line"></span><br><span class="line">cv::<span class="built_in">imshow</span>(<span class="string">"mat"</span>, mat);</span><br><span class="line">cv::<span class="built_in">waitKey</span>();</span><br><span class="line"><span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">}</span><br></pre></td></tr></table></figure><h2 id="简单图像处理"><a href="#简单图像处理" class="headerlink" title="简单图像处理"></a>简单图像处理</h2><h3 id="矩阵遍历"><a href="#矩阵遍历" class="headerlink" title="矩阵遍历"></a>矩阵遍历</h3><p><strong>取出R G B 各个通道</strong></p><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">vector<Mat> channel_mats;</span><br><span class="line"><span class="built_in">split</span>(mmat, channel_mats);</span><br><span class="line"><span class="built_in">imshow</span>(<span class="string">"mat"</span>, channel_mats[<span class="number">0</span>]); <span class="comment">//B通道</span></span><br></pre></td></tr></table></figure><h3 id="快速翻转"><a href="#快速翻转" class="headerlink" title="快速翻转"></a>快速翻转</h3><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">Flip</span><span class="params">()</span> </span>{</span><br><span class="line"><span class="keyword">const</span> <span class="keyword">char</span>* filename = <span class="string">"D:\\myTemp\\cv\\image\\test.jpg"</span>;</span><br><span class="line"></span><br><span class="line">cv::Mat src = cv::<span class="built_in">imread</span>(filename, IMREAD_GRAYSCALE);</span><br><span class="line"><span class="keyword">int</span> flipCode = <span class="number">-1</span>; <span class="comment">// >0: 沿y-轴翻转, 0: 沿x-轴翻转, <0: x、y轴同时翻转</span></span><br><span class="line"><span class="keyword">if</span> (src.<span class="built_in">empty</span>()) {</span><br><span class="line"><span class="keyword">throw</span>(<span class="string">"Faild open file."</span>);</span><br><span class="line">}</span><br><span class="line">cv::Mat dst;</span><br><span class="line">cv::<span class="built_in">flip</span>(src, dst, flipCode);</span><br><span class="line"></span><br><span class="line">cv::<span class="built_in">imshow</span>(<span class="string">"src"</span>, src);</span><br><span class="line">cv::<span class="built_in">imshow</span>(<span class="string">"dst"</span>, dst);</span><br><span class="line">cv::<span class="built_in">waitKey</span>();</span><br><span class="line"><span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">}</span><br></pre></td></tr></table></figure><h3 id="resize"><a href="#resize" class="headerlink" title="resize"></a>resize</h3><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">Resize</span><span class="params">()</span> </span>{</span><br><span class="line"><span class="keyword">const</span> <span class="keyword">char</span>* filename = <span class="string">"D:\\myTemp\\cv\\image\\test.jpg"</span>;</span><br><span class="line"></span><br><span class="line">cv::Mat src, dst;</span><br><span class="line"><span class="keyword">float</span> scaleW = <span class="number">0.8</span>;</span><br><span class="line"><span class="keyword">float</span> scaleH = scaleW;</span><br><span class="line"></span><br><span class="line">src = cv::<span class="built_in">imread</span>(filename);</span><br><span class="line"><span class="keyword">if</span> (src.<span class="built_in">empty</span>()) {</span><br><span class="line"><span class="keyword">throw</span>(<span class="string">"Faild open file."</span>);</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="keyword">int</span> width = <span class="keyword">static_cast</span><<span class="keyword">float</span>>(src.cols*scaleW); <span class="comment">//强制转换 float转int</span></span><br><span class="line"><span class="keyword">int</span> height = <span class="keyword">static_cast</span><<span class="keyword">float</span>>(src.rows*scaleH);</span><br><span class="line"><span class="built_in">resize</span>(src, dst, cv::<span class="built_in">Size</span>(width, height));</span><br><span class="line"></span><br><span class="line">cv::<span class="built_in">imshow</span>(<span class="string">"src"</span>, src);</span><br><span class="line">cv::<span class="built_in">imshow</span>(<span class="string">"dst"</span>, dst);</span><br><span class="line">cv::<span class="built_in">waitKey</span>();</span><br><span class="line"><span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">}</span><br></pre></td></tr></table></figure><h3 id="仿射变换"><a href="#仿射变换" class="headerlink" title="仿射变换"></a>仿射变换</h3><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">Rotate</span><span class="params">()</span> </span>{</span><br><span class="line">cv::Mat src, dst;</span><br><span class="line"></span><br><span class="line"><span class="keyword">float</span> angle = <span class="number">90</span>;</span><br><span class="line"><span class="keyword">const</span> <span class="keyword">char</span>* filename = <span class="string">"D:\\myTemp\\cv\\image\\test.jpg"</span>;</span><br><span class="line"></span><br><span class="line">src = cv::<span class="built_in">imread</span>(filename);</span><br><span class="line"><span class="keyword">if</span> (src.<span class="built_in">empty</span>()) {</span><br><span class="line"><span class="keyword">throw</span>(<span class="string">"Faild open file."</span>);</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line">cv::Point2f center = cv::<span class="built_in">Point2f</span>(<span class="keyword">static_cast</span><<span class="keyword">float</span>>(src.cols / <span class="number">2</span>),</span><br><span class="line"><span class="keyword">static_cast</span><<span class="keyword">float</span>>(src.rows / <span class="number">2</span>)); <span class="comment">// 设置旋转中心</span></span><br><span class="line">cv::Mat affineTrans = <span class="built_in">getRotationMatrix2D</span>(center, angle, <span class="number">0.5</span>);</span><br><span class="line"></span><br><span class="line">cv::<span class="built_in">warpAffine</span>(src, dst, affineTrans, src.<span class="built_in">size</span>(), cv::INTER_CUBIC, cv::BORDER_REPLICATE);</span><br><span class="line"></span><br><span class="line">cv::<span class="built_in">imshow</span>(<span class="string">"src"</span>, src);</span><br><span class="line">cv::<span class="built_in">imshow</span>(<span class="string">"dst"</span>, dst);</span><br><span class="line">cv::<span class="built_in">waitKey</span>();</span><br><span class="line">}</span><br></pre></td></tr></table></figure><div class="table-container"><table><thead><tr><th>INTER_NEAREST</th><th style="text-align:center">最临近插值算法</th></tr></thead><tbody><tr><td>INTER_LINEAR</td><td style="text-align:center">线性插值算法</td></tr><tr><td>INTER_CUBIC</td><td style="text-align:center">双立方插值算法</td></tr><tr><td>INTER_AREA</td><td style="text-align:center">区域插值算法(使用像素区域关系的重采样,时图像抽取的首选方法,但是当图像被放大,它类似于INTER_NEAREST方法)</td></tr><tr><td>INTER_LANCZOS4</td><td style="text-align:center">Lanczos插值(超过8x8邻域的插值算法)</td></tr><tr><td>INTER_MAX</td><td style="text-align:center">用于插值的掩模板</td></tr><tr><td>WARP_FILL_OUTLIERS</td><td style="text-align:center">标志位,用于填充目标图像的像素值,如果其中的一些值对应于原图像中的异常值,那么这些值将被设置为0</td></tr><tr><td>WARP_INVERSE_MAP</td><td style="text-align:center">标志位,反变换</td></tr></tbody></table></div><p> borderMode: 边界像素模式,有默认值BORDER_CONSTANT<br>. borderValue: 边界取值,有默认值Scalar()即0</p><p><strong>这段代码效果:图片缓缓旋转一周</strong></p><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">RotateCotinue</span><span class="params">()</span> </span>{</span><br><span class="line">cv::Mat src, dst;</span><br><span class="line"><span class="keyword">const</span> <span class="keyword">char</span>* filename = <span class="string">"D:\\myTemp\\cv\\image\\test.jpg"</span>;</span><br><span class="line">cv::<span class="built_in">imread</span>(filename).<span class="built_in">copyTo</span>(src);</span><br><span class="line"><span class="keyword">if</span> (src.<span class="built_in">empty</span>()) {</span><br><span class="line"><span class="keyword">throw</span>(<span class="string">"Faild open file."</span>);</span><br><span class="line">}</span><br><span class="line">cv::Point2f center = cv::<span class="built_in">Point2f</span>(<span class="keyword">static_cast</span><<span class="keyword">float</span>>(src.cols / <span class="number">2</span>),</span><br><span class="line"><span class="keyword">static_cast</span><<span class="keyword">float</span>>(src.rows / <span class="number">2</span>));</span><br><span class="line">cv::<span class="built_in">imshow</span>(<span class="string">"src"</span>, src);</span><br><span class="line">cv::<span class="built_in">namedWindow</span>(<span class="string">"dst"</span>, cv::WINDOW_AUTOSIZE);</span><br><span class="line"><span class="keyword">for</span> (<span class="keyword">float</span> angle = <span class="number">0.0</span>; angle < <span class="number">360.0</span>; angle++) {</span><br><span class="line">cv::Mat affineTrans = <span class="built_in">getRotationMatrix2D</span>(center, angle, <span class="number">1.0</span>);</span><br><span class="line">cv::<span class="built_in">warpAffine</span>(src, dst, affineTrans, src.<span class="built_in">size</span>(), cv::INTER_CUBIC);</span><br><span class="line">cv::<span class="built_in">imshow</span>(<span class="string">"dst"</span>, dst);</span><br><span class="line"><span class="keyword">if</span> (cv::<span class="built_in">waitKey</span>(<span class="number">1</span>) >= <span class="number">0</span>)</span><br><span class="line"><span class="keyword">break</span>;</span><br><span class="line">}</span><br><span class="line"><span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">}</span><br></pre></td></tr></table></figure><h3 id="视角设置"><a href="#视角设置" class="headerlink" title="视角设置"></a>视角设置</h3><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">Perspective</span><span class="params">()</span> </span>{</span><br><span class="line">cv::Mat src, dst;</span><br><span class="line">cv::Point2f dstPoint[<span class="number">4</span>];</span><br><span class="line"><span class="keyword">int</span> xMergin, yMergin;</span><br><span class="line"></span><br><span class="line"><span class="keyword">int</span> pattern = <span class="number">2</span>;<span class="comment">//0,1,2</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">const</span> <span class="keyword">char</span>* filename = <span class="string">"D:\\myTemp\\cv\\image\\test.jpg"</span>;</span><br><span class="line"></span><br><span class="line">cv::<span class="built_in">imread</span>(filename).<span class="built_in">copyTo</span>(src);</span><br><span class="line"><span class="keyword">if</span> (src.<span class="built_in">empty</span>()) {</span><br><span class="line"><span class="keyword">throw</span>(<span class="string">"Faild open file."</span>);</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="keyword">int</span> x0 = src.cols / <span class="number">4</span>;</span><br><span class="line"><span class="keyword">int</span> x1 = (src.cols / <span class="number">4</span>) / <span class="number">3</span>;</span><br><span class="line"><span class="keyword">int</span> y0 = src.rows / <span class="number">4</span>;</span><br><span class="line"><span class="keyword">int</span> y1 = (src.rows / <span class="number">4</span>) / <span class="number">3</span>;</span><br><span class="line">cv::Point2f srcPoint[<span class="number">4</span>] = {</span><br><span class="line">cv::<span class="built_in">Point</span>(x0,y0),</span><br><span class="line">cv::<span class="built_in">Point</span>(x0,y1),</span><br><span class="line">cv::<span class="built_in">Point</span>(x1,y1),</span><br><span class="line">cv::<span class="built_in">Point</span>(x1,y0),</span><br><span class="line">};</span><br><span class="line"></span><br><span class="line"><span class="built_in"><span class="keyword">switch</span></span> (pattern) {</span><br><span class="line"><span class="keyword">case</span> <span class="number">0</span>:</span><br><span class="line">xMergin = src.cols / <span class="number">10</span>;</span><br><span class="line">yMergin = src.rows / <span class="number">10</span>;</span><br><span class="line">dstPoint[<span class="number">0</span>] = cv::<span class="built_in">Point</span>(x0 + xMergin, y0 + yMergin);</span><br><span class="line">dstPoint[<span class="number">1</span>] = srcPoint[<span class="number">1</span>];</span><br><span class="line">dstPoint[<span class="number">2</span>] = srcPoint[<span class="number">2</span>];</span><br><span class="line">dstPoint[<span class="number">3</span>] = cv::<span class="built_in">Point</span>(x1 - xMergin, y0 + yMergin);</span><br><span class="line"><span class="keyword">break</span>;</span><br><span class="line"></span><br><span class="line"><span class="keyword">case</span> <span class="number">1</span>:</span><br><span class="line">xMergin = src.cols / <span class="number">8</span>;</span><br><span class="line">yMergin = src.rows / <span class="number">8</span>;</span><br><span class="line">dstPoint[<span class="number">0</span>] = srcPoint[<span class="number">0</span>];</span><br><span class="line">dstPoint[<span class="number">1</span>] = srcPoint[<span class="number">1</span>];</span><br><span class="line">dstPoint[<span class="number">2</span>] = cv::<span class="built_in">Point</span>(x1 - xMergin, y1 - yMergin);</span><br><span class="line">dstPoint[<span class="number">3</span>] = cv::<span class="built_in">Point</span>(x1 - xMergin, y0 + yMergin);</span><br><span class="line"><span class="keyword">break</span>;</span><br><span class="line"></span><br><span class="line"><span class="keyword">case</span> <span class="number">2</span>:</span><br><span class="line">xMergin = src.cols / <span class="number">6</span>;</span><br><span class="line">yMergin = src.rows / <span class="number">6</span>;</span><br><span class="line">dstPoint[<span class="number">0</span>] = cv::<span class="built_in">Point</span>(x0 + xMergin, y0 + yMergin);</span><br><span class="line">dstPoint[<span class="number">1</span>] = srcPoint[<span class="number">1</span>];</span><br><span class="line">dstPoint[<span class="number">2</span>] = cv::<span class="built_in">Point</span>(x1 - xMergin, y1 - yMergin);</span><br><span class="line">dstPoint[<span class="number">3</span>] = srcPoint[<span class="number">3</span>];</span><br><span class="line"><span class="keyword">break</span>;</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line">cv::Mat perspectiveMmat = cv::<span class="built_in">getPerspectiveTransform</span>(srcPoint, dstPoint);</span><br><span class="line">cv::<span class="built_in">warpPerspective</span>(src, dst, perspectiveMmat, src.<span class="built_in">size</span>(), cv::INTER_CUBIC);</span><br><span class="line"></span><br><span class="line">cv::<span class="built_in">imshow</span>(<span class="string">"src"</span>, src);</span><br><span class="line">cv::<span class="built_in">imshow</span>(<span class="string">"dst"</span>, dst);</span><br><span class="line">cv::<span class="built_in">waitKey</span>();</span><br><span class="line">}</span><br></pre></td></tr></table></figure><h3 id="颜色通道变化"><a href="#颜色通道变化" class="headerlink" title="颜色通道变化"></a>颜色通道变化</h3><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">cv::<span class="built_in">cvtColor</span>(src, dst, cv::COLOR_RGB2GRAY); <span class="comment">//RGB三通道图片转为灰度图</span></span><br><span class="line"><span class="built_in">cvtColor</span>(image,imagehsi, CV_BGR2HSV); </span><br></pre></td></tr></table></figure><h3 id="均衡化"><a href="#均衡化" class="headerlink" title="均衡化"></a>均衡化</h3><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">cv::<span class="built_in">imread</span>(filename).<span class="built_in">copyTo</span>(src);</span><br><span class="line"><span class="built_in">cvtColor</span>(src, src, COLOR_RGB2GRAY); <span class="comment">//切记均衡化务必是单通道</span></span><br><span class="line"><span class="built_in">equalizeHist</span>(src, dst);</span><br></pre></td></tr></table></figure><h3 id="图像二值化"><a href="#图像二值化" class="headerlink" title="图像二值化"></a>图像二值化</h3><p>threshold</p><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">Threshold</span><span class="params">()</span> </span>{</span><br><span class="line"> cv::Mat src, dst;</span><br><span class="line"> <span class="keyword">double</span> thresh = <span class="number">60.0</span>, maxval = <span class="number">180.0</span>;</span><br><span class="line"> <span class="keyword">int</span> type = cv::THRESH_BINARY;</span><br><span class="line"></span><br><span class="line"> <span class="keyword">const</span> <span class="keyword">char</span>* filename = <span class="string">"D:\\myTemp\\cv\\image\\test.jpg"</span>;</span><br><span class="line"></span><br><span class="line"> cv::<span class="built_in">imread</span>(filename).<span class="built_in">copyTo</span>(src);</span><br><span class="line"> <span class="keyword">if</span> (src.<span class="built_in">empty</span>()) {</span><br><span class="line"> <span class="keyword">throw</span>(<span class="string">"Faild open file."</span>);</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> cv::<span class="built_in">equalizeHist</span>(src,dst);</span><br><span class="line"> thresh = <span class="number">80.0</span>;</span><br><span class="line"> maxval = <span class="number">210.0</span>;</span><br><span class="line"> <span class="keyword">int</span> number = <span class="number">0</span>;<span class="comment">//0,1,2,3,4</span></span><br><span class="line"></span><br><span class="line"> <span class="built_in"><span class="keyword">switch</span></span> (number) {</span><br><span class="line"> <span class="keyword">case</span> <span class="number">0</span>:type = cv::THRESH_BINARY; <span class="keyword">break</span>;</span><br><span class="line"> <span class="keyword">case</span> <span class="number">1</span>:type = cv::THRESH_BINARY_INV; <span class="keyword">break</span>;</span><br><span class="line"> <span class="keyword">case</span> <span class="number">2</span>:type = cv::THRESH_TRUNC; <span class="keyword">break</span>;</span><br><span class="line"> <span class="keyword">case</span> <span class="number">3</span>:type = cv::THRESH_TOZERO; <span class="keyword">break</span>;</span><br><span class="line"> <span class="keyword">case</span> <span class="number">4</span>:type = cv::THRESH_TOZERO_INV; <span class="keyword">break</span>;</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> cv::<span class="built_in">threshold</span>(src,dst,thresh,maxval,type);</span><br><span class="line"> <span class="comment">//图像阈值化处理</span></span><br><span class="line"> <span class="comment">//第一个参数为原图像</span></span><br><span class="line"> <span class="comment">//第二个参数为处理后的输出图像</span></span><br><span class="line"> <span class="comment">//第三个参数为阈值</span></span><br><span class="line"> <span class="comment">//第四个参数maxval是当灰度值大于(或小于)阈值时将该灰度值赋成的值</span></span><br><span class="line"> <span class="comment">//第五个参数为阈值化的状态</span></span><br><span class="line">}</span><br></pre></td></tr></table></figure><h2 id="图像滤波"><a href="#图像滤波" class="headerlink" title="图像滤波"></a>图像滤波</h2><p><a href="https://blog.csdn.net/poem_qianmo/article/details/22745559">【OpenCV入门教程之八】线性邻域滤波专场:方框滤波、均值滤波与高斯滤波_【浅墨的游戏编程Blog】毛星云(浅墨)的专栏-CSDN博客_均值滤波与方框滤波</a></p><ul><li>方框滤波——boxblur函数</li><li>均值滤波(邻域平均滤波)——blur函数</li><li>高斯滤波——GaussianBlur函数</li><li>中值滤波——medianBlur函数</li><li>双边滤波——bilateralFilter函数</li></ul><h3 id="均值滤波"><a href="#均值滤波" class="headerlink" title="均值滤波"></a>均值滤波</h3><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">Blur</span><span class="params">()</span> </span>{</span><br><span class="line">cv::Mat src, dst;</span><br><span class="line"><span class="keyword">const</span> <span class="keyword">char</span>* filename = <span class="string">"D:\\myTemp\\cv\\image\\test.jpg"</span>;</span><br><span class="line"></span><br><span class="line">cv::<span class="built_in">imread</span>(filename).<span class="built_in">copyTo</span>(src);</span><br><span class="line"><span class="keyword">if</span> (src.<span class="built_in">empty</span>()) {</span><br><span class="line"><span class="keyword">throw</span>(<span class="string">"Faild open file."</span>);</span><br><span class="line">}</span><br><span class="line"> </span><br><span class="line"> <span class="comment">//主要代码</span></span><br><span class="line"><span class="keyword">int</span> ksize = <span class="number">3</span>;</span><br><span class="line"><span class="built_in">blur</span>(src, dst, cv::<span class="built_in">Size</span>(ksize, ksize));</span><br><span class="line"> <span class="comment">/// Size是卷积核大小,越大越模糊</span></span><br><span class="line"></span><br><span class="line">cv::<span class="built_in">imshow</span>(<span class="string">"src"</span>, src);</span><br><span class="line">cv::<span class="built_in">imshow</span>(<span class="string">"dst"</span>, dst);</span><br><span class="line">cv::<span class="built_in">waitKey</span>();</span><br><span class="line"><span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">}</span><br></pre></td></tr></table></figure><h3 id="高斯滤波"><a href="#高斯滤波" class="headerlink" title="高斯滤波"></a>高斯滤波</h3><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">GaussianBlur</span><span class="params">()</span> </span>{</span><br><span class="line">cv::Mat src, dst;</span><br><span class="line"><span class="keyword">const</span> <span class="keyword">char</span>* filename = <span class="string">"D:\\myTemp\\cv\\image\\test.jpg"</span>;</span><br><span class="line"></span><br><span class="line">cv::<span class="built_in">imread</span>(filename).<span class="built_in">copyTo</span>(src);</span><br><span class="line"><span class="keyword">if</span> (src.<span class="built_in">empty</span>()) {</span><br><span class="line"><span class="keyword">throw</span>(<span class="string">"Faild open file."</span>);</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="keyword">int</span> ksize1 = <span class="number">11</span>;</span><br><span class="line"><span class="keyword">int</span> ksize2 = <span class="number">11</span>;</span><br><span class="line"><span class="keyword">double</span> sigma1 = <span class="number">10.0</span>; <span class="comment">//表示高斯核函数在X方向的的标准偏差</span></span><br><span class="line"><span class="keyword">double</span> sigma2 = <span class="number">20.0</span>; <span class="comment">//表示高斯核函数在Y方向的的标准偏差。若sigmaY为零,就将它设为sigmaX,如果sigmaX和sigmaY都是0,那么就由ksize.width和ksize.height计算出来。</span></span><br><span class="line">cv::<span class="built_in">GaussianBlur</span>(src, dst, cv::<span class="built_in">Size</span>(ksize1, ksize2), sigma1, sigma2);</span><br><span class="line"></span><br><span class="line">cv::<span class="built_in">imshow</span>(<span class="string">"src"</span>, src);</span><br><span class="line">cv::<span class="built_in">imshow</span>(<span class="string">"dst"</span>, dst);</span><br><span class="line">cv::<span class="built_in">waitKey</span>();</span><br><span class="line"></span><br><span class="line"><span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">}</span><br></pre></td></tr></table></figure><h2 id="卷积算子"><a href="#卷积算子" class="headerlink" title="卷积算子"></a>卷积算子</h2><p>以下laplacian、sobel、canny算子常用于边缘检测</p><p><strong>Laplacian</strong></p><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">Laplacian</span><span class="params">()</span> </span>{</span><br><span class="line">cv::Mat src, dst;</span><br><span class="line"><span class="keyword">const</span> <span class="keyword">char</span>* filename = <span class="string">"D:\\myTemp\\cv\\image\\test.jpg"</span>;</span><br><span class="line"></span><br><span class="line">cv::<span class="built_in">imread</span>(filename).<span class="built_in">copyTo</span>(src);</span><br><span class="line"><span class="keyword">if</span> (src.<span class="built_in">empty</span>()) {</span><br><span class="line"><span class="keyword">throw</span>(<span class="string">"Faild open file."</span>);</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="built_in">Laplacian</span>(src, dst, <span class="number">0</span>);</span><br><span class="line"></span><br><span class="line">cv::<span class="built_in">imshow</span>(<span class="string">"src"</span>, src);</span><br><span class="line">cv::<span class="built_in">imshow</span>(<span class="string">"dst"</span>, dst);</span><br><span class="line"><span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">}</span><br></pre></td></tr></table></figure><p><strong>sobel算子</strong></p><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">Sobel</span><span class="params">()</span> </span>{</span><br><span class="line">cv::Mat src, dst;</span><br><span class="line"><span class="keyword">const</span> <span class="keyword">char</span>* filename = <span class="string">"D:\\myTemp\\cv\\image\\test.jpg"</span>;</span><br><span class="line"></span><br><span class="line">cv::<span class="built_in">imread</span>(filename).<span class="built_in">copyTo</span>(src);</span><br><span class="line"><span class="keyword">if</span> (src.<span class="built_in">empty</span>()) {</span><br><span class="line"><span class="keyword">throw</span>(<span class="string">"Faild open file."</span>);</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="built_in">Sobel</span>(src, dst, <span class="number">-1</span>, <span class="number">0</span>, <span class="number">1</span>);</span><br><span class="line"></span><br><span class="line">cv::<span class="built_in">imshow</span>(<span class="string">"src"</span>, src);</span><br><span class="line">cv::<span class="built_in">imshow</span>(<span class="string">"sobel"</span>, dst);</span><br><span class="line"></span><br><span class="line"><span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">}</span><br></pre></td></tr></table></figure><p><strong>canny算子</strong></p><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">Canny</span><span class="params">()</span> </span>{</span><br><span class="line">cv::Mat src, dst;</span><br><span class="line"><span class="keyword">const</span> <span class="keyword">char</span>* filename = <span class="string">"D:\\myTemp\\cv\\image\\test.jpg"</span>;</span><br><span class="line"></span><br><span class="line">cv::<span class="built_in">imread</span>(filename).<span class="built_in">copyTo</span>(src);</span><br><span class="line"><span class="keyword">if</span> (src.<span class="built_in">empty</span>()) {</span><br><span class="line"><span class="keyword">throw</span>(<span class="string">"Faild open file."</span>);</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="keyword">double</span> threshold1 = <span class="number">40.0</span>;</span><br><span class="line"><span class="keyword">double</span> threshold2 = <span class="number">200.0</span>;</span><br><span class="line"></span><br><span class="line"><span class="built_in">Canny</span>(src, dst, threshold1, threshold2);</span><br><span class="line"></span><br><span class="line">cv::<span class="built_in">imshow</span>(<span class="string">"src"</span>, src);</span><br><span class="line">cv::<span class="built_in">imshow</span>(<span class="string">"canny"</span>, dst);</span><br><span class="line"></span><br><span class="line"><span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">}</span><br></pre></td></tr></table></figure><h2 id="特征提取"><a href="#特征提取" class="headerlink" title="特征提取"></a>特征提取</h2><h3 id="角点检测"><a href="#角点检测" class="headerlink" title="角点检测"></a>角点检测</h3><p><strong>goodFeaturesToTrack函数</strong></p><p>可以计算Harris角点和shi-tomasi角点,但默认情况下计算的是shi-tomasi角点</p><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">DetectConers</span><span class="params">()</span> </span>{</span><br><span class="line">cv::Mat src, gray, dst;</span><br><span class="line"><span class="keyword">const</span> <span class="keyword">int</span> maxCorners = <span class="number">50</span>, blockSize = <span class="number">3</span>;</span><br><span class="line"><span class="keyword">const</span> <span class="keyword">double</span> qualityLevel = <span class="number">0.01</span>, minDistance = <span class="number">20.0</span>, k = <span class="number">0.04</span>;</span><br><span class="line"><span class="keyword">const</span> <span class="keyword">bool</span> useHarrisDetector = <span class="literal">false</span>;</span><br><span class="line">std::vector< cv::Point2f > corners;</span><br><span class="line"></span><br><span class="line"><span class="keyword">const</span> <span class="keyword">char</span>* filename = <span class="string">"D:\\myTemp\\cv\\image\\demo.jpg"</span>;</span><br><span class="line"></span><br><span class="line">cv::<span class="built_in">imread</span>(filename).<span class="built_in">copyTo</span>(src);</span><br><span class="line"><span class="keyword">if</span> (src.<span class="built_in">empty</span>()) {</span><br><span class="line"><span class="keyword">throw</span>(<span class="string">"Faild open file."</span>);</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line">dst = src.<span class="built_in">clone</span>();</span><br><span class="line"><span class="comment">//角点检测必须用灰度图</span></span><br><span class="line"><span class="built_in">cvtColor</span>(src, gray, cv::COLOR_RGB2GRAY);</span><br><span class="line"><span class="comment">//这个函数用于角点检测</span></span><br><span class="line"><span class="comment">//maxCorners角点数目最大值,如果实际检测的角点超过此值,则只返回前maxCorners个强角点</span></span><br><span class="line"><span class="comment">//qualityLevel:角点的品质因子</span></span><br><span class="line"><span class="comment">//minDistance:对于初选出的角点而言,如果在其周围minDistance范围内存在其他更强角点,则将此角点删除</span></span><br><span class="line"><span class="comment">//cv::Mat():这里是mask,用于提取ROI,这里不需要mask,就用Mat()这样的方式占位</span></span><br><span class="line"><span class="comment">//blockSize:计算协方差矩阵时的窗口大小</span></span><br><span class="line"><span class="comment">//useHarrisDetector:指示是否使用Harris角点检测,如不指定,则计算shi-tomasi角点</span></span><br><span class="line"><span class="comment">//harrisK:Harris角点检测需要的k值</span></span><br><span class="line"></span><br><span class="line"><span class="built_in">goodFeaturesToTrack</span>(gray, corners, maxCorners, qualityLevel,</span><br><span class="line">minDistance, cv::<span class="built_in">Mat</span>(), blockSize, useHarrisDetector, k);</span><br><span class="line"><span class="comment">//绘制角点</span></span><br><span class="line"><span class="keyword">for</span> (<span class="keyword">size_t</span> i = <span class="number">0</span>; i < corners.<span class="built_in">size</span>(); i++) {</span><br><span class="line"><span class="built_in">circle</span>(dst, corners[i], <span class="number">8</span>, cv::<span class="built_in">Scalar</span>(<span class="number">255</span>, <span class="number">255</span>, <span class="number">0</span>), <span class="number">2</span>);</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line">cv::<span class="built_in">imshow</span>(<span class="string">"src"</span>, src);</span><br><span class="line">cv::<span class="built_in">imshow</span>(<span class="string">"dst"</span>, dst);</span><br><span class="line"></span><br><span class="line"><span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">}</span><br></pre></td></tr></table></figure><p>==可以学习Harris和shi-tomasi角点检测方法==</p><p><a href="https://blog.csdn.net/lwzkiller/article/details/54633670">Harris角点检测原理详解_lwzkiller的专栏-CSDN博客_harris角点检测</a></p><h2 id="图像形态学处理"><a href="#图像形态学处理" class="headerlink" title="图像形态学处理"></a>图像形态学处理</h2><p>形态学,即数学形态学(mathematical Morphology),是图像处理中应用最为广泛的技术之一,主要用于从图像中提取对表达和描绘区域形状有意义的图像分量,使后续的识别工作能够抓住目标对象最为本质〈最具区分能力-most discriminative)的形状特征,如边界和连通区域等。同时像细化、像素化和修剪毛刺等技术也常应用于图像的预处理和后处理中,成为图像增强技术的有力补充。</p><ul><li><strong>二值图像</strong>的基本形态学运算, 包括腐蚀、膨胀、开和闭。</li><li>二值形态学的经典应用, 包括击中击不中变换、边界提取和跟踪、区域填充、提取连通分量、细化和像素化, 以及凸壳</li><li>灰度图像的形态学运算, 包括灰度腐蚀、灰度膨胀、灰度开和灰度闭</li></ul><p>所有形态学运算都是针对图像中的前景物体进行的, 因而首先对图像前景和背景的认定给出必要的说明.</p><p>大多数图像,一般相对于背景而言物体的颜色(灰度)更深, 二值化之后物体会成为黑色, 而背景则成为白色, 因此我们通常是习惯于将物体用黑色(灰度值0)表示, 而背景用白色(灰度值255)表示。 如果有例外,可以先反色处理。</p><p>参考了:<a href="https://blog.csdn.net/whuhan2013/article/details/53956606">形态学图像处理_Ricardo的博客-CSDN博客_形态学处理</a></p><p><a href="https://zhuanlan.zhihu.com/p/110787009">图像处理中常见的形态学方法 - 知乎 (zhihu.com)</a></p><h3 id="腐蚀与膨胀"><a href="#腐蚀与膨胀" class="headerlink" title="腐蚀与膨胀"></a>腐蚀与膨胀</h3><p><a href="https://blog.csdn.net/alw_123/article/details/83868878">数字图像处理—-通俗理解腐蚀与膨胀_alw_123的博客-CSDN博客_图像腐蚀和膨胀的作用</a></p><p>形象来看:膨胀更白,腐蚀更黑</p><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">Image_threshold</span><span class="params">(<span class="keyword">const</span> Mat inputMat, Mat &outsingleMat)</span> </span>{</span><br><span class="line">Mat dst;</span><br><span class="line"><span class="built_in">cvtColor</span>(inputMat, dst, COLOR_RGB2GRAY);</span><br><span class="line"><span class="built_in">imshow</span>(<span class="string">"cvtcolor"</span>,dst);</span><br><span class="line"><span class="built_in">threshold</span>(dst, outsingleMat,<span class="number">80</span>,<span class="number">255</span>, cv::THRESH_BINARY);</span><br><span class="line"><span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="comment">//传入的必须是单通道矩阵</span></span><br><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">Dilate</span><span class="params">(Mat &singleMat,Mat &outputArray)</span> </span>{</span><br><span class="line"><span class="comment">//dilate(src, dst, cv::Mat());</span></span><br><span class="line"><span class="comment">//第三个参数代表膨胀或腐蚀的核,上面这个就是默认情况:3*3方形核</span></span><br><span class="line"><span class="built_in">dilate</span>(singleMat, outputArray, <span class="built_in">getStructuringElement</span>(MORPH_RECT, <span class="built_in">Size</span>(<span class="number">3</span>,<span class="number">3</span>)));</span><br><span class="line"><span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">}</span><br><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">Erode</span><span class="params">(Mat &singleMat, Mat &outputArray)</span> </span>{</span><br><span class="line"><span class="built_in">erode</span>(singleMat, outputArray, <span class="built_in">getStructuringElement</span>(MORPH_RECT, <span class="built_in">Size</span>(<span class="number">3</span>, <span class="number">3</span>)));</span><br><span class="line"><span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">}</span><br><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">main</span><span class="params">()</span> </span>{</span><br><span class="line">Mat mmat, inputMat, outsingleMat;</span><br><span class="line"><span class="keyword">const</span> <span class="keyword">char</span> * filename = <span class="string">"D:\\myTemp\\cv\\image\\DSCF1062.jpg"</span>;</span><br><span class="line"> <span class="comment">//首先读取彩色图片</span></span><br><span class="line">mmat = <span class="built_in">imread</span>(filename,IMREAD_COLOR);</span><br><span class="line"> <span class="comment">//彩色图片首先变为灰度图,再变为二值图</span></span><br><span class="line"><span class="built_in">Image_threshold</span>(mmat, outsingleMat);</span><br><span class="line"><span class="comment">//先腐蚀变黑</span></span><br><span class="line"><span class="built_in">Erode</span>(outsingleMat, outsingleMat);</span><br><span class="line"><span class="built_in">imwrite</span>(<span class="string">"erode.jpg"</span>, outsingleMat);</span><br><span class="line"></span><br><span class="line"><span class="comment">//再膨胀</span></span><br><span class="line"> <span class="built_in">Dilate</span>(outsingleMat, outsingleMat);</span><br><span class="line"><span class="built_in">imwrite</span>(<span class="string">"dilate.jpg"</span>, outsingleMat);</span><br><span class="line"></span><br><span class="line"><span class="comment">//利用蒙版扣原图</span></span><br><span class="line"> <span class="function">Mat <span class="title">dst</span><span class="params">(mmat.rows, mmat.cols,CV_8UC3)</span></span>;</span><br><span class="line">mmat.<span class="built_in">copyTo</span>(dst, outsingleMat);</span><br><span class="line"><span class="built_in">imwrite</span>(<span class="string">"erode_dilateS.jpg"</span>, dst);</span><br><span class="line"></span><br><span class="line"><span class="built_in">waitKey</span>();</span><br><span class="line">}</span><br></pre></td></tr></table></figure><h2 id="视频处理"><a href="#视频处理" class="headerlink" title="视频处理"></a>视频处理</h2><h3 id="摄像头数据获取"><a href="#摄像头数据获取" class="headerlink" title="摄像头数据获取"></a>摄像头数据获取</h3><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">DispBasic</span><span class="params">()</span> </span>{</span><br><span class="line"><span class="function">cv::VideoCapture <span class="title">capture</span><span class="params">(<span class="number">0</span>)</span></span>;</span><br><span class="line"></span><br><span class="line"><span class="keyword">int</span> width = <span class="keyword">static_cast</span><<span class="keyword">int</span>>(capture.<span class="built_in">get</span>(CAP_PROP_FRAME_WIDTH));<span class="comment">//视频流中帧宽度</span></span><br><span class="line"><span class="keyword">int</span> height = <span class="keyword">static_cast</span><<span class="keyword">int</span>>(capture.<span class="built_in">get</span>(CAP_PROP_FRAME_WIDTH));<span class="comment">//其他视频流有关的enum可查看源码</span></span><br><span class="line">std::cout << <span class="string">"frame size = "</span> << width << <span class="string">" * "</span> << height << std::endl;</span><br><span class="line"></span><br><span class="line"><span class="keyword">const</span> <span class="keyword">char</span>* wName = <span class="string">"camera"</span>;</span><br><span class="line">cv::Mat src;</span><br><span class="line">cv::<span class="built_in">namedWindow</span>(wName, WINDOW_AUTOSIZE);</span><br><span class="line"><span class="keyword">while</span> (<span class="literal">true</span>) {</span><br><span class="line">capture >> src;</span><br><span class="line">cv::<span class="built_in">imshow</span>(wName, src);</span><br><span class="line"><span class="keyword">if</span> (cv::<span class="built_in">waitKey</span>(<span class="number">1</span>) >= <span class="number">0</span>) {</span><br><span class="line"><span class="keyword">break</span>;</span><br><span class="line">}</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">}</span><br></pre></td></tr></table></figure><h2 id="窗口与鼠标"><a href="#窗口与鼠标" class="headerlink" title="窗口与鼠标"></a>窗口与鼠标</h2><p><strong>namedWindow</strong></p><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">namedWindow</span>(<span class="string">"myWindow"</span>, WINDOW_NORMAL);</span><br></pre></td></tr></table></figure><blockquote><p>参数2:窗口的标识,一般默认为WINDOW_AUTOSIZE 。</p><p>WINDOW_AUTOSIZE 窗口大小自动适应图片大小,并且不可手动更改。(上面图1就是使用的它)</p><p>WINDOW_NORMAL 用户可以改变这个窗口大小(上面图2就是使用的它)</p><p>WINDOW_OPENGL 窗口创建的时候会支持OpenGL</p></blockquote><p><strong>resizeWindow</strong></p><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">mmat = <span class="built_in">imread</span>(filename, IMREAD_COLOR);</span><br><span class="line"><span class="built_in">namedWindow</span>(<span class="string">"myWindow"</span>, WINDOW_NORMAL);</span><br><span class="line"><span class="built_in">resizeWindow</span>(<span class="string">"myWindow"</span>, <span class="built_in">Size</span>(mmat.cols,mmat.rows));</span><br><span class="line"><span class="built_in">imshow</span>(<span class="string">"myWindow"</span>, mmat);</span><br></pre></td></tr></table></figure><h3 id="鼠标操作"><a href="#鼠标操作" class="headerlink" title="鼠标操作"></a>鼠标操作</h3><p>首先我们可以通过以下例子,掌握鼠标回调函数中 <code>event</code> 和 <code>flags</code>不同取值的作用,以及<code>setMouseCallback</code>用法</p><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string"><opencv2/opencv.hpp></span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string"><iostream></span></span></span><br><span class="line"></span><br><span class="line"><span class="keyword">bool</span> down = <span class="literal">false</span>;</span><br><span class="line"><span class="keyword">int</span> i = <span class="number">0</span>;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">onMouse</span><span class="params">(<span class="keyword">int</span> event, <span class="keyword">int</span> x, <span class="keyword">int</span> y, <span class="keyword">int</span> flags, <span class="keyword">void</span>* param)</span> <span class="comment">//鼠标回调函数</span></span></span><br><span class="line"><span class="function"></span>{</span><br><span class="line"> <span class="comment">/* 鼠标事件发生时,自动执行</span></span><br><span class="line"><span class="comment"> Event是整数,表示鼠标事件的类型</span></span><br><span class="line"><span class="comment"> X和Y为事件发生时鼠标的坐标,用像素坐标表示</span></span><br><span class="line"><span class="comment"> flags表示事件发生时按下鼠标的那个键</span></span><br><span class="line"><span class="comment"> param是指向任意对象的指针,作为附件的参数发送给函数</span></span><br><span class="line"><span class="comment"></span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"></span><br><span class="line"> cv::Mat* im = <span class="keyword">reinterpret_cast</span><cv::Mat*>(param);</span><br><span class="line"> <span class="comment">//im事件发生时鼠标所指的图像指针</span></span><br><span class="line"> <span class="keyword">if</span> (event== cv::EVENT_LBUTTONDOWN) { <span class="comment">//如果按下了鼠标左键</span></span><br><span class="line"> std::cerr << <span class="string">"你按下了鼠标左键x="</span> << x << <span class="string">", y="</span> << y << std::endl << std::endl;</span><br><span class="line"> down = <span class="literal">true</span>;</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">if</span> (event == cv::EVENT_LBUTTONUP) { <span class="comment">//如果释放了鼠标左键</span></span><br><span class="line"> std::cerr << <span class="string">"你释放了鼠标左键x="</span> << x << <span class="string">", y="</span> << y << std::endl << std::endl;</span><br><span class="line"> down = <span class="literal">false</span>;</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">if</span> (event == cv::EVENT_MOUSEMOVE && down==<span class="literal">true</span>) { <span class="comment">//如果按下左键并移动</span></span><br><span class="line"> std::cerr << <span class="string">"你按下了鼠标左键并移动 x="</span> << x << <span class="string">", y="</span> << y << std::endl << std::endl;</span><br><span class="line"> } </span><br><span class="line"> <span class="comment">/*</span></span><br><span class="line"><span class="comment"> cv::EVENT_LBUTTONDOWN=1 左键按下</span></span><br><span class="line"><span class="comment"> cv::EVENT_RBUTTONDOWN=2 右键按下</span></span><br><span class="line"><span class="comment"> cv::EVENT_MBUTTONDOWN=3 中键按下</span></span><br><span class="line"><span class="comment"> cv::EVENT_LBUTTONUP=4 左键放开</span></span><br><span class="line"><span class="comment"> cv::EVENT_RBUTTONUP=5 右键放开</span></span><br><span class="line"><span class="comment"> cv::EVENT_MBUTTONUP=6 中键放开</span></span><br><span class="line"><span class="comment"> cv::EVENT_LBUTTONDBLCLK=7 左键双击</span></span><br><span class="line"><span class="comment"> cv::EVENT_RBUTTONDBLCLK=8 右键双击</span></span><br><span class="line"><span class="comment"> cv::EVENT_MBUTTONDBLCLK=9 中键双击</span></span><br><span class="line"><span class="comment"> cv::EVENT_MOUSEMOVE=0, 鼠标移动</span></span><br><span class="line"><span class="comment"> cv::EVENT_MOUSEWHEEL=10, 滚轮滚动</span></span><br><span class="line"><span class="comment"> cv::EVENT_MOUSEHWHEEL=11 横向滚轮滚动</span></span><br><span class="line"><span class="comment"></span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> </span><br><span class="line"></span><br><span class="line"></span><br><span class="line"> <span class="keyword">if</span> (flags == cv::EVENT_FLAG_LBUTTON) { <span class="comment">//左键拖拽</span></span><br><span class="line"> std::cerr << <span class="string">"你拖拽了鼠标左键 x="</span> << x << <span class="string">", y="</span> << y << std::endl << std::endl;</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="keyword">if</span> (flags == <span class="number">8</span>) { </span><br><span class="line"> std::cerr << <span class="string">"按住CTRL拖拽 i="</span> << i++ << std::endl << std::endl;</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"> <span class="comment">/*</span></span><br><span class="line"><span class="comment"> cv::EVENT_FLAG_LBUTTON =1, //左键拖拽</span></span><br><span class="line"><span class="comment"> cv::EVENT_FLAG_RBUTTON =2, //右键拖拽</span></span><br><span class="line"><span class="comment"> cv::EVENT_FLAG_MBUTTON =4, //中键拖拽</span></span><br><span class="line"><span class="comment"> cv::EVENT_FLAG_CTRLKEY =8 //按住CTRL</span></span><br><span class="line"><span class="comment"> cv::EVENT_FLAG_SHIFTKEY =16 //按住Shift</span></span><br><span class="line"><span class="comment"> cv::EVENT_FLAG_ALTKEY =32 //按住ALT</span></span><br><span class="line"><span class="comment"></span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"></span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">main</span><span class="params">(<span class="keyword">int</span> argc, <span class="keyword">char</span>** argv)</span> </span>{</span><br><span class="line"></span><br><span class="line"> cv::Mat image = cv::<span class="built_in">imread</span>(<span class="string">"D:/bb/tu/1.jpg"</span>);</span><br><span class="line"> <span class="keyword">if</span> (image.<span class="built_in">empty</span>()) {</span><br><span class="line"> std::cout << <span class="string">"图像读取失败..."</span> << std::endl;</span><br><span class="line"> <span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> cv::<span class="built_in">namedWindow</span>(<span class="string">"Original Image"</span>);</span><br><span class="line"> cv::<span class="built_in">imshow</span>(<span class="string">"Original Image"</span>, image);</span><br><span class="line"></span><br><span class="line"> cv::<span class="built_in">setMouseCallback</span>(<span class="string">"Original Image"</span>, onMouse, <span class="keyword">reinterpret_cast</span><<span class="keyword">void</span>*>(&image));<span class="comment">//处理鼠标动作</span></span><br><span class="line"> <span class="comment">/*</span></span><br><span class="line"><span class="comment"> 参数1:窗口的名字</span></span><br><span class="line"><span class="comment"> 参数2:onMouse:鼠标响应函数,回调函数。指定窗口里每次鼠标时间发生的时候,被调用的函数指针</span></span><br><span class="line"><span class="comment"> 参数3:userdate:传给回调函数的参数【鼠标所指的图像】</span></span><br><span class="line"><span class="comment"></span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> cv::<span class="built_in">waitKey</span>(<span class="number">0</span>);</span><br><span class="line"> <span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">}</span><br></pre></td></tr></table></figure><h3 id="示例:交互绘制ROI"><a href="#示例:交互绘制ROI" class="headerlink" title="示例:交互绘制ROI"></a>示例:交互绘制ROI</h3><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">bool</span> leftButtonPushed = <span class="literal">false</span>;</span><br><span class="line">cv::Point startPoint,endPoint;</span><br><span class="line">Mat image,image_copy,imagePartial,imageROI;</span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">createROI</span><span class="params">(<span class="keyword">int</span> event, <span class="keyword">int</span> x, <span class="keyword">int</span> y, <span class="keyword">int</span> flag, <span class="keyword">void</span> * param)</span> </span>{</span><br><span class="line"><span class="keyword">if</span> (event == cv::EVENT_LBUTTONDOWN && leftButtonPushed == <span class="literal">false</span>) {</span><br><span class="line">leftButtonPushed = <span class="literal">true</span>;</span><br><span class="line">startPoint.x = x;</span><br><span class="line">startPoint.y = y;</span><br><span class="line">}</span><br><span class="line"><span class="keyword">if</span> (leftButtonPushed) {</span><br><span class="line"><span class="keyword">if</span> (flag == EVENT_FLAG_LBUTTON) {</span><br><span class="line"><span class="built_in">rectangle</span>(image, <span class="built_in">Rect</span>(startPoint, <span class="built_in">Point</span>(x, y)), <span class="built_in">Scalar</span>(<span class="number">0</span>, <span class="number">255</span>, <span class="number">255</span>,<span class="number">80</span>),<span class="number">-1</span>);</span><br><span class="line">}</span><br><span class="line">}</span><br><span class="line"><span class="keyword">if</span> (event == cv::EVENT_LBUTTONUP) {</span><br><span class="line"> endPoint = <span class="built_in">Point</span>(x, y);</span><br><span class="line">leftButtonPushed = <span class="literal">false</span>;</span><br><span class="line">}</span><br><span class="line"><span class="built_in">imshow</span>(<span class="string">"win"</span>, image);</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">main</span><span class="params">()</span> </span>{</span><br><span class="line">image = cv::<span class="built_in">imread</span>(<span class="string">"D:\\myTemp\\cv\\image\\lena.jpg"</span>);</span><br><span class="line">image_copy = image.<span class="built_in">clone</span>();</span><br><span class="line"><span class="keyword">if</span> (image.<span class="built_in">empty</span>()) {</span><br><span class="line">std::cout << <span class="string">"图像读取失败..."</span> << std::endl;</span><br><span class="line"><span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="built_in">namedWindow</span>(<span class="string">"win"</span>);</span><br><span class="line"><span class="built_in">imshow</span>(<span class="string">"win"</span>, image);</span><br><span class="line"><span class="built_in">setMouseCallback</span>(<span class="string">"win"</span>, createROI, <span class="number">0</span>);</span><br><span class="line"><span class="keyword">while</span> (<span class="number">1</span>) {</span><br><span class="line"><span class="built_in">imshow</span>(<span class="string">"win"</span>, image);</span><br><span class="line"><span class="keyword">int</span> c = <span class="built_in">waitKey</span>(<span class="number">0</span>);</span><br><span class="line"><span class="keyword">if</span> ((<span class="keyword">char</span>)c == <span class="string">'q'</span>)</span><br><span class="line">{</span><br><span class="line"><span class="built_in">destroyAllWindows</span>();</span><br><span class="line"><span class="keyword">break</span>;</span><br><span class="line">}</span><br><span class="line">}</span><br><span class="line">imageROI.<span class="built_in">create</span>(image.rows, image.cols, CV_8UC1);</span><br><span class="line">imageROI.<span class="built_in">setTo</span>(<span class="number">0</span>);</span><br><span class="line"><span class="keyword">for</span> (<span class="keyword">int</span> i = startPoint.y; i < endPoint.y; i++) { <span class="comment">//由于坐标系是按照</span></span><br><span class="line"><span class="keyword">for</span> (<span class="keyword">int</span> j = startPoint.x; j < endPoint.x; j++) {</span><br><span class="line">imageROI.at<uchar>(i,j) = <span class="number">255</span>;</span><br><span class="line"></span><br><span class="line">}</span><br><span class="line">}</span><br><span class="line"><span class="built_in">imshow</span>(<span class="string">"roi"</span>, imageROI);</span><br><span class="line">Mat out;</span><br><span class="line">image_copy.<span class="built_in">copyTo</span>(out, imageROI);</span><br><span class="line"><span class="built_in">imshow</span>(<span class="string">"new"</span>, out);</span><br><span class="line"><span class="built_in">waitKey</span>();</span><br><span class="line">}</span><br></pre></td></tr></table></figure><h2 id="与其他库数据交互"><a href="#与其他库数据交互" class="headerlink" title="与其他库数据交互"></a>与其他库数据交互</h2><h3 id="Eigen"><a href="#Eigen" class="headerlink" title="Eigen"></a>Eigen</h3><p>头文件必须把Eigen写在前面</p><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="meta-keyword">include</span> <span class="meta-string"><Eigen/Dense></span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span> <span class="meta-string"><iostream></span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span> <span class="meta-string"><opencv2/core/eigen.hpp></span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span> <span class="meta-string"><opencv2/opencv.hpp></span></span></span><br><span class="line"> </span><br><span class="line"><span class="keyword">using</span> <span class="keyword">namespace</span> std;</span><br><span class="line"><span class="keyword">using</span> <span class="keyword">namespace</span> cv;</span><br><span class="line"><span class="keyword">using</span> <span class="keyword">namespace</span> Eigen;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">eigen_opencv</span><span class="params">()</span> </span>{</span><br><span class="line"><span class="function">Eigen::MatrixXd <span class="title">m</span><span class="params">(<span class="number">2</span>, <span class="number">5</span>)</span>,d</span>;</span><br><span class="line">m << <span class="number">1</span>, <span class="number">2</span>, <span class="number">3</span>, <span class="number">4</span>, <span class="number">5</span>, <span class="number">6</span>, <span class="number">7</span>, <span class="number">8</span>, <span class="number">9</span>, <span class="number">10</span>;</span><br><span class="line">Mat mat;</span><br><span class="line"><span class="built_in">eigen2cv</span>(m, mat);</span><br><span class="line">mat = mat + <span class="number">5</span>;</span><br><span class="line"><span class="built_in">cv2eigen</span>(mat, d);</span><br><span class="line">}</span><br></pre></td></tr></table></figure>]]></content>
<tags>
<tag> c++ </tag>
<tag> opencv </tag>
</tags>
</entry>
<entry>
<title>matplotlib从绘图到排版</title>
<link href="/2021/01/12/matplotlib%E4%BB%8E%E7%BB%98%E5%9B%BE%E5%88%B0%E6%8E%92%E7%89%88/"/>
<url>/2021/01/12/matplotlib%E4%BB%8E%E7%BB%98%E5%9B%BE%E5%88%B0%E6%8E%92%E7%89%88/</url>
<content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="\assets\css\APlayer.min.css"><script src="\assets\js\APlayer.min.js" class="aplayer-secondary-script-marker"></script><h1 id="绘图"><a href="#绘图" class="headerlink" title="绘图"></a>绘图</h1><h2 id="线与填充"><a href="#线与填充" class="headerlink" title="线与填充"></a>线与填充</h2><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> matplotlib.pyplot <span class="keyword">as</span> plt</span><br><span class="line"><span class="keyword">import</span> numpy <span class="keyword">as</span> np</span><br><span class="line">x = np.linspace(<span class="number">0</span>, <span class="number">10</span>, <span class="number">200</span>)</span><br><span class="line">data_obj = {<span class="string">'x'</span>: x,</span><br><span class="line"> <span class="string">'y1'</span>: <span class="number">2</span> * x + <span class="number">1</span>,</span><br><span class="line"> <span class="string">'y2'</span>: <span class="number">3</span> * x + <span class="number">1.2</span></span><br><span class="line"> ,<span class="string">'mean'</span>: <span class="number">0.5</span> * x * np.cos(<span class="number">2</span>*x) + <span class="number">2.5</span> * x + <span class="number">1.1</span></span><br><span class="line"> }</span><br><span class="line">fig, ax = plt.subplots()</span><br><span class="line"><span class="comment">#填充两条线之间的颜色</span></span><br><span class="line">ax.fill_between(<span class="string">'x'</span>, <span class="string">'y1'</span>, <span class="string">'y2'</span>, color=<span class="string">'yellow'</span>, data=data_obj)</span><br><span class="line"></span><br><span class="line"><span class="comment"># Plot the "centerline" with `plot`</span></span><br><span class="line">ax.plot(<span class="string">'x'</span>, <span class="string">'mean'</span>, color=<span class="string">'black'</span>, data=data_obj)</span><br><span class="line">plt.show()</span><br></pre></td></tr></table></figure><p><img src="https://img-blog.csdnimg.cn/20200608130458132.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NTU2MTM1Nw==,size_16,color_FFFFFF,t_70" alt="在这里插入图片描述"></p><h2 id="散点图"><a href="#散点图" class="headerlink" title="散点图"></a>散点图</h2><p><strong>常用参数</strong></p><p>x,y:表示的是shape大小为(n,)的数组,也就是我们即将绘制散点图的数据点,输入数据。</p><p>s:表示的是大小,是一个标量或者是一个shape大小为(n,)的数组,可选,默认20。</p><p>c:表示的是色彩或颜色序列,可选,默认蓝色’b’。但是c不应该是一个单一的RGB数字,也不应该是一个RGBA的序列,因为不便区分。c可以是一个RGB或RGBA二维行数组。</p><p>marker:MarkerStyle,表示的是标记的样式,可选,默认’o’。</p><p>cmap:Colormap,标量或者是一个colormap的名字,cmap仅仅当c是一个浮点数数组的时候才使用。如果没有申明就是image.cmap,可选,默认None。</p><p>norm:Normalize,数据亮度在0-1之间,也是只有c是一个浮点数的数组的时候才使用。如果没有申明,就是默认None。</p><p>vmin,vmax:标量,当norm存在的时候忽略。用来进行亮度数据的归一化,可选,默认None。</p><p>alpha:标量,0-1之间,可选,默认None。</p><p>linewidths:也就是标记点的长度,默认None。</p><p><strong>marker</strong></p><p>$1.$常用颜色:<br><code>'b'</code> blue 蓝<br> <code>'g'</code> green 绿<br> <code>'r'</code> red 红<br> <code>'c'</code> cyan 蓝绿<br> <code>'m'</code> magenta 洋红<br> <code>'y'</code> yellow 黄<br> <code>'k'</code> black 黑<br> <code>'w'</code> white 白</p><p>$2.$<br><img src="https://img-blog.csdnimg.cn/20200609215709147.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NTU2MTM1Nw==,size_16,color_FFFFFF,t_70" alt="在这里插入图片描述"><br>$3.linestyle$<br><code>'-'</code> solid line style 实线<br> <code>'--'</code> dashed line style 虚线<br> <code>'-.'</code> dash-dot line style 点画线<br> <code>':'</code> dotted line style 点线</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> matplotlib.pyplot <span class="keyword">as</span> plt</span><br><span class="line"><span class="keyword">import</span> numpy <span class="keyword">as</span> np</span><br><span class="line">x=np.arange(<span class="number">10</span>)</span><br><span class="line">y=np.random.randn(<span class="number">10</span>)*<span class="number">10</span></span><br><span class="line">plt.scatter(x,y,color=<span class="string">"red"</span>,marker=<span class="string">"+"</span>)</span><br><span class="line">plt.show()</span><br></pre></td></tr></table></figure><p><img src="https://img-blog.csdnimg.cn/20200608152258770.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NTU2MTM1Nw==,size_16,color_FFFFFF,t_70" alt="在这里插入图片描述"></p><h2 id="频度分布图"><a href="#频度分布图" class="headerlink" title="频度分布图"></a>频度分布图</h2><p><a href="https://matplotlib.org/api/_as_gen/matplotlib.pyplot.hist.html#matplotlib.pyplot.hist">hist官网</a><br>函数:matplotlib.pyplot.hist(x,bins=None,range=None, density=None, bottom=None, histtype=’bar’, align=’mid’, log=False, color=None, label=None, stacked=False, normed=None)<br><strong>常用参数:</strong></p><pre><code>x: 数据集,最终的直方图将对数据集进行统计bins: 统计的区间分布range: tuple, 显示的区间,range在没有给出bins时生效**density**: bool,默认为false,显示的是频数统计结果,为True 则显示频率统计结果,这里需要注意,频率统计结果=区间数目/(总数 *区间宽度),和normed效果一致,官方推荐使用densityfacecolor:例如'g',颜色alpha:透明度histtype: 可选{'bar', 'barstacked', 'step', 'stepfilled'}之一,默认为 bar,推荐使用默认配置,step使用的是梯状,stepfilled则会对梯状 内部进行填充,效果与bar类似align: 可选{'left', 'mid', 'right'}之一,默认为'mid',控制柱状图的水平分布,left或者right,会有部分空白区域,推荐使用默认log: bool,默认False,即y坐标轴是否选择指数刻度stacked: bool,默认为False,是否为堆积状图</code></pre><h2 id="点线图"><a href="#点线图" class="headerlink" title="点线图"></a>点线图</h2><p><a href="https://matplotlib.org/api/_as_gen/matplotlib.pyplot.plot.html#matplotlib.pyplot.plot">plot官网</a></p><p><strong>常用参数</strong></p><p>plot(x, y, color=’green’, marker=’o’, linestyle=’dashed’,<br> linewidth=2, markersize=12)</p><p><strong>实例</strong></p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> matplotlib.pyplot <span class="keyword">as</span> plt</span><br><span class="line"><span class="keyword">import</span> numpy <span class="keyword">as</span> np</span><br><span class="line">t = np.arange(<span class="number">0.</span>, <span class="number">5.</span>, <span class="number">0.2</span>)</span><br><span class="line"><span class="comment"># red dashes, blue squares and green triangles</span></span><br><span class="line">plt.plot(t, t, <span class="string">'r--'</span>, t, t**<span class="number">2</span>, <span class="string">'bs'</span>, t, t**<span class="number">3</span>, <span class="string">'g^'</span>)</span><br><span class="line">plt.show()</span><br><span class="line"></span><br></pre></td></tr></table></figure><p><img src="https://img-blog.csdnimg.cn/20200610093621123.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NTU2MTM1Nw==,size_16,color_FFFFFF,t_70" alt="在这里插入图片描述"></p><h2 id="柱状图"><a href="#柱状图" class="headerlink" title="柱状图"></a>柱状图</h2><p><strong>常用参数</strong></p><pre><code>x,包含所有柱子的下标的列表,也就是每个柱子的标签left 每个柱x轴左边界bottom 每个柱y轴下边界height, 包含所有柱子的高度值的列表width, 每个柱子的宽度。 可以指定一个固定值, 那么所有的柱子都是一样的宽。 或者设置一个列表, 这样可以分别对每个柱子设定不同的宽度align, 柱子对齐方式,有两个可选值:center 和 edgecolor, 柱子的颜色,可传入一个固定值或一个列表edgecolor, 柱子的边框颜色,可传入一个固定值或一个列表linewidth, 每根柱子的边框宽度。 如果没有设置,默认没有边框tick_label, 每根柱子上显示的标签, 默认是没有xerr x方向error baryerr y方向error barecolor error bar颜色capsize error bar横线宽度(default 3)</code></pre><p> </p><h2 id="实例"><a href="#实例" class="headerlink" title="实例"></a>实例</h2><p><img src="https://img-blog.csdnimg.cn/2020061021080180.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NTU2MTM1Nw==,size_16,color_FFFFFF,t_70" alt="在这里插入图片描述"></p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> matplotlib.pyplot <span class="keyword">as</span> plt</span><br><span class="line"><span class="keyword">import</span> numpy <span class="keyword">as</span> np</span><br><span class="line">plt.subplot(<span class="number">221</span>)</span><br><span class="line"><span class="comment">#频度分布图</span></span><br><span class="line">mu,sigma=<span class="number">100</span>,<span class="number">15</span></span><br><span class="line">x=mu+sigma*np.random.randn(<span class="number">10000</span>)</span><br><span class="line"><span class="comment"># the histogram of the data</span></span><br><span class="line">n, bins, patches=plt.hist(x, <span class="number">50</span>, density=<span class="number">1</span>, facecolor=<span class="string">'g'</span>, alpha=<span class="number">0.75</span>) <span class="comment">#要统计的数组,多少块,显示频率1或频数0,颜色,透明度</span></span><br><span class="line">plt.xlabel(<span class="string">'Smarts'</span>)</span><br><span class="line">plt.ylabel(<span class="string">'Probability'</span>)</span><br><span class="line">plt.title(<span class="string">'频度分布图'</span>,fontproperties=<span class="string">"KaiTi"</span>,size=<span class="number">22</span>)</span><br><span class="line">plt.text(<span class="number">60</span>, <span class="number">.025</span>, <span class="string">r'$\mu=100,\ \sigma=15$'</span>)</span><br><span class="line">plt.axis([<span class="number">40</span>, <span class="number">160</span>, <span class="number">0</span>, <span class="number">0.03</span>])</span><br><span class="line">plt.grid(<span class="literal">True</span>)</span><br><span class="line">plt.subplot(<span class="number">222</span>)</span><br><span class="line">data = {<span class="string">'a'</span>: np.arange(<span class="number">50</span>),</span><br><span class="line"> <span class="string">'c'</span>: np.random.randint(<span class="number">0</span>, <span class="number">50</span>, <span class="number">50</span>),</span><br><span class="line"> <span class="string">'d'</span>: np.random.randn(<span class="number">50</span>)}</span><br><span class="line">data[<span class="string">'b'</span>] = data[<span class="string">'a'</span>] + <span class="number">10</span> * np.random.randn(<span class="number">50</span>)</span><br><span class="line">data[<span class="string">'d'</span>] = np.<span class="built_in">abs</span>(data[<span class="string">'d'</span>]) * <span class="number">100</span></span><br><span class="line">plt.title(<span class="string">'散点气泡图'</span>,fontproperties=<span class="string">"KaiTi"</span>,size=<span class="number">22</span>)</span><br><span class="line">plt.scatter(<span class="string">'a'</span>, <span class="string">'b'</span>, c=<span class="string">'c'</span>, s=<span class="string">'d'</span>, data=data) <span class="comment">#c参数是颜色,s参数是大小</span></span><br><span class="line">plt.xlabel(<span class="string">'entry a'</span>)</span><br><span class="line">plt.ylabel(<span class="string">'entry b'</span>)</span><br><span class="line">plt.subplot(<span class="number">223</span>)</span><br><span class="line"><span class="function"><span class="keyword">def</span> <span class="title">f</span>(<span class="params">t</span>):</span></span><br><span class="line"> <span class="keyword">return</span> np.exp(-t) * np.cos(<span class="number">2</span>*np.pi*t)</span><br><span class="line">t1 = np.arange(<span class="number">0.0</span>, <span class="number">5.0</span>, <span class="number">0.1</span>)</span><br><span class="line">t2 = np.arange(<span class="number">0.0</span>, <span class="number">5.0</span>, <span class="number">0.02</span>)</span><br><span class="line">t = np.arange(<span class="number">0.</span>, <span class="number">5.</span>, <span class="number">0.2</span>)</span><br><span class="line">plt.plot(t1, f(t1), <span class="string">'bo'</span>, t2, f(t2), <span class="string">'k'</span>)</span><br><span class="line">plt.title(<span class="string">'点线图'</span>,fontproperties=<span class="string">"KaiTi"</span>,size=<span class="number">22</span>)</span><br><span class="line">plt.subplot(<span class="number">224</span>)</span><br><span class="line">plt.title(<span class="string">'柱状图'</span>,fontproperties=<span class="string">"KaiTi"</span>,size=<span class="number">22</span>)</span><br><span class="line">N = <span class="number">5</span></span><br><span class="line">menMeans = (<span class="number">20</span>, <span class="number">35</span>, <span class="number">30</span>, <span class="number">35</span>, <span class="number">27</span>)</span><br><span class="line">womenMeans = (<span class="number">25</span>, <span class="number">32</span>, <span class="number">34</span>, <span class="number">20</span>, <span class="number">25</span>)</span><br><span class="line">menStd = (<span class="number">2</span>, <span class="number">3</span>, <span class="number">4</span>, <span class="number">1</span>, <span class="number">2</span>)</span><br><span class="line">womenStd = (<span class="number">3</span>, <span class="number">5</span>, <span class="number">2</span>, <span class="number">3</span>, <span class="number">3</span>)</span><br><span class="line">ind = np.arange(N) <span class="comment"># the x locations for the groups</span></span><br><span class="line">width = <span class="number">0.35</span> <span class="comment"># the width of the bars: can also be len(x) sequence</span></span><br><span class="line"></span><br><span class="line">p1 = plt.bar(ind, menMeans, width, yerr=menStd)</span><br><span class="line">p2 = plt.bar(ind, womenMeans, width,</span><br><span class="line"> bottom=menMeans, yerr=womenStd)</span><br><span class="line">plt.ylabel(<span class="string">'Scores'</span>)</span><br><span class="line">plt.xticks(ind, (<span class="string">'G1'</span>, <span class="string">'G2'</span>, <span class="string">'G3'</span>, <span class="string">'G4'</span>, <span class="string">'G5'</span>))</span><br><span class="line">plt.yticks(np.arange(<span class="number">0</span>, <span class="number">81</span>, <span class="number">10</span>))</span><br><span class="line">plt.legend((p1[<span class="number">0</span>], p2[<span class="number">0</span>]), (<span class="string">'Men'</span>, <span class="string">'Women'</span>),bbox_to_anchor=(<span class="number">1.04</span>,<span class="number">0.3</span>))</span><br><span class="line">plt.tight_layout() <span class="comment">#使得图与图之间不重叠</span></span><br><span class="line">plt.show()</span><br></pre></td></tr></table></figure><h1 id="排版"><a href="#排版" class="headerlink" title="排版"></a>排版</h1><h2 id="图例"><a href="#图例" class="headerlink" title="图例"></a>图例</h2><p><a href="https://matplotlib.org/api/_as_gen/matplotlib.pyplot.legend.html#matplotlib.pyplot.legend">legend官网</a><br><strong>常用参数</strong></p><p>‘loc:图例位置,可取(‘best’, ‘upper right’, ‘upper left’, ‘lower left’, ‘lower right’, ‘right’, ‘center left’, ‘center , right’, ‘lower center’, ‘upper center’, ‘center’) ;若是使用了bbox_to_anchor,则这项就无效了</p><p>fontsize: int或float或{‘xx-small’, ‘x-small’, ‘small’, ‘medium’, ‘large’, ‘x-large’, ‘xx-large’},字体大小;</p><p>frameon: 是否显示图例边框,</p><p>ncol: 图例的列的数量,默认为1,</p><p>title: 为图例添加标题</p><p>shadow: 是否为图例边框添加阴影,</p><p>markerfirst: True表示图例标签在句柄右侧,false反之,</p><p>markerscale: 图例标记为原图标记中的多少倍大小,</p><p>numpoints: 表示图例中的句柄上的标记点的个数,一般设为1,</p><p>fancybox: 是否将图例框的边角设为圆形</p><p>framealpha: 控制图例框的透明度</p><p>borderpad: 图例框内边距</p><p>labelspacing: 图例中条目之间的距离</p><p>handlelength: 图例句柄的长度</p><p><strong>bbox_to_anchor</strong><br><img src="https://img-blog.csdnimg.cn/20200610201816541.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NTU2MTM1Nw==,size_16,color_FFFFFF,t_70" alt="在这里插入图片描述"><br><strong>实例</strong><br>里面也介绍了如何使得保存的图像分辨率提高<br><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> matplotlib.pyplot <span class="keyword">as</span> plt</span><br><span class="line"><span class="keyword">import</span> matplotlib</span><br><span class="line"><span class="keyword">import</span> numpy <span class="keyword">as</span> np</span><br><span class="line">plt.figure()</span><br><span class="line">t = np.arange(<span class="number">0.</span>, <span class="number">5.</span>, <span class="number">0.2</span>)</span><br><span class="line">matplotlib.rcParams[<span class="string">"font.family"</span>]=<span class="string">"KaiTi"</span></span><br><span class="line"><span class="comment"># red dashes, blue squares and green triangles</span></span><br><span class="line">p=plt.plot(t, t, <span class="string">'r--'</span>, t, t**<span class="number">2</span>, <span class="string">'bs'</span>, t, t**<span class="number">3</span>, <span class="string">'g^'</span>)</span><br><span class="line">plt.xlabel(<span class="string">"X轴"</span>,size=<span class="number">12</span>)</span><br><span class="line">plt.ylabel(<span class="string">"Y轴"</span>,size=<span class="number">12</span>)</span><br><span class="line">plt.legend((p[<span class="number">0</span>],p[<span class="number">1</span>],p[<span class="number">2</span>]),(<span class="string">r"$t$"</span>,<span class="string">r"$t^2$"</span>,<span class="string">r"$t^3$"</span>)</span><br><span class="line"> ,loc=<span class="string">'center'</span></span><br><span class="line"> ,bbox_to_anchor=(<span class="number">1.2</span>,<span class="number">0.2</span>)</span><br><span class="line"> , fontsize=<span class="number">12</span></span><br><span class="line"> , frameon=<span class="number">1</span></span><br><span class="line"> , fancybox=<span class="literal">True</span></span><br><span class="line"> , framealpha=<span class="number">0.2</span></span><br><span class="line"> , borderpad=<span class="number">0.3</span></span><br><span class="line"> , ncol=<span class="number">1</span></span><br><span class="line"> , markerfirst=<span class="literal">True</span></span><br><span class="line"> , markerscale=<span class="number">1</span></span><br><span class="line"> , numpoints=<span class="number">1</span></span><br><span class="line"> , handlelength=<span class="number">3.5</span></span><br><span class="line"> ,title=<span class="string">"图例"</span></span><br><span class="line"> )</span><br><span class="line"><span class="comment"># plt.rcParams['savefig.dpi'] = 300 #图片像素</span></span><br><span class="line"><span class="comment"># plt.rcParams['figure.dpi'] = 300 #分辨率</span></span><br><span class="line">plt.tight_layout()</span><br><span class="line">plt.savefig(<span class="string">"lig.png"</span>,dpi=<span class="number">300</span>)</span><br><span class="line">plt.show()</span><br></pre></td></tr></table></figure><br>或者</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line">plt.subplot(<span class="number">211</span>)</span><br><span class="line">plt.plot([<span class="number">1</span>, <span class="number">2</span>, <span class="number">3</span>], label=<span class="string">"test1"</span>)</span><br><span class="line">plt.plot([<span class="number">3</span>, <span class="number">2</span>, <span class="number">1</span>], label=<span class="string">"test2"</span>)</span><br><span class="line">plt.tight_layout()</span><br><span class="line"><span class="comment"># Place a legend above this subplot, expanding itself to</span></span><br><span class="line"><span class="comment"># fully use the given bounding box.</span></span><br><span class="line">plt.legend(bbox_to_anchor=(<span class="number">0.</span>, <span class="number">1.02</span>, <span class="number">1.</span>, <span class="number">.102</span>), loc=<span class="string">'lower left'</span>,</span><br><span class="line"> ncol=<span class="number">2</span>, mode=<span class="string">"expand"</span>, borderaxespad=<span class="number">0.</span>)</span><br></pre></td></tr></table></figure><p><a href="https://blog.csdn.net/qq_35240640/article/details/89445826">使用matplotlib.pyplot实现画折线图的一个实用示例</a></p><h2 id="添加中文"><a href="#添加中文" class="headerlink" title="添加中文"></a>添加中文</h2><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> matplotlib.pyplot <span class="keyword">as</span> plt</span><br><span class="line">plt.xlabel(<span class="string">"x轴"</span>,fontproperties=<span class="string">"KaiTi"</span>,size=<span class="number">14</span>)</span><br><span class="line">plt.ylabel(<span class="string">"y轴"</span>, fontproperties=<span class="string">"SimSun"</span>,size=<span class="number">14</span>) <span class="comment"># 步骤一 (宋体)</span></span><br><span class="line">plt.title(<span class="string">"标题"</span>, fontproperties=<span class="string">"SimHei"</span>,size=<span class="number">36</span>) <span class="comment"># (黑体)</span></span><br><span class="line">plt.show()</span><br></pre></td></tr></table></figure><p>一些中文字体的英文名</p><p>宋体 SimSun<br>黑体 SimHei<br>微软雅黑 Microsoft YaHei<br>微软正黑体 Microsoft JhengHei<br>新宋体 NSimSun<br>新细明体 PMingLiU<br>细明体 MingLiU<br>标楷体 DFKai-SB<br>仿宋 FangSong<br>楷体 KaiTi<br>隶书:LiSu<br>幼圆:YouYuan<br>华文细黑:STXihei<br>华文楷体:STKaiti<br>华文宋体:STSong<br>华文中宋:STZhongsong<br>华文仿宋:STFangsong<br>方正舒体:FZShuTi<br>方正姚体:FZYaoti<br>华文彩云:STCaiyun<br>华文琥珀:STHupo<br>华文隶书:STLiti<br>华文行楷:STXingkai<br>华文新魏:STXinwei</p><h2 id="Axes-列表"><a href="#Axes-列表" class="headerlink" title="Axes 列表"></a>Axes 列表</h2><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> matplotlib.pyplot <span class="keyword">as</span> plt</span><br><span class="line">fig, axes = plt.subplots(nrows=<span class="number">2</span>, ncols=<span class="number">2</span>)</span><br><span class="line">axes[<span class="number">0</span>,<span class="number">0</span>].<span class="built_in">set</span>(title=<span class="string">'Upper Left'</span>)</span><br><span class="line">axes[<span class="number">0</span>,<span class="number">1</span>].<span class="built_in">set</span>(title=<span class="string">'Upper Right'</span>)</span><br><span class="line">axes[<span class="number">1</span>,<span class="number">0</span>].<span class="built_in">set</span>(title=<span class="string">'Lower Left'</span>)</span><br><span class="line">axes[<span class="number">1</span>,<span class="number">1</span>].<span class="built_in">set</span>(title=<span class="string">'Lower Right'</span>,xlim=[<span class="number">0.5</span>, <span class="number">4.5</span>], ylim=[-<span class="number">2</span>, <span class="number">8</span>],</span><br><span class="line"> ylabel=<span class="string">'Y-Axis'</span>, xlabel=<span class="string">'X-Axis'</span>)</span><br><span class="line">plt.show()</span><br></pre></td></tr></table></figure><p><img src="https://img-blog.csdnimg.cn/20200608100905301.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NTU2MTM1Nw==,size_16,color_FFFFFF,t_70" alt="在这里插入图片描述"><br>实例</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> matplotlib.pyplot <span class="keyword">as</span> plt</span><br><span class="line"><span class="keyword">import</span> numpy <span class="keyword">as</span> np</span><br><span class="line">x = np.linspace(<span class="number">0</span>, np.pi)</span><br><span class="line">y_sin = np.sin(x)</span><br><span class="line">y_cos = np.cos(x)</span><br><span class="line">fig,axes=plt.subplots(nrows=<span class="number">2</span>, ncols=<span class="number">2</span>)</span><br><span class="line">axes[<span class="number">0</span>,<span class="number">0</span>].plot(x, y_sin)</span><br><span class="line">axes[<span class="number">0</span>,<span class="number">1</span>].plot(x, y_sin, <span class="string">'go--'</span>, linewidth=<span class="number">2</span>, markersize=<span class="number">12</span>)</span><br><span class="line">axes[<span class="number">1</span>,<span class="number">0</span>].plot(x, y_cos, color=<span class="string">'red'</span>, marker=<span class="string">'+'</span>, linestyle=<span class="string">'dashed'</span>)</span><br><span class="line"><span class="comment">#ax2的第三个参数是 MATLAB风格的绘图,对应ax3上的颜色,marker,线型。</span></span><br><span class="line">plt.show()</span><br><span class="line"></span><br></pre></td></tr></table></figure><p><img src="https://img-blog.csdnimg.cn/20200608105402265.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NTU2MTM1Nw==,size_16,color_FFFFFF,t_70" alt="在这里插入图片描述"></p><h2 id="添加箭头"><a href="#添加箭头" class="headerlink" title="添加箭头"></a>添加箭头</h2><p><a href="https://blog.csdn.net/leaf_zizi/article/details/82886755">Python学习笔记(4)——Matplotlib中的annotate(注解)的用法</a></p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> matplotlib.pyplot <span class="keyword">as</span> plt</span><br><span class="line"><span class="keyword">import</span> numpy <span class="keyword">as</span> np</span><br><span class="line"></span><br><span class="line">plt.subplot()</span><br><span class="line">t = np.arange(<span class="number">0.0</span>, <span class="number">5.0</span>, <span class="number">0.01</span>)</span><br><span class="line">s = np.cos(<span class="number">2</span>*np.pi*t)</span><br><span class="line">line, = plt.plot(t, s, lw=<span class="number">2</span>,c=<span class="string">"g"</span>)</span><br><span class="line">plt.annotate(<span class="string">'局部最大值'</span>,fontproperties=<span class="string">"KaiTi"</span></span><br><span class="line"> ,xy=(<span class="number">2</span>, <span class="number">1</span>)</span><br><span class="line"> , xytext=(<span class="number">3</span>, <span class="number">1.5</span>)</span><br><span class="line"> ,arrowprops=<span class="built_in">dict</span>(facecolor=<span class="string">'black'</span></span><br><span class="line"> , shrink=<span class="number">0.02</span> <span class="comment">#箭头两端收缩的百分比(占总长)</span></span><br><span class="line"> ,width=<span class="number">0.1</span> <span class="comment">#尾部宽度</span></span><br><span class="line"> ,headwidth=<span class="number">5</span> <span class="comment">#箭头宽度</span></span><br><span class="line"> )</span><br><span class="line"> )</span><br><span class="line">plt.ylim(-<span class="number">2</span>, <span class="number">2</span>)</span><br><span class="line">plt.show()</span><br></pre></td></tr></table></figure><p><img src="https://img-blog.csdnimg.cn/60974e32e8884795a046753535fb4de9.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA6ZSD5YWJ55Om5Lqu55qE5p6V5bCP6Lev,size_12,color_FFFFFF,t_70,g_se,x_16" alt="在这里插入图片描述"></p>]]></content>
<tags>
<tag> python </tag>
<tag> MySQL </tag>
</tags>
</entry>
<entry>
<title>基于python与MySQL的记账可视化小程序</title>
<link href="/2020/07/11/%E5%9F%BA%E4%BA%8Epython%E4%B8%8EMySQL%E7%9A%84%E8%AE%B0%E8%B4%A6%E5%8F%AF%E8%A7%86%E5%8C%96%E5%B0%8F%E7%A8%8B%E5%BA%8F/"/>
<url>/2020/07/11/%E5%9F%BA%E4%BA%8Epython%E4%B8%8EMySQL%E7%9A%84%E8%AE%B0%E8%B4%A6%E5%8F%AF%E8%A7%86%E5%8C%96%E5%B0%8F%E7%A8%8B%E5%BA%8F/</url>
<content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="\assets\css\APlayer.min.css"><script src="\assets\js\APlayer.min.js" class="aplayer-secondary-script-marker"></script><p>最近学习了一下MySQL的操作,顺便写了一个记账并可视化的小程序。<br> <strong>数据库设计</strong></p><div class="table-container"><table><thead><tr><th>ID</th><th>name</th><th>money</th><th>summoney</th><th>datetime</th></tr></thead><tbody><tr><td></td></tr></tbody></table></div><p>注:该表格在“demo1”数据库下,表格名为:infor</p><h2 id="数据库操作类"><a href="#数据库操作类" class="headerlink" title="数据库操作类"></a>数据库操作类</h2><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br></pre></td><td class="code"><pre><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">MySql</span>:</span></span><br><span class="line"> <span class="comment">###构造函数</span></span><br><span class="line"> <span class="function"><span class="keyword">def</span> <span class="title">__init__</span>(<span class="params">self,user,password,database,maineig=<span class="string">"localhost"</span></span>):</span></span><br><span class="line"> self.db=MySQLdb.connect(maineig,user,password,database,charset=<span class="string">'utf8'</span>)</span><br><span class="line"> <span class="comment">###查询函数</span></span><br><span class="line"> <span class="function"><span class="keyword">def</span> <span class="title">Look</span>(<span class="params">self,sql</span>):</span></span><br><span class="line"> <span class="keyword">try</span>:</span><br><span class="line"> cursor = self.db.cursor() <span class="comment"># 使用cursor()方法获取操作游标</span></span><br><span class="line"> cursor.execute(sql) <span class="comment"># 执行sql语言</span></span><br><span class="line"> result = cursor.fetchall() <span class="comment"># 获取表中数据,其中result是一个元组</span></span><br><span class="line"> <span class="keyword">return</span> result</span><br><span class="line"> <span class="keyword">except</span>:</span><br><span class="line"> <span class="built_in">print</span>(<span class="string">"SEARCH ERROR!"</span>)</span><br><span class="line"> <span class="comment">###插入函数</span></span><br><span class="line"> <span class="function"><span class="keyword">def</span> <span class="title">Insert</span>(<span class="params">self,sql</span>):</span></span><br><span class="line"> <span class="keyword">try</span>:</span><br><span class="line"> cursor=self.db.cursor()</span><br><span class="line"> cursor.execute(sql)</span><br><span class="line"> self.db.commit() <span class="comment"># 提交到数据库执行</span></span><br><span class="line"> <span class="keyword">except</span>:</span><br><span class="line"> self.db.rollback()</span><br><span class="line"> <span class="built_in">print</span>(<span class="string">"INSERT ERROR:已经回滚!"</span>)</span><br><span class="line"> <span class="comment">###数据库删除信息</span></span><br><span class="line"> <span class="function"><span class="keyword">def</span> <span class="title">Delete</span>(<span class="params">self,sql</span>):</span></span><br><span class="line"> <span class="keyword">try</span>:</span><br><span class="line"> cursor=self.db.cursor()</span><br><span class="line"> cursor.execute(sql)</span><br><span class="line"> self.db.commit()</span><br><span class="line"> <span class="keyword">except</span>:</span><br><span class="line"> self.db.rollback()</span><br><span class="line"> <span class="built_in">print</span>(<span class="string">"DELETE ERROR:已经回滚!"</span>)</span><br><span class="line"> <span class="comment">###数据库更新信息</span></span><br><span class="line"> <span class="function"><span class="keyword">def</span> <span class="title">Update</span>(<span class="params">self,sql</span>):</span></span><br><span class="line"> <span class="keyword">try</span>:</span><br><span class="line"> cursor=self.db.cursor()</span><br><span class="line"> cursor.execute(sql)</span><br><span class="line"> self.db.commit()</span><br><span class="line"> <span class="keyword">except</span>:</span><br><span class="line"> self.db.rollback()</span><br><span class="line"> <span class="built_in">print</span>(<span class="string">"UPDATE ERROR:已经回滚!"</span>)</span><br><span class="line"> <span class="comment">###析构函数</span></span><br><span class="line"> <span class="function"><span class="keyword">def</span> <span class="title">__del__</span>(<span class="params">self</span>):</span></span><br><span class="line"> self.db.close()</span><br></pre></td></tr></table></figure><h2 id="数据库操作函数"><a href="#数据库操作函数" class="headerlink" title="数据库操作函数"></a>数据库操作函数</h2><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">def</span> <span class="title">DatabaseConduct</span>(<span class="params">ms</span>):</span></span><br><span class="line"> start = <span class="string">"+------选择功能-------+\n"</span></span><br><span class="line"> start += <span class="string">"| 1.添加信息 |\n"</span></span><br><span class="line"> start += <span class="string">"| 2.删除信息 |\n"</span></span><br><span class="line"> start += <span class="string">"| 3.修改信息 |\n"</span></span><br><span class="line"> start += <span class="string">"| 4.查询信息 |\n"</span></span><br><span class="line"> start += <span class="string">"| 5.退出程序 |\n"</span></span><br><span class="line"> start += <span class="string">"+---------end---------+\n"</span></span><br><span class="line"> <span class="built_in">print</span>(start)</span><br><span class="line"> judge = <span class="built_in">int</span>(<span class="built_in">input</span>(<span class="string">"请输入执行功能:"</span>))</span><br><span class="line"> <span class="keyword">while</span> (judge != <span class="number">5</span>):</span><br><span class="line"> <span class="keyword">if</span> (judge == <span class="number">1</span>):</span><br><span class="line"> name = <span class="built_in">input</span>(<span class="string">"请输入姓名:"</span>)</span><br><span class="line"> money = <span class="built_in">float</span>(<span class="built_in">input</span>(<span class="string">"请输入金额:(¥)"</span>))</span><br><span class="line"> summoney = ms.Look(<span class="string">"select * from infor"</span>)[-<span class="number">1</span>][<span class="number">3</span>] + money</span><br><span class="line"> ID = ms.Look(<span class="string">"select * from infor"</span>)[-<span class="number">1</span>][<span class="number">0</span>] + <span class="number">1</span></span><br><span class="line"> dt =datetime.datetime.now()</span><br><span class="line"> sql1 = <span class="string">"""insert into infor (ID,name,money,summoney,datetime) VALUES ("""</span> + <span class="built_in">str</span>(ID) + <span class="string">" , "</span>+<span class="string">'"'</span> + name + <span class="string">'"'</span>+<span class="string">" , "</span> + <span class="built_in">str</span>(money) + <span class="string">" , "</span> + <span class="built_in">str</span>(summoney) + <span class="string">" , "</span> +<span class="string">'''"'''</span>+<span class="built_in">str</span>(dt)+<span class="string">'''"'''</span>+<span class="string">")"</span></span><br><span class="line"> ms.Insert(sql1)</span><br><span class="line"> <span class="keyword">elif</span> (judge == <span class="number">2</span>):</span><br><span class="line"> <span class="built_in">id</span> = <span class="built_in">int</span>(<span class="built_in">input</span>(<span class="string">"请输入要删除的行号:"</span>))</span><br><span class="line"> sql2=<span class="string">"delete from infor where ID = "</span>+<span class="built_in">str</span>(<span class="built_in">id</span>)</span><br><span class="line"> ms.Delete(sql2)</span><br><span class="line"> res=ms.Look(<span class="string">"select * from infor"</span>)</span><br><span class="line"> <span class="built_in">max</span>=<span class="built_in">len</span>(res)</span><br><span class="line"> <span class="keyword">for</span> i <span class="keyword">in</span> <span class="built_in">range</span>(<span class="built_in">id</span>,<span class="built_in">max</span>+<span class="number">2</span>):</span><br><span class="line"> sqli=<span class="string">"update infor set ID = "</span>+<span class="built_in">str</span>(i-<span class="number">1</span>)+<span class="string">" where ID = "</span>+<span class="built_in">str</span>(i)</span><br><span class="line"> ms.Update(sqli)</span><br><span class="line"> <span class="keyword">elif</span> (judge == <span class="number">3</span>):</span><br><span class="line"> <span class="built_in">id</span>=<span class="built_in">input</span>(<span class="string">"请输入要更改的行号:"</span>)</span><br><span class="line"> change = <span class="built_in">int</span>(<span class="built_in">input</span>(<span class="string">"请选择要更改的字段:1.name; 2.money; 3.summoney; 4.datetime"</span>))</span><br><span class="line"> item=<span class="built_in">input</span>(<span class="string">"请输入更改后的值:"</span>)</span><br><span class="line"> sqlj=<span class="string">""</span></span><br><span class="line"> <span class="keyword">if</span>(change==<span class="number">1</span>):</span><br><span class="line"> sqlj=<span class="string">"update infor set name = "</span>+ <span class="string">'"'</span>+item+<span class="string">'"'</span>+<span class="string">" where ID = "</span>+<span class="built_in">id</span></span><br><span class="line"> ms.Update(sqlj)</span><br><span class="line"> <span class="keyword">elif</span>(change==<span class="number">2</span>):</span><br><span class="line"> sqlj = <span class="string">"update infor set money = "</span> + item + <span class="string">" where ID = "</span> + <span class="built_in">id</span></span><br><span class="line"> ms.Update(sqlj)</span><br><span class="line"> re=ms.Look(<span class="string">"select * from infor"</span>)</span><br><span class="line"> <span class="built_in">print</span>(re)</span><br><span class="line"> <span class="built_in">max</span>=<span class="built_in">len</span>(re)</span><br><span class="line"> presum = re[<span class="built_in">int</span>(<span class="built_in">id</span>) -<span class="number">2</span>][<span class="number">3</span>]</span><br><span class="line"> presum=presum+re[<span class="built_in">int</span>(<span class="built_in">id</span>)-<span class="number">1</span>][<span class="number">2</span>]</span><br><span class="line"> <span class="keyword">for</span> i <span class="keyword">in</span> <span class="built_in">range</span>(<span class="built_in">int</span>(<span class="built_in">id</span>)-<span class="number">1</span>,<span class="built_in">max</span>):</span><br><span class="line"> presum+=re[i][<span class="number">2</span>]</span><br><span class="line"> Id=i+<span class="number">1</span></span><br><span class="line"> sq=<span class="string">"update infor set summoney = "</span> + <span class="built_in">str</span>(presum) + <span class="string">" where ID = "</span> + <span class="built_in">str</span>(Id)</span><br><span class="line"> ms.Update(sq)</span><br><span class="line"> <span class="keyword">elif</span>(change==<span class="number">3</span>):</span><br><span class="line"> sqlj = <span class="string">"update infor set summoney = "</span> + item + <span class="string">" where ID = "</span> + <span class="built_in">id</span></span><br><span class="line"> ms.Update(sqlj)</span><br><span class="line"> <span class="keyword">elif</span>(change==<span class="number">4</span>):</span><br><span class="line"> sqlj = <span class="string">"update infor set name = "</span> + <span class="string">'"'</span> + item + <span class="string">'"'</span> + <span class="string">" where ID = "</span> + <span class="built_in">id</span></span><br><span class="line"> ms.Update(sqlj)</span><br><span class="line"> <span class="keyword">elif</span> (judge == <span class="number">4</span>):</span><br><span class="line"> sql = <span class="string">"select * from infor"</span></span><br><span class="line"> result = ms.Look(sql)</span><br><span class="line"> <span class="keyword">for</span> i <span class="keyword">in</span> result:</span><br><span class="line"> <span class="built_in">print</span>(i)</span><br><span class="line"> <span class="built_in">print</span>(start)</span><br><span class="line"> judge = <span class="built_in">int</span>(<span class="built_in">input</span>(<span class="string">"请输入执行功能:"</span>))</span><br></pre></td></tr></table></figure><h2 id="可视化"><a href="#可视化" class="headerlink" title="可视化"></a>可视化</h2><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">def</span> <span class="title">Visual</span>(<span class="params">ms</span>):</span></span><br><span class="line"> <span class="built_in">all</span>=ms.Look(<span class="string">"select * from infor"</span>)</span><br><span class="line"> start = <span class="string">"+------选择功能-------+\n"</span></span><br><span class="line"> start += <span class="string">"| 1.按年显示 |\n"</span></span><br><span class="line"> start += <span class="string">"| 2.按月显示 |\n"</span></span><br><span class="line"> start += <span class="string">"| 3.按日显示 |\n"</span></span><br><span class="line"> start += <span class="string">"| 4.退出程序 |\n"</span></span><br><span class="line"> start += <span class="string">"+---------end---------+\n"</span></span><br><span class="line"> <span class="built_in">print</span>(start)</span><br><span class="line"> judge = <span class="built_in">int</span>(<span class="built_in">input</span>(<span class="string">"请输入执行功能:"</span>))</span><br><span class="line"> <span class="keyword">while</span> (judge !=<span class="number">4</span>):</span><br><span class="line"> <span class="keyword">if</span> (judge==<span class="number">1</span>):</span><br><span class="line"> strbeginyear=<span class="built_in">str</span>(<span class="built_in">all</span>[<span class="number">0</span>][<span class="number">4</span>])[<span class="number">0</span>:<span class="number">4</span>]</span><br><span class="line"> strendyear=<span class="built_in">str</span>(<span class="built_in">all</span>[-<span class="number">1</span>][<span class="number">4</span>])[<span class="number">0</span>:<span class="number">4</span>]</span><br><span class="line"> oneyear=<span class="built_in">int</span>(strbeginyear)</span><br><span class="line"> everymoneys=[]</span><br><span class="line"> summoneys=[]</span><br><span class="line"> thislist = []</span><br><span class="line"> <span class="keyword">while</span> oneyear <=<span class="built_in">int</span>(strendyear):</span><br><span class="line"> onest=ms.Look(<span class="string">"select * from infor where datetime regexp '"</span>+<span class="built_in">str</span>(oneyear)+<span class="string">"'"</span>)</span><br><span class="line"> <span class="keyword">if</span>(onest !=()):</span><br><span class="line"> onemoney = onest[-<span class="number">1</span>][<span class="number">3</span>] - onest[<span class="number">0</span>][<span class="number">3</span>] + onest[<span class="number">0</span>][<span class="number">2</span>]</span><br><span class="line"> onesum = onest[-<span class="number">1</span>][<span class="number">3</span>]</span><br><span class="line"> everymoneys.append(onemoney)</span><br><span class="line"> summoneys.append(onesum)</span><br><span class="line"> thislist.append(oneyear)</span><br><span class="line"> oneyear += <span class="number">1</span></span><br><span class="line"> <span class="keyword">else</span>:</span><br><span class="line"> oneyear+=<span class="number">1</span></span><br><span class="line"> xtick = (np.arange(<span class="built_in">len</span>(thislist)))</span><br><span class="line"> plt.subplot()</span><br><span class="line"> matplotlib.rcParams[<span class="string">"font.family"</span>] = <span class="string">"KaiTi"</span></span><br><span class="line"> plt.bar(xtick,everymoneys,<span class="number">0.3</span>,label=<span class="string">"各年收支"</span>)</span><br><span class="line"> plt.plot(xtick, summoneys, <span class="string">"--r"</span>,label=<span class="string">"累计收支"</span>)</span><br><span class="line"> plt.xlabel(<span class="string">"年份"</span>,fontproperties=<span class="string">"KaiTi"</span>,size=<span class="number">14</span>)</span><br><span class="line"> plt.ylabel(<span class="string">"金额(¥)"</span>,fontproperties=<span class="string">"KaiTi"</span>,size=<span class="number">14</span>)</span><br><span class="line"> plt.title(<span class="string">"各年份收支信息"</span>,fontproperties=<span class="string">"KaiTi"</span>,size=<span class="number">22</span>)</span><br><span class="line"> plt.legend()</span><br><span class="line"> plt.xticks(xtick)</span><br><span class="line"> plt.show()</span><br><span class="line"> <span class="keyword">elif</span>(judge==<span class="number">2</span>):</span><br><span class="line"> year=<span class="built_in">input</span>(<span class="string">"请输入年份:"</span>)</span><br><span class="line"> partyear=ms.Look(<span class="string">"select * from infor where datetime regexp '"</span> + year + <span class="string">"'"</span>)</span><br><span class="line"> strbeginmonth = <span class="built_in">str</span>(partyear[<span class="number">0</span>][<span class="number">4</span>])[<span class="number">5</span>:<span class="number">7</span>]</span><br><span class="line"> strendmonth=<span class="built_in">str</span>(partyear[-<span class="number">1</span>][<span class="number">4</span>])[<span class="number">5</span>:<span class="number">7</span>]</span><br><span class="line"> onemonth = <span class="built_in">int</span>(strbeginmonth)</span><br><span class="line"> everymoneys = []</span><br><span class="line"> summoneys = []</span><br><span class="line"> monthlist=[<span class="string">"1月"</span>,<span class="string">"2月"</span>,<span class="string">"3月"</span>,<span class="string">"4月"</span>,<span class="string">"5月"</span>,<span class="string">"6月"</span>,<span class="string">"7月"</span>,<span class="string">"8月"</span>,<span class="string">"9月"</span>,<span class="string">"10月"</span>,<span class="string">"11月"</span>,<span class="string">"12月"</span>]</span><br><span class="line"> thislist=[]</span><br><span class="line"> monthcount=<span class="built_in">int</span>(strbeginmonth)</span><br><span class="line"> <span class="keyword">while</span> onemonth <= <span class="built_in">int</span>(strendmonth):</span><br><span class="line"> onest = ms.Look(<span class="string">"select * from infor where datetime regexp '"</span> +year+<span class="string">"-"</span>+ <span class="string">"0*"</span>+<span class="built_in">str</span>(onemonth) + <span class="string">"'"</span>)</span><br><span class="line"> <span class="keyword">if</span>(onest !=()):</span><br><span class="line"> onemoney = onest[-<span class="number">1</span>][<span class="number">3</span>] - onest[<span class="number">0</span>][<span class="number">3</span>] + onest[<span class="number">0</span>][<span class="number">2</span>]</span><br><span class="line"> onesum = onest[-<span class="number">1</span>][<span class="number">3</span>]</span><br><span class="line"> everymoneys.append(onemoney)</span><br><span class="line"> summoneys.append(onesum)</span><br><span class="line"> thislist.append(monthlist[onemonth-<span class="number">1</span>])</span><br><span class="line"> onemonth += <span class="number">1</span></span><br><span class="line"> <span class="keyword">else</span>:</span><br><span class="line"> onemonth += <span class="number">1</span></span><br><span class="line"> xtick = (np.arange(<span class="built_in">len</span>(thislist)))</span><br><span class="line"> plt.subplot()</span><br><span class="line"> matplotlib.rcParams[<span class="string">"font.family"</span>] = <span class="string">"KaiTi"</span></span><br><span class="line"> plt.bar(xtick, everymoneys, <span class="number">0.3</span>,label=<span class="string">"各月收支"</span>)</span><br><span class="line"> plt.plot(xtick, summoneys, <span class="string">"--r"</span>,label=<span class="string">"累计收支"</span>)</span><br><span class="line"> plt.xlabel(<span class="string">"月份"</span>, fontproperties=<span class="string">"KaiTi"</span>, size=<span class="number">14</span>)</span><br><span class="line"> plt.ylabel(<span class="string">"金额(¥)"</span>,fontproperties=<span class="string">"KaiTi"</span>, size=<span class="number">14</span>)</span><br><span class="line"> plt.title(year+<span class="string">"年各月份收支信息"</span>, fontproperties=<span class="string">"KaiTi"</span>, size=<span class="number">22</span>)</span><br><span class="line"> plt.xticks(xtick,thislist,fontproperties=<span class="string">"KaiTi"</span>,size=<span class="number">14</span>)</span><br><span class="line"> plt.legend()</span><br><span class="line"> plt.show()</span><br><span class="line"> <span class="keyword">elif</span> (judge==<span class="number">3</span>):</span><br><span class="line"> year = <span class="built_in">input</span>(<span class="string">"请输入年份:"</span>)</span><br><span class="line"> month = <span class="built_in">input</span>(<span class="string">"请输入月份:"</span>)</span><br><span class="line"> partmonth = ms.Look(<span class="string">"select * from infor where datetime regexp '"</span> + year +<span class="string">"-"</span>+<span class="string">"0*"</span>+month+ <span class="string">"'"</span>)</span><br><span class="line"> strbeginday = <span class="built_in">str</span>(partmonth[<span class="number">0</span>][<span class="number">4</span>])[<span class="number">8</span>:<span class="number">10</span>]</span><br><span class="line"> strendday = <span class="built_in">str</span>(partmonth[-<span class="number">1</span>][<span class="number">4</span>])[<span class="number">8</span>:<span class="number">10</span>]</span><br><span class="line"> oneday = <span class="built_in">int</span>(strbeginday)</span><br><span class="line"> everymoneys = []</span><br><span class="line"> summoneys = []</span><br><span class="line"> thislist = []</span><br><span class="line"> daycount = <span class="built_in">int</span>(strbeginday)</span><br><span class="line"> <span class="keyword">while</span> oneday <= <span class="built_in">int</span>(strendday):</span><br><span class="line"> onest = ms.Look(<span class="string">"select * from infor where datetime regexp '"</span> + year + <span class="string">"-"</span> + <span class="string">"0*"</span> + month +<span class="string">"-0*"</span>+<span class="built_in">str</span>(oneday)+ <span class="string">"'"</span>)</span><br><span class="line"> <span class="keyword">if</span> (onest != ()):</span><br><span class="line"> onemoney = onest[-<span class="number">1</span>][<span class="number">3</span>] - onest[<span class="number">0</span>][<span class="number">3</span>] + onest[<span class="number">0</span>][<span class="number">2</span>]</span><br><span class="line"> onesum = onest[-<span class="number">1</span>][<span class="number">3</span>]</span><br><span class="line"> everymoneys.append(onemoney)</span><br><span class="line"> summoneys.append(onesum)</span><br><span class="line"> thislist.append(oneday)</span><br><span class="line"> oneday += <span class="number">1</span></span><br><span class="line"> <span class="keyword">else</span>:</span><br><span class="line"> oneday += <span class="number">1</span></span><br><span class="line"> xtick = (np.arange(<span class="built_in">len</span>(thislist)))</span><br><span class="line"> plt.subplot()</span><br><span class="line"> matplotlib.rcParams[<span class="string">"font.family"</span>] = <span class="string">"KaiTi"</span></span><br><span class="line"> plt.bar(xtick, everymoneys, <span class="number">0.3</span>,label=<span class="string">"各天收支"</span>)</span><br><span class="line"> plt.plot(xtick, summoneys, <span class="string">"--r"</span>,label=<span class="string">"累计收支"</span>)</span><br><span class="line"> plt.xlabel(<span class="string">"天"</span>, fontproperties=<span class="string">"KaiTi"</span>, size=<span class="number">14</span>)</span><br><span class="line"> plt.ylabel(<span class="string">"金额(¥)"</span>, fontproperties=<span class="string">"KaiTi"</span>, size=<span class="number">14</span>)</span><br><span class="line"> plt.title(year+<span class="string">"年"</span>+month+<span class="string">"月每日收支信息"</span>, fontproperties=<span class="string">"KaiTi"</span>, size=<span class="number">22</span>)</span><br><span class="line"> plt.xticks(xtick, thislist, fontproperties=<span class="string">"KaiTi"</span>, size=<span class="number">14</span>)</span><br><span class="line"> plt.legend()</span><br><span class="line"> plt.show()</span><br><span class="line"> <span class="built_in">print</span>(start)</span><br><span class="line"> judge = <span class="built_in">int</span>(<span class="built_in">input</span>(<span class="string">"请输入执行功能:"</span>))</span><br></pre></td></tr></table></figure><h2 id="主函数"><a href="#主函数" class="headerlink" title="主函数"></a>主函数</h2><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">if</span> __name__==<span class="string">"__main__"</span>:</span><br><span class="line"> ms=MySql(<span class="string">"root"</span>,<span class="string">"此处填写数据库密码"</span>,<span class="string">"demo1"</span>)</span><br><span class="line"> DatabaseConduct(ms)</span><br><span class="line"> Visual(ms)</span><br></pre></td></tr></table></figure><h2 id="实例"><a href="#实例" class="headerlink" title="实例"></a>实例</h2><p><img src="https://img-blog.csdnimg.cn/20200711235102117.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NTU2MTM1Nw==,size_16,color_FFFFFF,t_70" alt="在这里插入图片描述"><br><img src="https://img-blog.csdnimg.cn/20200711235129642.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NTU2MTM1Nw==,size_16,color_FFFFFF,t_70" alt="在这里插入图片描述"></p>]]></content>
<categories>
<category> python </category>
</categories>
<tags>
<tag> python </tag>
<tag> MySQL </tag>
</tags>
</entry>
<entry>
<title>基于C#实现卫星坐标计算与单点定位</title>
<link href="/2020/07/05/%E5%9F%BA%E4%BA%8EC%20sharp%E5%AE%9E%E7%8E%B0%E5%8D%AB%E6%98%9F%E5%9D%90%E6%A0%87%E8%AE%A1%E7%AE%97%E4%B8%8E%E5%8D%95%E7%82%B9%E5%AE%9A%E4%BD%8D/"/>
<url>/2020/07/05/%E5%9F%BA%E4%BA%8EC%20sharp%E5%AE%9E%E7%8E%B0%E5%8D%AB%E6%98%9F%E5%9D%90%E6%A0%87%E8%AE%A1%E7%AE%97%E4%B8%8E%E5%8D%95%E7%82%B9%E5%AE%9A%E4%BD%8D/</url>
<content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="\assets\css\APlayer.min.css"><script src="\assets\js\APlayer.min.js" class="aplayer-secondary-script-marker"></script><h1 id="性能需求"><a href="#性能需求" class="headerlink" title="性能需求"></a>性能需求</h1><p>(1)硬件需求:这一软件是开发在个人电脑上的,并且运行也需要在电脑上。其中为保证运行顺畅,CPU最好在i5以上或者AMD 锐龙5,内存最好在4G以上,显卡NVIDIA GeForce MX110即可,存储空间300M。</p><p>(2)软件需求:这一软件在Windows下面开发,开发环境是Visual Studio2017,开发语言是C#.NET。故运行也需要在Windows下进行,并且电脑安装有Visual Studio2013及以上版本,其中C#.NET的框架是.NET Framework 4.6.1。对于数据库要求,需要安装SQL sever2016及以上版本,确保数据库运行。</p><h1 id="功能需求"><a href="#功能需求" class="headerlink" title="功能需求"></a>功能需求</h1><p>日前,我国的北斗全球卫星定位系统已经完成全球组网。这标志着我国拥有了自己的卫星定位系统。如何利用卫星进行精确定位是一项重要课题。这一软件从卫星定位原理出发,简单地实现了通过卫星的星历数据,计算卫星坐标,通过单点定位的方法,求得地面待测点的三维坐标。<br><img src="https://img-blog.csdnimg.cn/20200702163529465.png" alt="在这里插入图片描述"><br>这一软件的功能如上图1-1所示,包括读取卫星的广播星历文件,通过星历计算卫星某一时刻的三维坐标,批量时刻点和多颗卫星计算,以及通过单点定位的方法实现对地面点进行三维坐标测算。</p><h1 id="功能模块设计"><a href="#功能模块设计" class="headerlink" title="功能模块设计"></a>功能模块设计</h1><h2 id="文件读取模块"><a href="#文件读取模块" class="headerlink" title="文件读取模块"></a>文件读取模块</h2><p>数据原始文件是从IGS官网(网址:<a href="http://garner.ucsd.edu/pub/nav/)下载得到的广播星历文件用来计算卫星坐标,从相关网站上(网址:http://garner.ucsd.edu/pub/misc/BatCaves/0001024c.06o)下载了单点定位要用的观测值文件。文件编码格式采用的是UTF-8的格式。故而直接编写读取文件的程序将其读进来,并把他们中用于计算的参数存入到卫星参数数据库中。在卫星参数数据库里,每一行代表某一个卫星在某时刻的各个参数。在参数分割中,需要处理广播星历的文件,如图2-2所示。其中“END">http://garner.ucsd.edu/pub/nav/)下载得到的广播星历文件用来计算卫星坐标,从相关网站上(网址:http://garner.ucsd.edu/pub/misc/BatCaves/0001024c.06o)下载了单点定位要用的观测值文件。文件编码格式采用的是UTF-8的格式。故而直接编写读取文件的程序将其读进来,并把他们中用于计算的参数存入到卫星参数数据库中。在卫星参数数据库里,每一行代表某一个卫星在某时刻的各个参数。在参数分割中,需要处理广播星历的文件,如图2-2所示。其中“END</a> OF HEADER”以上的信息是星历信息,在本题中不需要,故需要从“END OF HEADER”下面开始搜索有用信息。例如要求计算2008年5月14日02点0分00秒—20分00秒,每隔1分钟的PRN2的坐标的轨道坐标,只需提取第一列是2(卫星号),对应行是“08 5 14 2 0”(对应时间)即可。<br><img src="https://img-blog.csdnimg.cn/20200702164410299.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NTU2MTM1Nw==,size_16,color_FFFFFF,t_70" alt="在这里插入图片描述"></p><h2 id="卫星坐标计算模块"><a href="#卫星坐标计算模块" class="headerlink" title="卫星坐标计算模块"></a>卫星坐标计算模块</h2><p><img src="https://img-blog.csdnimg.cn/20200702164727134.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NTU2MTM1Nw==,size_16,color_FFFFFF,t_70" alt="在这里插入图片描述"><br><img src="https://img-blog.csdnimg.cn/20200702164622152.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NTU2MTM1Nw==,size_16,color_FFFFFF,t_70" alt="在这里插入图片描述"></p><h2 id="单点定位计算模块"><a href="#单点定位计算模块" class="headerlink" title="单点定位计算模块"></a>单点定位计算模块</h2><p><img src="https://img-blog.csdnimg.cn/20200702165244392.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NTU2MTM1Nw==,size_16,color_FFFFFF,t_70" alt="在这里插入图片描述"></p><h2 id="类设计"><a href="#类设计" class="headerlink" title="类设计"></a>类设计</h2><p><img src="https://img-blog.csdnimg.cn/20200702165611378.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NTU2MTM1Nw==,size_16,color_FFFFFF,t_70" alt="在这里插入图片描述"><br>对于这一程序,我设计了五个类,其中两个计算类,分别用于计算卫星坐标和单点定位坐标求解。三个数据库操作类,DataBase是基类,包含数据库的基本操作:查找、显示、删除、添加、修改等,派生出两个子类用于处理卫星坐标数据库和地面点坐标数据库。</p><h1 id="详细设计"><a href="#详细设计" class="headerlink" title="详细设计"></a>详细设计</h1><h2 id="文件读取模块设计"><a href="#文件读取模块设计" class="headerlink" title="文件读取模块设计"></a>文件读取模块设计</h2><p>对于文件读取,我大致在程序中分为了三个步骤:打开文件,切割字符串和将参数存入到数据库。<br>在打开文件中我使用了openfiledialog对话框,以便在提示下打开要用的文件,并将文件中的内容读入到字符串中。</p><figure class="highlight csharp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line">OpenFileDialog pdlg = <span class="keyword">new</span> OpenFileDialog();</span><br><span class="line">pdlg.Filter = <span class="string">"所有文件|*.*"</span>;</span><br><span class="line">DialogResult rt = pdlg.ShowDialog();</span><br><span class="line"><span class="keyword">if</span> (rt == DialogResult.OK)</span><br><span class="line">{</span><br><span class="line"> <span class="built_in">string</span> filename = pdlg.FileName;</span><br><span class="line"> info = File.ReadAllLines(filename);</span><br><span class="line">}</span><br></pre></td></tr></table></figure><p>在切割字符串过程中,根据2.1.1所介绍的规则进行分割,此处由于数据并不是严格以空格或者其他方式分隔,所以,我利用正则表达式将有用的数据提取出来。</p><figure class="highlight csharp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">for</span> (ii = <span class="number">0</span>; ii < row<span class="number">-1</span>; ii++)</span><br><span class="line">{</span><br><span class="line"> find = info[ii];</span><br><span class="line"> find = find.Trim();</span><br><span class="line"> <span class="keyword">if</span> (find == <span class="string">"END OF HEADER"</span>)</span><br><span class="line"> <span class="keyword">break</span>;</span><br><span class="line">}</span><br><span class="line"><span class="keyword">for</span>(ii=ii+<span class="number">1</span>;ii<row;ii=ii+<span class="number">8</span>)</span><br><span class="line">{</span><br><span class="line"> Canshu canshu;</span><br><span class="line"> <span class="built_in">int</span> i = ii;</span><br><span class="line"> <span class="built_in">string</span> iline =info[i];</span><br><span class="line"> Regex re = <span class="keyword">new</span> Regex(<span class="string">@"(\d+(\.\d+)?)"</span>);</span><br><span class="line"> MatchCollection iarray = re.Matches(iline);</span><br><span class="line"> <span class="built_in">double</span>[,] all = <span class="keyword">new</span> <span class="built_in">double</span>[<span class="number">7</span>, <span class="number">4</span>];</span><br><span class="line"> <span class="built_in">string</span>[] starray = <span class="keyword">new</span> <span class="built_in">string</span>[<span class="number">7</span>]; <span class="built_in">int</span> m = <span class="number">0</span>;</span><br><span class="line"> <span class="keyword">for</span> (<span class="built_in">int</span> k = i + <span class="number">1</span>; k < i + <span class="number">8</span>; k++, m++)</span><br><span class="line"> {</span><br><span class="line"> iline = info[k];</span><br><span class="line"> starray[m] = iline;</span><br><span class="line"> }</span><br><span class="line"> <span class="built_in">string</span> stallof = <span class="string">""</span>;</span><br><span class="line"> <span class="keyword">foreach</span> (<span class="built_in">string</span> strs <span class="keyword">in</span> starray)</span><br><span class="line"> {</span><br><span class="line"> stallof = stallof + strs;</span><br><span class="line"> }</span><br><span class="line"> Regex p = <span class="keyword">new</span> Regex(<span class="string">@"(-??\d?[.]\d{12}['D'][+-]\d\d)"</span>);</span><br><span class="line"> MatchCollection collection = p.Matches(stallof);</span><br><span class="line"> <span class="built_in">double</span>[] alls = <span class="keyword">new</span> <span class="built_in">double</span>[<span class="number">28</span>];</span><br><span class="line"> <span class="keyword">for</span> (<span class="built_in">int</span> n = <span class="number">0</span>; n < <span class="number">25</span>; n++)</span><br><span class="line"> {</span><br><span class="line"> <span class="built_in">string</span>[] temst = collection[n].Value.Split(<span class="string">'D'</span>);</span><br><span class="line"> alls[n] = <span class="built_in">double</span>.Parse(temst[<span class="number">0</span>]) * Math.Pow(<span class="number">10</span>, <span class="built_in">double</span>.Parse(temst[<span class="number">1</span>]));</span><br><span class="line"> }</span><br></pre></td></tr></table></figure><h2 id="卫星坐标计算模块设计"><a href="#卫星坐标计算模块设计" class="headerlink" title="卫星坐标计算模块设计"></a>卫星坐标计算模块设计</h2><p>对于卫星坐标计算,我设计了一个计算类,通过有参数的构造函数把对应的卫星序号和时间传进来进行计算。计算中我分为了两类:一类是根据星历可以直接求得的卫星坐标,这种坐标是精度比较高的;一类是需要根据星历求得临近时刻的卫星坐标,这种坐标精度低一些。这两类首先都需要先把输入的时间转换为对应的GPS周秒形式。</p><p>对于第一类卫星,直接通过从卫星参数数据库找到相应值,根据2.1.2介绍的原理,计算卫星三维坐标。</p><p>对于第二类卫星坐标的求解,我们需要先判断这一卫星距离哪一个通过星历计算出的位置近,并取这一星历数据作为起算数据,后续过程与第一类大致相同。</p><h2 id="数据库模块设计"><a href="#数据库模块设计" class="headerlink" title="数据库模块设计"></a>数据库模块设计</h2><p>在数据库设计中,我利用类的继承与重写等面向对象的机制,设计了一个父类,两个子类,实现对卫星参数数据库、卫星坐标数据库和地面坐标数据库的管理。在数据库的类中,利用构造函数连接数据库,这样只要调用时就可以自动连接。</p><p>对于查找操作,通过连接数据库,向SQL中传入查询语句,并将返回值保存到DataSet类型中,最后通过窗体台中的DataGridView控件显示查找值。</p><h2 id="单点定位计算模块设计"><a href="#单点定位计算模块设计" class="headerlink" title="单点定位计算模块设计"></a>单点定位计算模块设计</h2><p>对于单点定位的程序设计,大致根据2.1.3介绍的数学模型进行设计。首先先判断卫星数与4比的大小。如果大于4,则需要用最小二乘求解改正值;如果等于4,则利用线性方程直接求解;如果小于4,则无法计算。过程中需要矩阵的运算,在这里我运用了之前写过的矩阵运算类解决求逆,转置等问题。</p><h2 id="界面设计"><a href="#界面设计" class="headerlink" title="界面设计"></a>界面设计</h2><p><img src="https://img-blog.csdnimg.cn/2020070217564161.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NTU2MTM1Nw==,size_16,color_FFFFFF,t_70" alt="在这里插入图片描述"><br>对于这一程序,我选择了如图3-1所示的单文档界面,通过tabControl控件,把“查看修改卫星参数”、“卫星坐标计算与查看”、“单点定位”分隔开,让每一个成单独的部分。在每一部分中,使用splitContainer把页面隔成输入输出两个模块,其中,由于在第一部分的输入类型有多种,故使用GroupBox控件分组管理。这一界面设计方式能够减少文件窗口,操作简单,而且可读性可观性较好。</p><p>首先是标签栏设计。如图所示,通过“文件->打开”,可以实现打开文件操作。通过“文件->分割字符串”可以实现分割字符串,从文件内容中提取有用的参数,并存入到内存中。通过“文件->参数装入数据库”可实现把内存中的参数集合存入到卫星参数数据库中,方便之后的步骤使用。通过“文件->保存为文本文档”可以实现把卫星坐标的内容存为文本文件,方便之后精度对比。</p><p>对于第一页,都涉及通过界面输入向内部传值,此过程涉及到字符串分割,尤其是使用dateTimePicker控件中的值,先需要通过ToShortDateString和ToLongTimeString把时间转换成字符串格式,通过字符串切割取出时间参数。在修改模块中,运用comBox控件,实现让用户通过下拉列表选择修改的属性。<br><img src="https://img-blog.csdnimg.cn/20200702175929103.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NTU2MTM1Nw==,size_16,color_FFFFFF,t_70" alt="在这里插入图片描述"></p><p><img src="https://img-blog.csdnimg.cn/20200702175958864.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NTU2MTM1Nw==,size_16,color_FFFFFF,t_70" alt="在这里插入图片描述"><br>对于第二页卫星坐标计算与查看,如图3-3和3-4所示,利用radioButton控件选择计算类型,从而选择对应的函数进行调用。在这一过程中,为了增强程序的健壮性,提升容错能力,当用户没有勾选计算类型的时候,会弹出如图3-5的输入警示图;当用户有一些必要参数没有输入的时候,会弹出如图3-6的警示图。在计算完成后,结果会显示在下方的DataGridView控件中,其中多卫星多时刻计算时,输出的结果是每隔一分钟输出一个卫星坐标。</p><p>对于第三页,如图3-6所示,通过DateTimePick控件实现选择观测的日期和时间,并通过textbox输入近似值的坐标,即可通过调用计算类方法计算出该地面点的三维坐标,最终将结果输入到地面点数据库和DataGridView控件中。</p><h1 id="调试分析与测试结果"><a href="#调试分析与测试结果" class="headerlink" title="调试分析与测试结果"></a>调试分析与测试结果</h1><h2 id="文件读取功能模块调试分析"><a href="#文件读取功能模块调试分析" class="headerlink" title="文件读取功能模块调试分析"></a>文件读取功能模块调试分析</h2><p>本程序读取的文件是卫星的广播星历,文件编码格式是“utf-8”,文件的后缀是.XXn,其中XX代表年份,n表示广播星历,例如本测试数据文件后缀是:.08n代表是2008年的广播星历数据。这一数据来源是从IGS网站下载得来。<br><img src="https://img-blog.csdnimg.cn/20200702210947748.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NTU2MTM1Nw==,size_16,color_FFFFFF,t_70" alt="在这里插入图片描述"><br>在切割字符串后弹出如图4-1所示的提示框,说明切割成功。如图4-2所示是参数装入SQL sever中的显示,由此可知,数据入库成功。<br><img src="https://img-blog.csdnimg.cn/20200702211021252.png" alt="在这里插入图片描述"></p><h2 id="卫星坐标计算模块调试分析"><a href="#卫星坐标计算模块调试分析" class="headerlink" title="卫星坐标计算模块调试分析"></a>卫星坐标计算模块调试分析</h2><p><img src="https://img-blog.csdnimg.cn/20200702211342665.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NTU2MTM1Nw==,size_16,color_FFFFFF,t_70" alt="在这里插入图片描述"><br>如图4-3是对星历文件中包含的卫星指定时刻的卫星坐标计算。我们可以通过直接把结果与精密星历对比。拿2008年5月14日2时0分0秒做对比,结果如表4-1。<br><img src="https://img-blog.csdnimg.cn/20200702211425499.png" alt="在这里插入图片描述"><br>如表4-1所示,我们可以看到通过广播星历计算得到的坐标值与精密星历之间的误差在米级,符合精度的要求,所以本程序测试通过。</p><p>批量时刻点和多颗卫星计算。我们可以利用之前的精密星历与各个计算结果进行比较绘制出如图4-5所示的误差图。<br><img src="https://img-blog.csdnimg.cn/20200702212738796.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NTU2MTM1Nw==,size_16,color_FFFFFF,t_70" alt="在这里插入图片描述"><br>我利用python语言,把通过精密星历得到的坐标作为标准坐标,与通过广播星历得到的坐标做中误差计算。并分别绘制了两颗卫星,不同时刻的点位中误差图,我们发现,其误差在米级,符合规定要求,因此测试通过。</p><h2 id="数据库模块调试分析"><a href="#数据库模块调试分析" class="headerlink" title="数据库模块调试分析"></a>数据库模块调试分析</h2><p>查看功能:在输入框内输入测试值,查询结果如图4-6所示。可以看到我们可以显示出这一条信息的数值。<br><img src="https://img-blog.csdnimg.cn/20200702213531355.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NTU2MTM1Nw==,size_16,color_FFFFFF,t_70" alt="在这里插入图片描述"><br>修改功能:在输入框内输入修改的地方,选择修改的属性,输入修改后的值,修改结果如图4-7所示,我们可以看到这一条信息的“crs”值已被修改。<br><img src="https://img-blog.csdnimg.cn/20200702213555549.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NTU2MTM1Nw==,size_16,color_FFFFFF,t_70" alt="在这里插入图片描述"><br>删除功能:在输入框内输入删除的地方,删除结果如图4-7所示,我们可以看到,当再次执行查看操作时,删除的那一条信息已经没有了,由此删除成功。<br><img src="https://img-blog.csdnimg.cn/20200702213630403.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NTU2MTM1Nw==,size_16,color_FFFFFF,t_70" alt="在这里插入图片描述"></p><h1 id="操作使用说明"><a href="#操作使用说明" class="headerlink" title="操作使用说明"></a>操作使用说明</h1><p>在第一次处理某一星历的时候,需要首先打开文件(文件->打开),接着切割字符串(文件->分割字符串),等到弹出“OK”对话框后,再把参数存入数据库(文件->参数装入数据库)。这时,我们可以点击“查看”按钮浏览一下分割后的结果。</p><p>这一程序有三个板块。第一个板块是对已经得到的卫星参数数据库做查看,修改,删除操作。实现灵活处理数据库的功能。<br><img src="https://img-blog.csdnimg.cn/20200702215240172.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NTU2MTM1Nw==,size_16,color_FFFFFF,t_70" alt="在这里插入图片描述"><br>单击“卫星坐标计算与查看”进入第二板块,可以点击单卫星计算,输入卫星序号和时间,可以直接计算并显示出该点的三维坐标,并存入到数据库中,作为计算日志。如图5-2 单卫星计算图。当点击多卫星多时刻计算时,在卫星序号输入栏里输入卫星号,并用逗号隔开,在时间栏里输入起止时间,点击计算,将会输出每隔一分钟的卫星坐标,如图5-3 多卫星多时刻计算图。在计算完成后还可以通过“文件->保存为文本文档”将计算查询结果保存为文本文件,这实现了数据文件存储和数据库存储双重存储。</p><p>最后,点击“单点定位”进入第三板块,如图5-4 单点定位窗口图,通过选择日期和时间,输入测站的近似坐标,单击单点定位,即可通过搜索可用的卫星星历,计算可视的卫星坐标,进而得到地面点坐标,最终保存并显示到下方表格中。</p><h1 id="代码"><a href="#代码" class="headerlink" title="代码"></a>代码</h1><h2 id="类代码"><a href="#类代码" class="headerlink" title="类代码"></a>类代码</h2><figure class="highlight csharp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br><span class="line">112</span><br><span class="line">113</span><br><span class="line">114</span><br><span class="line">115</span><br><span class="line">116</span><br><span class="line">117</span><br><span class="line">118</span><br><span class="line">119</span><br><span class="line">120</span><br><span class="line">121</span><br><span class="line">122</span><br><span class="line">123</span><br><span class="line">124</span><br><span class="line">125</span><br><span class="line">126</span><br><span class="line">127</span><br><span class="line">128</span><br><span class="line">129</span><br><span class="line">130</span><br><span class="line">131</span><br><span class="line">132</span><br><span class="line">133</span><br><span class="line">134</span><br><span class="line">135</span><br><span class="line">136</span><br><span class="line">137</span><br><span class="line">138</span><br><span class="line">139</span><br><span class="line">140</span><br><span class="line">141</span><br><span class="line">142</span><br><span class="line">143</span><br><span class="line">144</span><br><span class="line">145</span><br><span class="line">146</span><br><span class="line">147</span><br><span class="line">148</span><br><span class="line">149</span><br><span class="line">150</span><br><span class="line">151</span><br><span class="line">152</span><br><span class="line">153</span><br><span class="line">154</span><br><span class="line">155</span><br><span class="line">156</span><br><span class="line">157</span><br><span class="line">158</span><br><span class="line">159</span><br><span class="line">160</span><br><span class="line">161</span><br><span class="line">162</span><br><span class="line">163</span><br><span class="line">164</span><br><span class="line">165</span><br><span class="line">166</span><br><span class="line">167</span><br><span class="line">168</span><br><span class="line">169</span><br><span class="line">170</span><br><span class="line">171</span><br><span class="line">172</span><br><span class="line">173</span><br><span class="line">174</span><br><span class="line">175</span><br><span class="line">176</span><br><span class="line">177</span><br><span class="line">178</span><br><span class="line">179</span><br><span class="line">180</span><br><span class="line">181</span><br><span class="line">182</span><br><span class="line">183</span><br><span class="line">184</span><br><span class="line">185</span><br><span class="line">186</span><br><span class="line">187</span><br><span class="line">188</span><br><span class="line">189</span><br><span class="line">190</span><br><span class="line">191</span><br><span class="line">192</span><br><span class="line">193</span><br><span class="line">194</span><br><span class="line">195</span><br><span class="line">196</span><br><span class="line">197</span><br><span class="line">198</span><br><span class="line">199</span><br><span class="line">200</span><br><span class="line">201</span><br><span class="line">202</span><br><span class="line">203</span><br><span class="line">204</span><br><span class="line">205</span><br><span class="line">206</span><br><span class="line">207</span><br><span class="line">208</span><br><span class="line">209</span><br><span class="line">210</span><br><span class="line">211</span><br><span class="line">212</span><br><span class="line">213</span><br><span class="line">214</span><br><span class="line">215</span><br><span class="line">216</span><br><span class="line">217</span><br><span class="line">218</span><br><span class="line">219</span><br><span class="line">220</span><br><span class="line">221</span><br><span class="line">222</span><br><span class="line">223</span><br><span class="line">224</span><br><span class="line">225</span><br><span class="line">226</span><br><span class="line">227</span><br><span class="line">228</span><br><span class="line">229</span><br><span class="line">230</span><br><span class="line">231</span><br><span class="line">232</span><br><span class="line">233</span><br><span class="line">234</span><br><span class="line">235</span><br><span class="line">236</span><br><span class="line">237</span><br><span class="line">238</span><br><span class="line">239</span><br><span class="line">240</span><br><span class="line">241</span><br><span class="line">242</span><br><span class="line">243</span><br><span class="line">244</span><br><span class="line">245</span><br><span class="line">246</span><br><span class="line">247</span><br><span class="line">248</span><br><span class="line">249</span><br><span class="line">250</span><br><span class="line">251</span><br><span class="line">252</span><br><span class="line">253</span><br><span class="line">254</span><br><span class="line">255</span><br><span class="line">256</span><br><span class="line">257</span><br><span class="line">258</span><br><span class="line">259</span><br><span class="line">260</span><br><span class="line">261</span><br><span class="line">262</span><br><span class="line">263</span><br><span class="line">264</span><br><span class="line">265</span><br><span class="line">266</span><br><span class="line">267</span><br><span class="line">268</span><br><span class="line">269</span><br><span class="line">270</span><br><span class="line">271</span><br><span class="line">272</span><br><span class="line">273</span><br><span class="line">274</span><br><span class="line">275</span><br><span class="line">276</span><br><span class="line">277</span><br><span class="line">278</span><br><span class="line">279</span><br><span class="line">280</span><br><span class="line">281</span><br><span class="line">282</span><br><span class="line">283</span><br><span class="line">284</span><br><span class="line">285</span><br><span class="line">286</span><br><span class="line">287</span><br><span class="line">288</span><br><span class="line">289</span><br><span class="line">290</span><br><span class="line">291</span><br><span class="line">292</span><br><span class="line">293</span><br><span class="line">294</span><br><span class="line">295</span><br><span class="line">296</span><br><span class="line">297</span><br><span class="line">298</span><br><span class="line">299</span><br><span class="line">300</span><br><span class="line">301</span><br><span class="line">302</span><br><span class="line">303</span><br><span class="line">304</span><br><span class="line">305</span><br><span class="line">306</span><br><span class="line">307</span><br><span class="line">308</span><br><span class="line">309</span><br><span class="line">310</span><br><span class="line">311</span><br><span class="line">312</span><br><span class="line">313</span><br><span class="line">314</span><br><span class="line">315</span><br><span class="line">316</span><br><span class="line">317</span><br><span class="line">318</span><br><span class="line">319</span><br><span class="line">320</span><br><span class="line">321</span><br><span class="line">322</span><br><span class="line">323</span><br><span class="line">324</span><br><span class="line">325</span><br><span class="line">326</span><br><span class="line">327</span><br><span class="line">328</span><br><span class="line">329</span><br><span class="line">330</span><br><span class="line">331</span><br><span class="line">332</span><br><span class="line">333</span><br><span class="line">334</span><br><span class="line">335</span><br><span class="line">336</span><br><span class="line">337</span><br><span class="line">338</span><br><span class="line">339</span><br><span class="line">340</span><br><span class="line">341</span><br><span class="line">342</span><br><span class="line">343</span><br><span class="line">344</span><br><span class="line">345</span><br><span class="line">346</span><br><span class="line">347</span><br><span class="line">348</span><br><span class="line">349</span><br><span class="line">350</span><br><span class="line">351</span><br><span class="line">352</span><br><span class="line">353</span><br><span class="line">354</span><br><span class="line">355</span><br><span class="line">356</span><br><span class="line">357</span><br><span class="line">358</span><br><span class="line">359</span><br><span class="line">360</span><br><span class="line">361</span><br><span class="line">362</span><br><span class="line">363</span><br><span class="line">364</span><br><span class="line">365</span><br><span class="line">366</span><br><span class="line">367</span><br><span class="line">368</span><br><span class="line">369</span><br><span class="line">370</span><br><span class="line">371</span><br><span class="line">372</span><br><span class="line">373</span><br><span class="line">374</span><br><span class="line">375</span><br><span class="line">376</span><br><span class="line">377</span><br><span class="line">378</span><br><span class="line">379</span><br><span class="line">380</span><br><span class="line">381</span><br><span class="line">382</span><br><span class="line">383</span><br><span class="line">384</span><br><span class="line">385</span><br><span class="line">386</span><br><span class="line">387</span><br><span class="line">388</span><br><span class="line">389</span><br><span class="line">390</span><br><span class="line">391</span><br><span class="line">392</span><br><span class="line">393</span><br><span class="line">394</span><br><span class="line">395</span><br><span class="line">396</span><br><span class="line">397</span><br><span class="line">398</span><br><span class="line">399</span><br><span class="line">400</span><br><span class="line">401</span><br><span class="line">402</span><br><span class="line">403</span><br><span class="line">404</span><br><span class="line">405</span><br><span class="line">406</span><br><span class="line">407</span><br><span class="line">408</span><br><span class="line">409</span><br><span class="line">410</span><br><span class="line">411</span><br><span class="line">412</span><br><span class="line">413</span><br><span class="line">414</span><br><span class="line">415</span><br><span class="line">416</span><br><span class="line">417</span><br><span class="line">418</span><br><span class="line">419</span><br><span class="line">420</span><br><span class="line">421</span><br><span class="line">422</span><br><span class="line">423</span><br><span class="line">424</span><br><span class="line">425</span><br><span class="line">426</span><br><span class="line">427</span><br><span class="line">428</span><br><span class="line">429</span><br><span class="line">430</span><br><span class="line">431</span><br><span class="line">432</span><br><span class="line">433</span><br><span class="line">434</span><br><span class="line">435</span><br><span class="line">436</span><br><span class="line">437</span><br><span class="line">438</span><br><span class="line">439</span><br><span class="line">440</span><br><span class="line">441</span><br><span class="line">442</span><br><span class="line">443</span><br><span class="line">444</span><br><span class="line">445</span><br><span class="line">446</span><br><span class="line">447</span><br><span class="line">448</span><br><span class="line">449</span><br><span class="line">450</span><br><span class="line">451</span><br><span class="line">452</span><br><span class="line">453</span><br><span class="line">454</span><br><span class="line">455</span><br><span class="line">456</span><br><span class="line">457</span><br><span class="line">458</span><br><span class="line">459</span><br><span class="line">460</span><br><span class="line">461</span><br><span class="line">462</span><br><span class="line">463</span><br><span class="line">464</span><br><span class="line">465</span><br><span class="line">466</span><br><span class="line">467</span><br><span class="line">468</span><br><span class="line">469</span><br><span class="line">470</span><br><span class="line">471</span><br><span class="line">472</span><br><span class="line">473</span><br><span class="line">474</span><br><span class="line">475</span><br><span class="line">476</span><br><span class="line">477</span><br><span class="line">478</span><br><span class="line">479</span><br><span class="line">480</span><br><span class="line">481</span><br><span class="line">482</span><br><span class="line">483</span><br><span class="line">484</span><br><span class="line">485</span><br><span class="line">486</span><br><span class="line">487</span><br><span class="line">488</span><br><span class="line">489</span><br><span class="line">490</span><br><span class="line">491</span><br><span class="line">492</span><br><span class="line">493</span><br><span class="line">494</span><br><span class="line">495</span><br><span class="line">496</span><br><span class="line">497</span><br><span class="line">498</span><br><span class="line">499</span><br><span class="line">500</span><br><span class="line">501</span><br><span class="line">502</span><br><span class="line">503</span><br><span class="line">504</span><br><span class="line">505</span><br><span class="line">506</span><br><span class="line">507</span><br><span class="line">508</span><br><span class="line">509</span><br><span class="line">510</span><br><span class="line">511</span><br><span class="line">512</span><br><span class="line">513</span><br><span class="line">514</span><br><span class="line">515</span><br><span class="line">516</span><br><span class="line">517</span><br><span class="line">518</span><br><span class="line">519</span><br><span class="line">520</span><br><span class="line">521</span><br><span class="line">522</span><br><span class="line">523</span><br><span class="line">524</span><br><span class="line">525</span><br><span class="line">526</span><br><span class="line">527</span><br><span class="line">528</span><br><span class="line">529</span><br><span class="line">530</span><br><span class="line">531</span><br><span class="line">532</span><br><span class="line">533</span><br><span class="line">534</span><br><span class="line">535</span><br><span class="line">536</span><br><span class="line">537</span><br><span class="line">538</span><br><span class="line">539</span><br><span class="line">540</span><br><span class="line">541</span><br><span class="line">542</span><br><span class="line">543</span><br><span class="line">544</span><br><span class="line">545</span><br><span class="line">546</span><br><span class="line">547</span><br><span class="line">548</span><br><span class="line">549</span><br><span class="line">550</span><br><span class="line">551</span><br><span class="line">552</span><br><span class="line">553</span><br><span class="line">554</span><br><span class="line">555</span><br><span class="line">556</span><br><span class="line">557</span><br><span class="line">558</span><br><span class="line">559</span><br><span class="line">560</span><br><span class="line">561</span><br><span class="line">562</span><br><span class="line">563</span><br><span class="line">564</span><br><span class="line">565</span><br><span class="line">566</span><br><span class="line">567</span><br><span class="line">568</span><br><span class="line">569</span><br><span class="line">570</span><br><span class="line">571</span><br><span class="line">572</span><br><span class="line">573</span><br><span class="line">574</span><br><span class="line">575</span><br><span class="line">576</span><br><span class="line">577</span><br><span class="line">578</span><br><span class="line">579</span><br><span class="line">580</span><br><span class="line">581</span><br><span class="line">582</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">using</span> System;</span><br><span class="line"><span class="keyword">using</span> System.Collections.Generic;</span><br><span class="line"><span class="keyword">using</span> System.Linq;</span><br><span class="line"><span class="keyword">using</span> System.Text;</span><br><span class="line"><span class="keyword">using</span> System.Threading.Tasks;</span><br><span class="line"><span class="keyword">using</span> System.Data.SqlClient;</span><br><span class="line"><span class="keyword">using</span> System.Data;</span><br><span class="line"><span class="keyword">using</span> MathNet.Numerics.LinearAlgebra.Double;</span><br><span class="line"><span class="keyword">using</span> MathNet.Numerics.LinearAlgebra;</span><br><span class="line"><span class="keyword">namespace</span> <span class="title">GPS</span>卫星坐标与单点定位计算</span><br><span class="line">{</span><br><span class="line"> <span class="comment"><span class="doctag">///</span> <span class="doctag"><summary></span></span></span><br><span class="line"> <span class="comment"><span class="doctag">///</span> 卫星参数结构</span></span><br><span class="line"> <span class="comment"><span class="doctag">///</span> <span class="doctag"></summary></span></span></span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">struct</span> Canshu</span><br><span class="line"> {</span><br><span class="line"> <span class="keyword">public</span> <span class="built_in">double</span> a, dn, to, mo, e, omega, gpsweek;</span><br><span class="line"> <span class="keyword">public</span> <span class="built_in">double</span> cuc, cus, crc, crs, cic, cis, idot, io, OMEGA, OMEGA_DOT;</span><br><span class="line"> <span class="keyword">public</span> <span class="built_in">int</span> prn, year, month, day, hour, minute;</span><br><span class="line"> <span class="keyword">public</span> <span class="built_in">double</span> second;</span><br><span class="line"> }</span><br><span class="line"> <span class="comment"><span class="doctag">///</span> <span class="doctag"><summary></span></span></span><br><span class="line"> <span class="comment"><span class="doctag">///</span> 单纯三维坐标结构</span></span><br><span class="line"> <span class="comment"><span class="doctag">///</span> <span class="doctag"></summary></span></span></span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">struct</span> XYZ</span><br><span class="line"> {</span><br><span class="line"> <span class="keyword">public</span> <span class="built_in">double</span> X, Y, Z;</span><br><span class="line"> }</span><br><span class="line"> <span class="comment"><span class="doctag">///</span> <span class="doctag"><summary></span></span></span><br><span class="line"> <span class="comment"><span class="doctag">///</span> 专门往卫星坐标数据库插入数据的结构</span></span><br><span class="line"> <span class="comment"><span class="doctag">///</span> <span class="doctag"></summary></span></span></span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">struct</span> Inputdata</span><br><span class="line"> {</span><br><span class="line"> <span class="keyword">public</span> <span class="built_in">double</span> second, X, Y, Z;</span><br><span class="line"> <span class="keyword">public</span> <span class="built_in">int</span> prn, year, month, day, hour, minute;</span><br><span class="line"> }</span><br><span class="line"> <span class="comment"><span class="doctag">///</span> <span class="doctag"><summary></span></span></span><br><span class="line"> <span class="comment"><span class="doctag">///</span> 卫星坐标计算类</span></span><br><span class="line"> <span class="comment"><span class="doctag">///</span> <span class="doctag"></summary></span></span></span><br><span class="line"> <span class="keyword">class</span> <span class="title">SatelliteCoordinate</span></span><br><span class="line"> {</span><br><span class="line"> <span class="built_in">int</span> year, month, day, hour, minute;</span><br><span class="line"> <span class="built_in">double</span> second;</span><br><span class="line"> <span class="comment"><span class="doctag">///</span> <span class="doctag"><summary></span></span></span><br><span class="line"> <span class="comment"><span class="doctag">///</span> 构造函数(有参数)</span></span><br><span class="line"> <span class="comment"><span class="doctag">///</span> <span class="doctag"></summary></span></span></span><br><span class="line"> <span class="comment"><span class="doctag">///</span> <span class="doctag"><param name="year"></span><span class="doctag"></param></span></span></span><br><span class="line"> <span class="comment"><span class="doctag">///</span> <span class="doctag"><param name="month"></span><span class="doctag"></param></span></span></span><br><span class="line"> <span class="comment"><span class="doctag">///</span> <span class="doctag"><param name="day"></span><span class="doctag"></param></span></span></span><br><span class="line"> <span class="comment"><span class="doctag">///</span> <span class="doctag"><param name="hour"></span><span class="doctag"></param></span></span></span><br><span class="line"> <span class="comment"><span class="doctag">///</span> <span class="doctag"><param name="minute"></span><span class="doctag"></param></span></span></span><br><span class="line"> <span class="comment"><span class="doctag">///</span> <span class="doctag"><param name="second"></span><span class="doctag"></param></span></span></span><br><span class="line"> <span class="function"><span class="keyword">public</span> <span class="title">SatelliteCoordinate</span>(<span class="params"><span class="built_in">int</span> year, <span class="built_in">int</span> month, <span class="built_in">int</span> day, <span class="built_in">int</span> hour, <span class="built_in">int</span> minute, <span class="built_in">double</span> second</span>)</span></span><br><span class="line"> {</span><br><span class="line"> <span class="keyword">this</span>.year = year;</span><br><span class="line"> <span class="keyword">this</span>.month = month;</span><br><span class="line"> <span class="keyword">this</span>.day = day;</span><br><span class="line"> <span class="keyword">this</span>.hour = hour;</span><br><span class="line"> <span class="keyword">this</span>.minute = minute;</span><br><span class="line"> <span class="keyword">this</span>.second = second;</span><br><span class="line"> }</span><br><span class="line"> <span class="comment"><span class="doctag">///</span> <span class="doctag"><summary></span></span></span><br><span class="line"> <span class="comment"><span class="doctag">///</span> 计算GPS周秒</span></span><br><span class="line"> <span class="comment"><span class="doctag">///</span> <span class="doctag"></summary></span></span></span><br><span class="line"> <span class="comment"><span class="doctag">///</span> <span class="doctag"><param name="weekno"></span><span class="doctag"></param></span></span></span><br><span class="line"> <span class="comment"><span class="doctag">///</span> <span class="doctag"><param name="gpstime"></span><span class="doctag"></param></span></span></span><br><span class="line"> <span class="comment"><span class="doctag">///</span> <span class="doctag"><returns></span><span class="doctag"></returns></span></span></span><br><span class="line"> <span class="function"><span class="keyword">private</span> <span class="built_in">int</span> <span class="title">GetGPSTime</span>(<span class="params"> <span class="keyword">ref</span> <span class="built_in">int</span> weekno, <span class="keyword">ref</span> <span class="built_in">double</span> gpstime</span>)</span></span><br><span class="line"> {</span><br><span class="line"> <span class="built_in">int</span> dayofw, dayofy, yr, ttlday, m;</span><br><span class="line"> <span class="built_in">int</span>[] dinmth = <span class="keyword">new</span> <span class="built_in">int</span>[<span class="number">13</span>];</span><br><span class="line"> dinmth[<span class="number">1</span>] = <span class="number">31</span>; dinmth[<span class="number">2</span>] = <span class="number">28</span>; dinmth[<span class="number">3</span>] = <span class="number">31</span>;</span><br><span class="line"> dinmth[<span class="number">4</span>] = <span class="number">30</span>; dinmth[<span class="number">5</span>] = <span class="number">31</span>; dinmth[<span class="number">6</span>] = <span class="number">30</span>;</span><br><span class="line"> dinmth[<span class="number">7</span>] = <span class="number">31</span>; dinmth[<span class="number">8</span>] = <span class="number">31</span>; dinmth[<span class="number">9</span>] = <span class="number">30</span>;</span><br><span class="line"> dinmth[<span class="number">10</span>] = <span class="number">31</span>; dinmth[<span class="number">11</span>] = <span class="number">30</span>; dinmth[<span class="number">12</span>] = <span class="number">31</span>;</span><br><span class="line"> <span class="keyword">if</span> (year > <span class="number">80</span>) year = year + <span class="number">1900</span>;</span><br><span class="line"> <span class="keyword">if</span> (year < <span class="number">80</span>) year = year + <span class="number">2000</span>;</span><br><span class="line"> <span class="keyword">if</span> (year < <span class="number">1981</span> || month < <span class="number">1</span> || month > <span class="number">12</span> || day < <span class="number">1</span> || day > <span class="number">31</span>)</span><br><span class="line"> weekno = <span class="number">0</span>;</span><br><span class="line"> <span class="keyword">if</span> (month == <span class="number">1</span>)</span><br><span class="line"> dayofy = day;</span><br><span class="line"> <span class="keyword">else</span></span><br><span class="line"> {</span><br><span class="line"> dayofy = <span class="number">0</span>;</span><br><span class="line"> <span class="keyword">for</span> (m = <span class="number">1</span>; m <= (month - <span class="number">1</span>); m++)</span><br><span class="line"> {</span><br><span class="line"> dayofy += dinmth[m];</span><br><span class="line"> <span class="keyword">if</span> (m == <span class="number">2</span>)</span><br><span class="line"> {</span><br><span class="line"> <span class="keyword">if</span> (year % <span class="number">4</span> == <span class="number">0</span> && year % <span class="number">100</span> != <span class="number">0</span> || year % <span class="number">400</span> == <span class="number">0</span>)</span><br><span class="line"> dayofy += <span class="number">1</span>;</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> dayofy += day;</span><br><span class="line"> }</span><br><span class="line"> ttlday = <span class="number">360</span>;</span><br><span class="line"> <span class="keyword">for</span> (yr = <span class="number">1981</span>; yr <= (year - <span class="number">1</span>); yr++)</span><br><span class="line"> {</span><br><span class="line"> ttlday += <span class="number">365</span>;</span><br><span class="line"> <span class="keyword">if</span> (yr % <span class="number">4</span> == <span class="number">0</span> && yr % <span class="number">100</span> != <span class="number">0</span> || yr % <span class="number">400</span> == <span class="number">0</span>)</span><br><span class="line"> ttlday += <span class="number">1</span>;</span><br><span class="line"> }</span><br><span class="line"> ttlday += dayofy;</span><br><span class="line"> weekno = ttlday / <span class="number">7</span>;</span><br><span class="line"> dayofw = ttlday - <span class="number">7</span> * (weekno);</span><br><span class="line"> gpstime = (<span class="built_in">double</span>)(hour * <span class="number">3600</span> + minute * <span class="number">60</span> + second + dayofw * <span class="number">86400</span>);</span><br><span class="line"> <span class="keyword">return</span> yr;</span><br><span class="line"> }</span><br><span class="line"> <span class="comment"><span class="doctag">///</span> <span class="doctag"><summary></span></span></span><br><span class="line"> <span class="comment"><span class="doctag">///</span> 计算最终坐标</span></span><br><span class="line"> <span class="comment"><span class="doctag">///</span> <span class="doctag"></summary></span></span></span><br><span class="line"> <span class="comment"><span class="doctag">///</span> <span class="doctag"><param name="canshu"></span><span class="doctag"></param></span></span></span><br><span class="line"> <span class="comment"><span class="doctag">///</span> <span class="doctag"><returns></span><span class="doctag"></returns></span></span></span><br><span class="line"> <span class="function"><span class="keyword">private</span> XYZ <span class="title">caculate</span>(<span class="params">Canshu canshu</span>)</span></span><br><span class="line"> {</span><br><span class="line"> <span class="built_in">int</span> weekno=<span class="number">0</span>;<span class="built_in">double</span> gpst=<span class="number">0.0</span>;</span><br><span class="line"> GetGPSTime(<span class="keyword">ref</span> weekno, <span class="keyword">ref</span> gpst);</span><br><span class="line"></span><br><span class="line"> <span class="built_in">double</span> gm = <span class="number">3.978655e+14</span>;</span><br><span class="line"> <span class="built_in">double</span> ve = <span class="number">7.2921151467e-5</span>;</span><br><span class="line"> XYZ xyz; xyz.X = xyz.Y = xyz.Z = <span class="number">0</span>;</span><br><span class="line"> </span><br><span class="line"> <span class="built_in">double</span> n = Math.Sqrt(gm / Math.Pow(canshu.a, <span class="number">3</span>)) + canshu.dn;</span><br><span class="line"> <span class="built_in">double</span> tk = gpst - canshu.to;</span><br><span class="line"> <span class="built_in">double</span> mk = canshu.mo + n * tk;</span><br><span class="line"> <span class="comment">//迭代求ek</span></span><br><span class="line"> <span class="built_in">double</span> ek0 = canshu.mo; <span class="built_in">double</span> ek1 = <span class="number">0.0</span>;</span><br><span class="line"> <span class="keyword">while</span> (Math.Abs(ek0 - ek1) > <span class="number">0.0000000001</span>)</span><br><span class="line"> {</span><br><span class="line"> ek1 = ek0;</span><br><span class="line"> ek0 = canshu.mo + canshu.e * Math.Sin(ek0);</span><br><span class="line"> <span class="comment">//ek0 = ek1;</span></span><br><span class="line"> }</span><br><span class="line"> <span class="built_in">double</span> vk = Math.Atan(Math.Sqrt(<span class="number">1</span> - canshu.e * canshu.e) * Math.Sin(ek1) / (Math.Cos(ek1) - canshu.e));</span><br><span class="line"> <span class="comment">//richTextBox2.Text += vk.ToString();</span></span><br><span class="line"></span><br><span class="line"> <span class="built_in">double</span> fei = vk + canshu.omega;</span><br><span class="line"></span><br><span class="line"> <span class="built_in">double</span> rk = canshu.a * (<span class="number">1</span> - canshu.e * Math.Cos(ek1));</span><br><span class="line"></span><br><span class="line"> <span class="comment">//扰动改正</span></span><br><span class="line"> <span class="built_in">double</span> stu = canshu.cuc * Math.Cos(<span class="number">2</span> * fei) + canshu.cus * Math.Sin(<span class="number">2</span> * fei);</span><br><span class="line"> <span class="built_in">double</span> str = canshu.crc * Math.Cos(<span class="number">2</span> * fei) + canshu.crs * Math.Sin(<span class="number">2</span> * fei);</span><br><span class="line"> <span class="built_in">double</span> sti = canshu.cic * Math.Cos(<span class="number">2</span> * fei) + canshu.cis * Math.Sin(<span class="number">2</span> * fei);</span><br><span class="line"> <span class="comment">//改正相关值</span></span><br><span class="line"> <span class="built_in">double</span> uk = fei + stu;</span><br><span class="line"> <span class="built_in">double</span> ik = canshu.io + sti + canshu.idot * tk;</span><br><span class="line"> rk = rk + str;</span><br><span class="line"> <span class="comment">//新坐标系坐标</span></span><br><span class="line"> <span class="built_in">double</span> xk = rk * Math.Cos(uk);</span><br><span class="line"> <span class="built_in">double</span> yk = rk * Math.Sin(uk);</span><br><span class="line"> <span class="built_in">double</span> OMEGAk = canshu.OMEGA + tk * (canshu.OMEGA_DOT - ve) - ve * canshu.to;</span><br><span class="line"></span><br><span class="line"> <span class="comment">//XYZ</span></span><br><span class="line"> xyz.X = xk * Math.Cos(OMEGAk) - yk * Math.Cos(ik) * Math.Sin(OMEGAk);</span><br><span class="line"> xyz.Y = xk * Math.Sin(OMEGAk) + yk * Math.Cos(ik) * Math.Cos(OMEGAk);</span><br><span class="line"> xyz.Z = yk * Math.Sin(ik);</span><br><span class="line"> <span class="keyword">return</span> xyz;</span><br><span class="line"> }</span><br><span class="line"> <span class="comment"><span class="doctag">///</span> <span class="doctag"><summary></span></span></span><br><span class="line"> <span class="comment"><span class="doctag">///</span> 第一种情况:单颗卫星已知星历下的坐标</span></span><br><span class="line"> <span class="comment"><span class="doctag">///</span> <span class="doctag"></summary></span></span></span><br><span class="line"> <span class="comment"><span class="doctag">///</span> <span class="doctag"><param name="sprns"></span><span class="doctag"></param></span></span></span><br><span class="line"> <span class="comment"><span class="doctag">///</span> <span class="doctag"><returns></span><span class="doctag"></returns></span></span></span><br><span class="line"> <span class="function"><span class="keyword">public</span> DataSet <span class="title">EphemerisCac</span>(<span class="params"><span class="built_in">string</span> sprns</span>)</span></span><br><span class="line"> {</span><br><span class="line"> DataBase db = <span class="keyword">new</span> DataBase();</span><br><span class="line"> <span class="built_in">string</span> sql = <span class="string">"select * from wxc where ("</span> + <span class="string">" prn= "</span> + sprns + <span class="string">" and year = "</span> + year + <span class="string">" and month = "</span> + month + <span class="string">" and day = "</span> + day + <span class="string">" and hour = "</span> + hour + <span class="string">" and minute = "</span> + minute + <span class="string">" and second = "</span> + second + <span class="string">" )"</span>;</span><br><span class="line"> DataSet ds = <span class="keyword">new</span> DataSet();</span><br><span class="line"></span><br><span class="line"> db.SearchDatabase(sql, <span class="keyword">ref</span> ds);</span><br><span class="line"> <span class="comment">//dataGridView2.DataSource = ds.Tables[0];</span></span><br><span class="line"> List<<span class="built_in">string</span>> scs = <span class="keyword">new</span> List<<span class="built_in">string</span>>();</span><br><span class="line"> <span class="keyword">foreach</span> (DataRow dr <span class="keyword">in</span> ds.Tables[<span class="number">0</span>].Rows)</span><br><span class="line"> {</span><br><span class="line"> <span class="keyword">foreach</span> (DataColumn dc <span class="keyword">in</span> ds.Tables[<span class="number">0</span>].Columns)</span><br><span class="line"> scs.Add(dr[dc].ToString());</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="meta">#<span class="meta-keyword">region</span></span></span><br><span class="line"> Canshu canshu = <span class="keyword">new</span> Canshu();</span><br><span class="line"> canshu.prn = <span class="built_in">int</span>.Parse(scs[<span class="number">0</span>]);</span><br><span class="line"> canshu.year = <span class="built_in">int</span>.Parse(scs[<span class="number">1</span>]);</span><br><span class="line"> canshu.month = <span class="built_in">int</span>.Parse(scs[<span class="number">2</span>]);</span><br><span class="line"> canshu.day = <span class="built_in">int</span>.Parse(scs[<span class="number">3</span>]);</span><br><span class="line"> canshu.hour = <span class="built_in">int</span>.Parse(scs[<span class="number">4</span>]);</span><br><span class="line"> canshu.minute = <span class="built_in">int</span>.Parse(scs[<span class="number">5</span>]);</span><br><span class="line"></span><br><span class="line"> canshu.second = <span class="built_in">double</span>.Parse(scs[<span class="number">6</span>]);</span><br><span class="line"> canshu.a = <span class="built_in">double</span>.Parse(scs[<span class="number">7</span>]);</span><br><span class="line"> canshu.dn = <span class="built_in">double</span>.Parse(scs[<span class="number">8</span>]);</span><br><span class="line"> canshu.to = <span class="built_in">double</span>.Parse(scs[<span class="number">9</span>]);</span><br><span class="line"> canshu.mo = <span class="built_in">double</span>.Parse(scs[<span class="number">10</span>]);</span><br><span class="line"> canshu.e = <span class="built_in">double</span>.Parse(scs[<span class="number">11</span>]);</span><br><span class="line"> canshu.omega = <span class="built_in">double</span>.Parse(scs[<span class="number">12</span>]);</span><br><span class="line"> canshu.cuc = <span class="built_in">double</span>.Parse(scs[<span class="number">13</span>]);</span><br><span class="line"> canshu.cus = <span class="built_in">double</span>.Parse(scs[<span class="number">14</span>]);</span><br><span class="line"> canshu.crc = <span class="built_in">double</span>.Parse(scs[<span class="number">15</span>]);</span><br><span class="line"> canshu.crs = <span class="built_in">double</span>.Parse(scs[<span class="number">16</span>]);</span><br><span class="line"> canshu.cic = <span class="built_in">double</span>.Parse(scs[<span class="number">17</span>]);</span><br><span class="line"> canshu.cis = <span class="built_in">double</span>.Parse(scs[<span class="number">18</span>]);</span><br><span class="line"> canshu.idot = <span class="built_in">double</span>.Parse(scs[<span class="number">19</span>]);</span><br><span class="line"> canshu.io = <span class="built_in">double</span>.Parse(scs[<span class="number">20</span>]);</span><br><span class="line"> canshu.OMEGA = <span class="built_in">double</span>.Parse(scs[<span class="number">21</span>]);</span><br><span class="line"> canshu.OMEGA_DOT = <span class="built_in">double</span>.Parse(scs[<span class="number">22</span>]);</span><br><span class="line"> <span class="meta">#<span class="meta-keyword">endregion</span></span></span><br><span class="line"> XYZ xYZ = caculate(canshu);</span><br><span class="line"> XyzDatabase db2 = <span class="keyword">new</span> XyzDatabase();</span><br><span class="line"> db2.InsertDatabase(xYZ, canshu);</span><br><span class="line"> DataSet ds2 = <span class="keyword">new</span> DataSet();</span><br><span class="line"> <span class="built_in">string</span> pre = <span class="string">" Where ( prn= "</span> + scs[<span class="number">0</span>] + <span class="string">" and year = "</span> + scs[<span class="number">1</span>] + <span class="string">" and month = "</span> + scs[<span class="number">2</span>] + <span class="string">" and day = "</span> + scs[<span class="number">3</span>] + <span class="string">" and hour ="</span> + scs[<span class="number">4</span>] + <span class="string">" and minute = "</span> + scs[<span class="number">5</span>] + <span class="string">" and second = "</span> + scs[<span class="number">6</span>]+<span class="string">")"</span>;</span><br><span class="line"></span><br><span class="line"> db2.WatchDatabase(<span class="keyword">ref</span> ds2, <span class="string">"xyz"</span>,pre);</span><br><span class="line"> <span class="keyword">return</span> ds2;</span><br><span class="line"> }</span><br><span class="line"> <span class="comment"><span class="doctag">///</span> <span class="doctag"><summary></span></span></span><br><span class="line"> <span class="comment"><span class="doctag">///</span> 第二种情况:求取某颗卫星某一时刻的坐标</span></span><br><span class="line"> <span class="comment"><span class="doctag">///</span> <span class="doctag"></summary></span></span></span><br><span class="line"> <span class="comment"><span class="doctag">///</span> <span class="doctag"><param name="sprns"></span><span class="doctag"></param></span></span></span><br><span class="line"> <span class="comment"><span class="doctag">///</span> <span class="doctag"><returns></span><span class="doctag"></returns></span></span></span><br><span class="line"> <span class="function"><span class="keyword">public</span> Inputdata <span class="title">CoordinateCac</span>(<span class="params"><span class="built_in">string</span> sprns</span>)</span></span><br><span class="line"> {</span><br><span class="line"> DataSet ds = <span class="keyword">new</span> DataSet();</span><br><span class="line"> DataBase db = <span class="keyword">new</span> DataBase();</span><br><span class="line"> <span class="built_in">string</span> sql = <span class="string">"select * from wxc where ( prn ="</span> + sprns + <span class="string">" and year = "</span> + year.ToString() + <span class="string">" and month = "</span> + month.ToString() + <span class="string">" and day = "</span> + day.ToString() + <span class="string">" )"</span>;</span><br><span class="line"></span><br><span class="line"> DataSet ds0 = <span class="keyword">new</span> DataSet();</span><br><span class="line"> db.SearchDatabase(sql, <span class="keyword">ref</span> ds0);</span><br><span class="line"> <span class="built_in">double</span> mintime=<span class="number">90000</span>;<span class="built_in">int</span> minidex=<span class="number">0</span>;</span><br><span class="line"> <span class="keyword">for</span>(<span class="built_in">int</span> i=<span class="number">0</span>;i<ds0.Tables[<span class="number">0</span>].Rows.Count;i++)</span><br><span class="line"> {</span><br><span class="line"> <span class="built_in">int</span> chour = <span class="built_in">int</span>.Parse(ds0.Tables[<span class="number">0</span>].Rows[i][<span class="number">4</span>].ToString());</span><br><span class="line"> <span class="built_in">int</span> cminute = <span class="built_in">int</span>.Parse(ds0.Tables[<span class="number">0</span>].Rows[i][<span class="number">5</span>].ToString());</span><br><span class="line"> <span class="built_in">double</span> csecond = <span class="built_in">double</span>.Parse(ds0.Tables[<span class="number">0</span>].Rows[i][<span class="number">5</span>].ToString());</span><br><span class="line"> <span class="built_in">double</span> time = Math.Abs(chour - hour) * <span class="number">3600</span> + Math.Abs(cminute - minute) * <span class="number">60</span> + Math.Abs(csecond - second);</span><br><span class="line"> <span class="keyword">if</span>(time < mintime)</span><br><span class="line"> {</span><br><span class="line"> minidex = i;</span><br><span class="line"> mintime = time;</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> <span class="meta">#<span class="meta-keyword">region</span>//canshu参数赋值</span></span><br><span class="line"> Canshu canshu = <span class="keyword">new</span> Canshu();</span><br><span class="line"> canshu.prn = <span class="built_in">int</span>.Parse(ds0.Tables[<span class="number">0</span>].Rows[minidex][<span class="number">0</span>].ToString());</span><br><span class="line"> canshu.year = <span class="built_in">int</span>.Parse(ds0.Tables[<span class="number">0</span>].Rows[minidex][<span class="number">1</span>].ToString());</span><br><span class="line"> canshu.month = <span class="built_in">int</span>.Parse(ds0.Tables[<span class="number">0</span>].Rows[minidex][<span class="number">2</span>].ToString());</span><br><span class="line"> canshu.day = <span class="built_in">int</span>.Parse(ds0.Tables[<span class="number">0</span>].Rows[minidex][<span class="number">3</span>].ToString());</span><br><span class="line"> canshu.hour = <span class="built_in">int</span>.Parse(ds0.Tables[<span class="number">0</span>].Rows[minidex][<span class="number">4</span>].ToString());</span><br><span class="line"> canshu.minute = <span class="built_in">int</span>.Parse(ds0.Tables[<span class="number">0</span>].Rows[minidex][<span class="number">5</span>].ToString());</span><br><span class="line"></span><br><span class="line"> canshu.second = <span class="built_in">double</span>.Parse(ds0.Tables[<span class="number">0</span>].Rows[minidex][<span class="number">6</span>].ToString());</span><br><span class="line"> canshu.a = <span class="built_in">double</span>.Parse(ds0.Tables[<span class="number">0</span>].Rows[minidex][<span class="number">7</span>].ToString());</span><br><span class="line"> canshu.dn = <span class="built_in">double</span>.Parse(ds0.Tables[<span class="number">0</span>].Rows[minidex][<span class="number">8</span>].ToString());</span><br><span class="line"> canshu.to = <span class="built_in">double</span>.Parse(ds0.Tables[<span class="number">0</span>].Rows[minidex][<span class="number">9</span>].ToString());</span><br><span class="line"> canshu.mo = <span class="built_in">double</span>.Parse(ds0.Tables[<span class="number">0</span>].Rows[minidex][<span class="number">10</span>].ToString());</span><br><span class="line"> canshu.e = <span class="built_in">double</span>.Parse(ds0.Tables[<span class="number">0</span>].Rows[minidex][<span class="number">11</span>].ToString());</span><br><span class="line"> canshu.omega = <span class="built_in">double</span>.Parse(ds0.Tables[<span class="number">0</span>].Rows[minidex][<span class="number">12</span>].ToString());</span><br><span class="line"> canshu.cuc = <span class="built_in">double</span>.Parse(ds0.Tables[<span class="number">0</span>].Rows[minidex][<span class="number">13</span>].ToString());</span><br><span class="line"> canshu.cus = <span class="built_in">double</span>.Parse(ds0.Tables[<span class="number">0</span>].Rows[minidex][<span class="number">14</span>].ToString());</span><br><span class="line"> canshu.crc = <span class="built_in">double</span>.Parse(ds0.Tables[<span class="number">0</span>].Rows[minidex][<span class="number">15</span>].ToString());</span><br><span class="line"> canshu.crs = <span class="built_in">double</span>.Parse(ds0.Tables[<span class="number">0</span>].Rows[minidex][<span class="number">16</span>].ToString());</span><br><span class="line"> canshu.cic = <span class="built_in">double</span>.Parse(ds0.Tables[<span class="number">0</span>].Rows[minidex][<span class="number">17</span>].ToString());</span><br><span class="line"> canshu.cis = <span class="built_in">double</span>.Parse(ds0.Tables[<span class="number">0</span>].Rows[minidex][<span class="number">18</span>].ToString());</span><br><span class="line"> canshu.idot = <span class="built_in">double</span>.Parse(ds0.Tables[<span class="number">0</span>].Rows[minidex][<span class="number">19</span>].ToString());</span><br><span class="line"> canshu.io=<span class="built_in">double</span>.Parse(ds0.Tables[<span class="number">0</span>].Rows[minidex][<span class="number">20</span>].ToString());</span><br><span class="line"> canshu.OMEGA = <span class="built_in">double</span>.Parse(ds0.Tables[<span class="number">0</span>].Rows[minidex][<span class="number">21</span>].ToString());</span><br><span class="line"> canshu.OMEGA_DOT = <span class="built_in">double</span>.Parse(ds0.Tables[<span class="number">0</span>].Rows[minidex][<span class="number">22</span>].ToString());</span><br><span class="line"> <span class="meta">#<span class="meta-keyword">endregion</span></span></span><br><span class="line"> XYZ xYZ = caculate(canshu);</span><br><span class="line"> XyzDatabase db2 = <span class="keyword">new</span> XyzDatabase();</span><br><span class="line"> Inputdata ida = <span class="keyword">new</span> Inputdata();</span><br><span class="line"> ida.X = xYZ.X;</span><br><span class="line"> ida.Y = xYZ.Y;</span><br><span class="line"> ida.Z = xYZ.Z;</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"> ida.prn = canshu.prn;</span><br><span class="line"> ida.year = year;</span><br><span class="line"> ida.minute = minute;</span><br><span class="line"> ida.month = month;</span><br><span class="line"> ida.day = day;</span><br><span class="line"> ida.hour = hour;</span><br><span class="line"> ida.second = second;</span><br><span class="line"></span><br><span class="line"> db2.InsertDatabase(ida);</span><br><span class="line"> </span><br><span class="line"></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"> <span class="keyword">return</span> ida;</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> <span class="comment"><span class="doctag">///</span> <span class="doctag"><summary></span></span></span><br><span class="line"> <span class="comment"><span class="doctag">///</span> 数据库操作类</span></span><br><span class="line"> <span class="comment"><span class="doctag">///</span> <span class="doctag"></summary></span></span></span><br><span class="line"> <span class="keyword">class</span> <span class="title">DataBase</span></span><br><span class="line"> {</span><br><span class="line"> SqlConnection myconnection = <span class="keyword">new</span> SqlConnection();</span><br><span class="line"> <span class="comment"><span class="doctag">///</span> <span class="doctag"><summary></span></span></span><br><span class="line"> <span class="comment"><span class="doctag">///</span> 无参数构造函数:默认是canshu的数据库</span></span><br><span class="line"> <span class="comment"><span class="doctag">///</span> <span class="doctag"></summary></span></span></span><br><span class="line"> <span class="function"><span class="keyword">public</span> <span class="title">DataBase</span>(<span class="params"></span>)</span></span><br><span class="line"> {</span><br><span class="line"> </span><br><span class="line"> <span class="built_in">string</span> a = <span class="string">"Data Source=DESKTOP-PNEN86K;Initial Catalog=canshu;Integrated Security=True;Connect Timeout=30;Encrypt=False;TrustServerCertificate=True;ApplicationIntent=ReadWrite;MultiSubnetFailover=False;max pool size=30000"</span>;</span><br><span class="line"> myconnection.ConnectionString = a;</span><br><span class="line"> myconnection.Open();</span><br><span class="line"> </span><br><span class="line"> }</span><br><span class="line"> <span class="comment"><span class="doctag">///</span> <span class="doctag"><summary></span></span></span><br><span class="line"> <span class="comment"><span class="doctag">///</span> 有参数构造函数</span></span><br><span class="line"> <span class="comment"><span class="doctag">///</span> <span class="doctag"></summary></span></span></span><br><span class="line"> <span class="comment"><span class="doctag">///</span> <span class="doctag"><param name="catalog"></span><span class="doctag"></param></span></span></span><br><span class="line"> <span class="function"><span class="keyword">public</span> <span class="title">DataBase</span>(<span class="params"><span class="built_in">string</span> catalog</span>)</span></span><br><span class="line"> {</span><br><span class="line"> <span class="built_in">string</span> a = <span class="string">"Data Source=DESKTOP-PNEN86K;Initial Catalog="</span>+catalog+<span class="string">";Integrated Security=True;Connect Timeout=30;Encrypt=False;TrustServerCertificate=True;ApplicationIntent=ReadWrite;MultiSubnetFailover=False"</span>;</span><br><span class="line"> myconnection.ConnectionString = a;</span><br><span class="line"> myconnection.Open();</span><br><span class="line"> }</span><br><span class="line"> <span class="comment"><span class="doctag">///</span> <span class="doctag"><summary></span></span></span><br><span class="line"> <span class="comment"><span class="doctag">///</span> 各种插入</span></span><br><span class="line"> <span class="comment"><span class="doctag">///</span> <span class="doctag"></summary></span></span></span><br><span class="line"> <span class="comment"><span class="doctag">///</span> <span class="doctag"><param name="canshu"></span><span class="doctag"></param></span></span></span><br><span class="line"> <span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">InsertDatabase</span>(<span class="params">Canshu canshu</span>)</span></span><br><span class="line"> {</span><br><span class="line"> <span class="keyword">if</span> (myconnection.State == System.Data.ConnectionState.Open)</span><br><span class="line"> {</span><br><span class="line"> <span class="built_in">string</span> prns = canshu.prn.ToString();</span><br><span class="line"> <span class="built_in">string</span> year = canshu.year.ToString();</span><br><span class="line"> <span class="built_in">string</span> month = canshu.month.ToString();</span><br><span class="line"> <span class="built_in">string</span> day = canshu.day.ToString();</span><br><span class="line"> <span class="built_in">string</span> hour = canshu.hour.ToString();</span><br><span class="line"> <span class="built_in">string</span> minute = canshu.minute.ToString();</span><br><span class="line"> <span class="built_in">string</span> second = canshu.second.ToString();</span><br><span class="line"> <span class="built_in">string</span> a = canshu.a.ToString();</span><br><span class="line"> <span class="built_in">string</span> dn = canshu.dn.ToString();</span><br><span class="line"> <span class="built_in">string</span> t0 = canshu.to.ToString();</span><br><span class="line"> <span class="built_in">string</span> m0 = canshu.mo.ToString();</span><br><span class="line"> <span class="built_in">string</span> e = canshu.e.ToString();</span><br><span class="line"> <span class="built_in">string</span> omega = canshu.omega.ToString();</span><br><span class="line"> <span class="built_in">string</span> cuc = canshu.cuc.ToString();</span><br><span class="line"> <span class="built_in">string</span> cus = canshu.cus.ToString();</span><br><span class="line"> <span class="built_in">string</span> crc = canshu.crc.ToString();</span><br><span class="line"> <span class="built_in">string</span> crs = canshu.crs.ToString();</span><br><span class="line"> <span class="built_in">string</span> cic = canshu.cic.ToString();</span><br><span class="line"> <span class="built_in">string</span> cis = canshu.cis.ToString();</span><br><span class="line"> <span class="built_in">string</span> idot = canshu.idot.ToString();</span><br><span class="line"> <span class="built_in">string</span> i0 = canshu.io.ToString();</span><br><span class="line"> <span class="built_in">string</span> bigomega = canshu.OMEGA.ToString();</span><br><span class="line"> <span class="built_in">string</span> bigomegadot = canshu.OMEGA_DOT.ToString();</span><br><span class="line"> <span class="built_in">string</span> col = <span class="string">"prn,year,month,day,hour,minute,second,a,dn,t0,m0,e,omega,cuc,cus,crc,crs,cic,cis,idot,i0,bigomega,bigomegadot"</span>;</span><br><span class="line"> <span class="built_in">string</span> res = prns + <span class="string">","</span> + year + <span class="string">","</span> + month + <span class="string">","</span> + day + <span class="string">","</span> + hour + <span class="string">","</span> + minute + <span class="string">","</span> + second + <span class="string">","</span> + a + <span class="string">","</span> + dn + <span class="string">","</span> + t0 + <span class="string">","</span> + m0 + <span class="string">","</span> + e + <span class="string">","</span> + omega + <span class="string">","</span> + cuc + <span class="string">","</span> + cus + <span class="string">","</span> + crc + <span class="string">","</span> + crs + <span class="string">","</span> + cic + <span class="string">","</span> + cis + <span class="string">","</span> + idot + <span class="string">","</span> + i0 + <span class="string">","</span> + bigomega + <span class="string">","</span> + bigomegadot;</span><br><span class="line"> <span class="built_in">string</span> SQL1 = <span class="string">"insert into wxc ("</span> + col + <span class="string">") values("</span> + res + <span class="string">")"</span>;</span><br><span class="line"> SqlCommand com = <span class="keyword">new</span> SqlCommand(SQL1, myconnection);</span><br><span class="line"> com.ExecuteNonQuery();</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> <span class="comment"><span class="doctag">///</span> <span class="doctag"><summary></span></span></span><br><span class="line"> <span class="comment"><span class="doctag">///</span> 显示数据</span></span><br><span class="line"> <span class="comment"><span class="doctag">///</span> <span class="doctag"></summary></span></span></span><br><span class="line"> <span class="comment"><span class="doctag">///</span> <span class="doctag"><param name="ds"></span><span class="doctag"></param></span></span></span><br><span class="line"> <span class="comment"><span class="doctag">///</span> <span class="doctag"><param name="biao"></span><span class="doctag"></param></span></span></span><br><span class="line"> <span class="comment"><span class="doctag">///</span> <span class="doctag"><param name="pre"></span><span class="doctag"></param></span></span></span><br><span class="line"> <span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">WatchDatabase</span>(<span class="params"><span class="keyword">ref</span> DataSet ds,<span class="built_in">string</span> biao=<span class="string">"wxc"</span>,<span class="built_in">string</span> pre= <span class="string">""</span></span>)</span></span><br><span class="line"> {</span><br><span class="line"> DataBase db = <span class="keyword">new</span> DataBase();</span><br><span class="line"> <span class="built_in">string</span> SQL2 = <span class="string">"Select * From "</span> + biao + pre;</span><br><span class="line"> SqlDataAdapter mydataadapter = <span class="keyword">new</span> SqlDataAdapter();</span><br><span class="line"> mydataadapter.SelectCommand = <span class="keyword">new</span> SqlCommand(SQL2, myconnection);</span><br><span class="line"> ds = <span class="keyword">new</span> DataSet();</span><br><span class="line"> mydataadapter.Fill(ds, biao);</span><br><span class="line"> }</span><br><span class="line"> <span class="comment"><span class="doctag">///</span> <span class="doctag"><summary></span></span></span><br><span class="line"> <span class="comment"><span class="doctag">///</span> 查找某一行</span></span><br><span class="line"> <span class="comment"><span class="doctag">///</span> <span class="doctag"></summary></span></span></span><br><span class="line"> <span class="comment"><span class="doctag">///</span> <span class="doctag"><param name="SQL2"></span><span class="doctag"></param></span></span></span><br><span class="line"> <span class="comment"><span class="doctag">///</span> <span class="doctag"><param name="ds"></span><span class="doctag"></param></span></span></span><br><span class="line"> <span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">SearchDatabase</span>(<span class="params"><span class="built_in">string</span> SQL2,<span class="keyword">ref</span> DataSet ds</span>)</span></span><br><span class="line"> {</span><br><span class="line"> DataBase db = <span class="keyword">new</span> DataBase();</span><br><span class="line"></span><br><span class="line"> <span class="built_in">string</span> biao = <span class="string">"wxc"</span>;</span><br><span class="line"> <span class="comment">//string SQL2 = "Select * From " + biao;</span></span><br><span class="line"> SqlDataAdapter mydataadapter = <span class="keyword">new</span> SqlDataAdapter();</span><br><span class="line"> mydataadapter.SelectCommand = <span class="keyword">new</span> SqlCommand(SQL2, myconnection);</span><br><span class="line"> ds = <span class="keyword">new</span> DataSet();</span><br><span class="line"> mydataadapter.Fill(ds, biao);</span><br><span class="line"> }</span><br><span class="line"> <span class="comment"><span class="doctag">///</span> <span class="doctag"><summary></span></span></span><br><span class="line"> <span class="comment"><span class="doctag">///</span> 修改</span></span><br><span class="line"> <span class="comment"><span class="doctag">///</span> <span class="doctag"></summary></span></span></span><br><span class="line"> <span class="comment"><span class="doctag">///</span> <span class="doctag"><param name="SQL1"></span><span class="doctag"></param></span></span></span><br><span class="line"> <span class="comment"><span class="doctag">///</span> <span class="doctag"><returns></span><span class="doctag"></returns></span></span></span><br><span class="line"> <span class="function"><span class="keyword">public</span> DataSet <span class="title">ReviseDatabase</span>(<span class="params"><span class="built_in">string</span> SQL1</span>)</span></span><br><span class="line"> {</span><br><span class="line"> DataSet ds = <span class="keyword">new</span> DataSet();</span><br><span class="line"> <span class="keyword">if</span> (myconnection.State==System.Data.ConnectionState.Open)</span><br><span class="line"> {</span><br><span class="line"> SqlCommand com = <span class="keyword">new</span> SqlCommand(SQL1, myconnection);</span><br><span class="line"> com.ExecuteNonQuery();</span><br><span class="line"> <span class="built_in">string</span> SQL2 = <span class="string">"Select * From wxc"</span> ;</span><br><span class="line"> SqlDataAdapter mydataadapter = <span class="keyword">new</span> SqlDataAdapter();</span><br><span class="line"> mydataadapter.SelectCommand = <span class="keyword">new</span> SqlCommand(SQL2, myconnection);</span><br><span class="line"> mydataadapter.Fill(ds, <span class="string">"wxc"</span>);</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">return</span> ds;</span><br><span class="line"> }</span><br><span class="line"> <span class="comment"><span class="doctag">///</span> <span class="doctag"><summary></span></span></span><br><span class="line"> <span class="comment"><span class="doctag">///</span> 删除</span></span><br><span class="line"> <span class="comment"><span class="doctag">///</span> <span class="doctag"></summary></span></span></span><br><span class="line"> <span class="comment"><span class="doctag">///</span> <span class="doctag"><param name="SQL"></span><span class="doctag"></param></span></span></span><br><span class="line"> <span class="comment"><span class="doctag">///</span> <span class="doctag"><returns></span><span class="doctag"></returns></span></span></span><br><span class="line"> <span class="function"><span class="keyword">public</span> DataSet <span class="title">DeleteDatabase</span>(<span class="params"><span class="built_in">string</span> SQL</span>)</span></span><br><span class="line"> {</span><br><span class="line"> DataSet ds = <span class="keyword">new</span> DataSet();</span><br><span class="line"> <span class="keyword">if</span>(myconnection.State == System.Data.ConnectionState.Open)</span><br><span class="line"> {</span><br><span class="line"> SqlCommand com = <span class="keyword">new</span> SqlCommand(SQL, myconnection);</span><br><span class="line"> com.ExecuteNonQuery();</span><br><span class="line"> <span class="built_in">string</span> SQL2 = <span class="string">"Select * From wxc"</span>;</span><br><span class="line"> SqlDataAdapter mydataadapter = <span class="keyword">new</span> SqlDataAdapter();</span><br><span class="line"> mydataadapter.SelectCommand = <span class="keyword">new</span> SqlCommand(SQL2, myconnection);</span><br><span class="line"> mydataadapter.Fill(ds, <span class="string">"wxc"</span>);</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="keyword">return</span> ds;</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="comment"><span class="doctag">///</span> <span class="doctag"><summary></span></span></span><br><span class="line"> <span class="comment"><span class="doctag">///</span> 专门操作卫星坐标写入的类</span></span><br><span class="line"> <span class="comment"><span class="doctag">///</span> <span class="doctag"></summary></span></span></span><br><span class="line"> <span class="keyword">class</span> <span class="title">XyzDatabase</span>:<span class="title">DataBase</span></span><br><span class="line"> {</span><br><span class="line"> SqlConnection myconnection = <span class="keyword">new</span> SqlConnection();</span><br><span class="line"> <span class="function"><span class="keyword">public</span> <span class="title">XyzDatabase</span>(<span class="params"></span>)</span></span><br><span class="line"> {</span><br><span class="line"> <span class="built_in">string</span> a = <span class="string">"Data Source=DESKTOP-PNEN86K;Initial Catalog=canshu;Integrated Security=True;Connect Timeout=30;Encrypt=False;TrustServerCertificate=True;ApplicationIntent=ReadWrite;MultiSubnetFailover=False;max pool size=30000"</span>;</span><br><span class="line"> myconnection.ConnectionString = a;</span><br><span class="line"> myconnection.Open();</span><br><span class="line"> }</span><br><span class="line"> <span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">InsertDatabase</span>(<span class="params">XYZ xYZ, Canshu canshu</span>)</span></span><br><span class="line"> {</span><br><span class="line"> <span class="keyword">if</span> (myconnection.State == System.Data.ConnectionState.Open)</span><br><span class="line"> {</span><br><span class="line"> <span class="built_in">string</span> sx = xYZ.X.ToString();</span><br><span class="line"> <span class="built_in">string</span> sy = xYZ.Y.ToString();</span><br><span class="line"> <span class="built_in">string</span> sz = xYZ.Z.ToString();</span><br><span class="line"> <span class="built_in">string</span> prns = canshu.prn.ToString();</span><br><span class="line"> <span class="built_in">string</span> year = canshu.year.ToString();</span><br><span class="line"> <span class="built_in">string</span> month = canshu.month.ToString();</span><br><span class="line"> <span class="built_in">string</span> day = canshu.day.ToString();</span><br><span class="line"> <span class="built_in">string</span> hour = canshu.hour.ToString();</span><br><span class="line"> <span class="built_in">string</span> minute = canshu.minute.ToString();</span><br><span class="line"> <span class="built_in">string</span> second = canshu.second.ToString();</span><br><span class="line"> <span class="built_in">string</span> col = <span class="string">"prn,year,month,day,hour,minute,second,x,y,z"</span>;</span><br><span class="line"> <span class="built_in">string</span> res = prns + <span class="string">" , "</span> + year + <span class="string">" , "</span> + month + <span class="string">" , "</span> + day + <span class="string">" , "</span> + hour + <span class="string">" , "</span> + minute + <span class="string">" , "</span> + second + <span class="string">" , "</span> + sx + <span class="string">" , "</span> + sy + <span class="string">" , "</span> + sz;</span><br><span class="line"> <span class="built_in">string</span> SQL = <span class="string">"insert into xyz ("</span> + col + <span class="string">" ) values ("</span> + res + <span class="string">")"</span>;</span><br><span class="line"> SqlCommand com = <span class="keyword">new</span> SqlCommand(SQL, myconnection);</span><br><span class="line"> com.ExecuteNonQuery();</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> <span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">InsertDatabase</span>(<span class="params">Inputdata ida</span>)</span></span><br><span class="line"> {</span><br><span class="line"> <span class="keyword">if</span> (myconnection.State == System.Data.ConnectionState.Open)</span><br><span class="line"> {</span><br><span class="line"> <span class="built_in">string</span> sx = ida.X.ToString();</span><br><span class="line"> <span class="built_in">string</span> sy = ida.Y.ToString();</span><br><span class="line"> <span class="built_in">string</span> sz = ida.Z.ToString();</span><br><span class="line"> <span class="built_in">string</span> prns = ida.prn.ToString();</span><br><span class="line"> <span class="built_in">string</span> year = ida.year.ToString();</span><br><span class="line"> <span class="built_in">string</span> month = ida.month.ToString();</span><br><span class="line"> <span class="built_in">string</span> day = ida.day.ToString();</span><br><span class="line"> <span class="built_in">string</span> hour = ida.hour.ToString();</span><br><span class="line"> <span class="built_in">string</span> minute = ida.minute.ToString();</span><br><span class="line"> <span class="built_in">string</span> second = ida.second.ToString();</span><br><span class="line"> <span class="built_in">string</span> col = <span class="string">"prn,year,month,day,hour,minute,second,x,y,z"</span>;</span><br><span class="line"> <span class="built_in">string</span> res = prns + <span class="string">" , "</span> + year + <span class="string">" , "</span> + month + <span class="string">" , "</span> + day + <span class="string">" , "</span> + hour + <span class="string">" , "</span> + minute + <span class="string">" , "</span> + second + <span class="string">" , "</span> + sx + <span class="string">" , "</span> + sy + <span class="string">" , "</span> + sz;</span><br><span class="line"> <span class="built_in">string</span> SQL = <span class="string">"insert into xyz ("</span> + col + <span class="string">" ) values ("</span> + res + <span class="string">")"</span>;</span><br><span class="line"> SqlCommand com = <span class="keyword">new</span> SqlCommand(SQL, myconnection);</span><br><span class="line"> com.ExecuteNonQuery();</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> <span class="comment"><span class="doctag">///</span> <span class="doctag"><summary></span></span></span><br><span class="line"> <span class="comment"><span class="doctag">///</span> 写入单点定位数据库的类</span></span><br><span class="line"> <span class="comment"><span class="doctag">///</span> <span class="doctag"></summary></span></span></span><br><span class="line"> <span class="keyword">class</span> <span class="title">CzDatabase</span>:<span class="title">DataBase</span></span><br><span class="line"> {</span><br><span class="line"> SqlConnection myconnection = <span class="keyword">new</span> SqlConnection();</span><br><span class="line"> <span class="function"><span class="keyword">public</span> <span class="title">CzDatabase</span>(<span class="params"></span>)</span></span><br><span class="line"> {</span><br><span class="line"> <span class="built_in">string</span> a = <span class="string">"Data Source=DESKTOP-PNEN86K;Initial Catalog=canshu;Integrated Security=True;Connect Timeout=30;Encrypt=False;TrustServerCertificate=True;ApplicationIntent=ReadWrite;MultiSubnetFailover=False;max pool size=30000"</span>;</span><br><span class="line"> myconnection.ConnectionString = a;</span><br><span class="line"> myconnection.Open();</span><br><span class="line"> }</span><br><span class="line"> <span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">InsertDatabase</span>(<span class="params">XYZ xYZ</span>)</span></span><br><span class="line"> {</span><br><span class="line"> <span class="keyword">if</span> (myconnection.State == System.Data.ConnectionState.Open)</span><br><span class="line"> {</span><br><span class="line"> <span class="built_in">string</span> sx = xYZ.X.ToString();</span><br><span class="line"> <span class="built_in">string</span> sy = xYZ.Y.ToString();</span><br><span class="line"> <span class="built_in">string</span> sz = xYZ.Z.ToString();</span><br><span class="line"></span><br><span class="line"> <span class="built_in">string</span> col = <span class="string">"x,y,z"</span>;</span><br><span class="line"> <span class="built_in">string</span> res = sx + <span class="string">" , "</span> + sy + <span class="string">" , "</span> + sz;</span><br><span class="line"> <span class="built_in">string</span> SQL = <span class="string">"insert into cz ("</span> + col + <span class="string">" ) values ("</span> + res + <span class="string">")"</span>;</span><br><span class="line"> SqlCommand com = <span class="keyword">new</span> SqlCommand(SQL, myconnection);</span><br><span class="line"> com.ExecuteNonQuery();</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="comment"><span class="doctag">///</span> <span class="doctag"><summary></span></span></span><br><span class="line"> <span class="comment"><span class="doctag">///</span> 单点定位计算类</span></span><br><span class="line"> <span class="comment"><span class="doctag">///</span> <span class="doctag"></summary></span></span></span><br><span class="line"> <span class="keyword">class</span> <span class="title">SinglePoint</span></span><br><span class="line"> {</span><br><span class="line"> <span class="comment"><span class="doctag">///</span> <span class="doctag"><summary></span></span></span><br><span class="line"> <span class="comment"><span class="doctag">///</span> 计算常数项</span></span><br><span class="line"> <span class="comment"><span class="doctag">///</span> <span class="doctag"></summary></span></span></span><br><span class="line"> <span class="comment"><span class="doctag">///</span> <span class="doctag"><param name="xyz0"></span><span class="doctag"></param></span></span></span><br><span class="line"> <span class="comment"><span class="doctag">///</span> <span class="doctag"><param name="xyzs"></span><span class="doctag"></param></span></span></span><br><span class="line"> <span class="comment"><span class="doctag">///</span> <span class="doctag"><returns></span><span class="doctag"></returns></span></span></span><br><span class="line"> <span class="function"><span class="keyword">private</span> <span class="built_in">double</span> <span class="title">L0</span>(<span class="params">XYZ xyz0,XYZ xyzs</span>)</span></span><br><span class="line"> {</span><br><span class="line"> <span class="built_in">double</span> l0;</span><br><span class="line"> l0 = Math.Pow((xyz0.X - xyzs.X), <span class="number">2</span>) + Math.Pow((xyz0.Y - xyzs.Y), <span class="number">2</span>) + Math.Pow((xyz0.Z - xyzs.Z), <span class="number">2</span>);</span><br><span class="line"> l0 = Math.Sqrt(l0);</span><br><span class="line"> <span class="keyword">return</span> l0;</span><br><span class="line"> }</span><br><span class="line"> <span class="comment"><span class="doctag">///</span> <span class="doctag"><summary></span></span></span><br><span class="line"> <span class="comment"><span class="doctag">///</span> 计算待测点坐标</span></span><br><span class="line"> <span class="comment"><span class="doctag">///</span> <span class="doctag"></summary></span></span></span><br><span class="line"> <span class="comment"><span class="doctag">///</span> <span class="doctag"><param name="xyz0"></span><span class="doctag"></param></span></span></span><br><span class="line"> <span class="comment"><span class="doctag">///</span> <span class="doctag"><param name="xyzlist"></span><span class="doctag"></param></span></span></span><br><span class="line"> <span class="comment"><span class="doctag">///</span> <span class="doctag"><returns></span><span class="doctag"></returns></span></span></span><br><span class="line"> <span class="keyword">public</span> <span class="built_in">double</span>[,] singlecac(XYZ xyz0,List<XYZ> xyzlist)</span><br><span class="line"> {</span><br><span class="line"> <span class="keyword">if</span>(xyzlist.Count==<span class="number">4</span>)</span><br><span class="line"> {</span><br><span class="line"> <span class="built_in">double</span>[,] A = <span class="keyword">new</span> <span class="built_in">double</span>[<span class="number">4</span>,<span class="number">4</span>];</span><br><span class="line"> <span class="built_in">double</span>[,] l0 = <span class="keyword">new</span> <span class="built_in">double</span>[<span class="number">4</span>,<span class="number">1</span>];</span><br><span class="line"> <span class="keyword">for</span>(<span class="built_in">int</span> i =<span class="number">0</span>;i<<span class="number">4</span>;i++)</span><br><span class="line"> {</span><br><span class="line"> XYZ xyzs = <span class="keyword">new</span> XYZ();</span><br><span class="line"> xyzs = xyzlist[i];</span><br><span class="line"> A[i, <span class="number">0</span>] = -(xyzs.X - xyz0.X) / (Math.Pow((xyz0.X - xyzs.X), <span class="number">2</span>) + Math.Pow((xyz0.Y - xyzs.Y), <span class="number">2</span>) + Math.Pow((xyz0.Z - xyzs.Z), <span class="number">2</span>));</span><br><span class="line"> A[i, <span class="number">1</span>] = -(xyzs.Y - xyz0.Y) / (Math.Pow((xyz0.X - xyzs.X), <span class="number">2</span>) + Math.Pow((xyz0.Y - xyzs.Y), <span class="number">2</span>) + Math.Pow((xyz0.Z - xyzs.Z), <span class="number">2</span>));</span><br><span class="line"> A[i, <span class="number">2</span>] = -(xyzs.Z - xyz0.Z) / (Math.Pow((xyz0.X - xyzs.X), <span class="number">2</span>) + Math.Pow((xyz0.Y - xyzs.Y), <span class="number">2</span>) + Math.Pow((xyz0.Z - xyzs.Z), <span class="number">2</span>));</span><br><span class="line"> A[i, <span class="number">3</span>] = <span class="number">3E8</span>;</span><br><span class="line"> l0[i, <span class="number">0</span>] = -L0(xyz0, xyzs);</span><br><span class="line"> }</span><br><span class="line"> <span class="built_in">double</span>[,] x = <span class="keyword">new</span> <span class="built_in">double</span>[<span class="number">4</span>, <span class="number">1</span>];</span><br><span class="line"> x = Matrix.MultiplyMatrix(Matrix.Athwart(A), l0);</span><br><span class="line"> <span class="keyword">return</span> x;</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">else</span></span><br><span class="line"> {</span><br><span class="line"> <span class="built_in">int</span> n = xyzlist.Count;</span><br><span class="line"> <span class="built_in">double</span>[,] A = <span class="keyword">new</span> <span class="built_in">double</span>[n, n];</span><br><span class="line"> <span class="built_in">double</span>[,] l0 = <span class="keyword">new</span> <span class="built_in">double</span>[n, <span class="number">1</span>];</span><br><span class="line"> <span class="keyword">for</span> (<span class="built_in">int</span> i = <span class="number">0</span>; i <n; i++)</span><br><span class="line"> {</span><br><span class="line"> XYZ xyzs = <span class="keyword">new</span> XYZ();</span><br><span class="line"> xyzs = xyzlist[i];</span><br><span class="line"> A[i, <span class="number">0</span>] = -(xyzs.X - xyz0.X) / (Math.Pow((xyz0.X - xyzs.X), <span class="number">2</span>) + Math.Pow((xyz0.Y - xyzs.Y), <span class="number">2</span>) + Math.Pow((xyz0.Z - xyzs.Z), <span class="number">2</span>));</span><br><span class="line"> A[i, <span class="number">1</span>] = -(xyzs.Y - xyz0.Y) / (Math.Pow((xyz0.X - xyzs.X), <span class="number">2</span>) + Math.Pow((xyz0.Y - xyzs.Y), <span class="number">2</span>) + Math.Pow((xyz0.Z - xyzs.Z), <span class="number">2</span>));</span><br><span class="line"> A[i, <span class="number">2</span>] = -(xyzs.Z - xyz0.Z) / (Math.Pow((xyz0.X - xyzs.X), <span class="number">2</span>) + Math.Pow((xyz0.Y - xyzs.Y), <span class="number">2</span>) + Math.Pow((xyz0.Z - xyzs.Z), <span class="number">2</span>));</span><br><span class="line"> A[i, <span class="number">3</span>] = <span class="number">3E8</span>;</span><br><span class="line"> l0[i, <span class="number">0</span>] = -L0(xyz0, xyzs);</span><br><span class="line"> }</span><br><span class="line"> <span class="built_in">double</span>[,] x = <span class="keyword">new</span> <span class="built_in">double</span>[<span class="number">4</span>, <span class="number">1</span>];</span><br><span class="line"> x = Matrix.MultiplyMatrix(Matrix.Athwart((Matrix.MultiplyMatrix(Matrix.Transpose(A), A))) ,Matrix.MultiplyMatrix(Matrix.Transpose(A),l0));</span><br><span class="line"> <span class="keyword">return</span> x;</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> </span><br><span class="line">}</span><br></pre></td></tr></table></figure><figure class="highlight csharp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br><span class="line">112</span><br><span class="line">113</span><br><span class="line">114</span><br><span class="line">115</span><br><span class="line">116</span><br><span class="line">117</span><br><span class="line">118</span><br><span class="line">119</span><br><span class="line">120</span><br><span class="line">121</span><br><span class="line">122</span><br><span class="line">123</span><br><span class="line">124</span><br><span class="line">125</span><br><span class="line">126</span><br><span class="line">127</span><br><span class="line">128</span><br><span class="line">129</span><br><span class="line">130</span><br><span class="line">131</span><br><span class="line">132</span><br><span class="line">133</span><br><span class="line">134</span><br><span class="line">135</span><br><span class="line">136</span><br><span class="line">137</span><br><span class="line">138</span><br><span class="line">139</span><br><span class="line">140</span><br><span class="line">141</span><br><span class="line">142</span><br><span class="line">143</span><br><span class="line">144</span><br><span class="line">145</span><br><span class="line">146</span><br><span class="line">147</span><br><span class="line">148</span><br><span class="line">149</span><br><span class="line">150</span><br><span class="line">151</span><br><span class="line">152</span><br><span class="line">153</span><br><span class="line">154</span><br><span class="line">155</span><br><span class="line">156</span><br><span class="line">157</span><br><span class="line">158</span><br><span class="line">159</span><br><span class="line">160</span><br><span class="line">161</span><br><span class="line">162</span><br><span class="line">163</span><br><span class="line">164</span><br><span class="line">165</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">using</span> System;</span><br><span class="line"><span class="keyword">using</span> System.Collections.Generic;</span><br><span class="line"><span class="keyword">using</span> System.Linq;</span><br><span class="line"><span class="keyword">using</span> System.Text;</span><br><span class="line"><span class="keyword">using</span> System.Threading.Tasks;</span><br><span class="line"></span><br><span class="line"><span class="keyword">namespace</span> <span class="title">GPS</span>卫星坐标与单点定位计算</span><br><span class="line">{</span><br><span class="line"> <span class="keyword">class</span> <span class="title">Matrix</span></span><br><span class="line"> {</span><br><span class="line"></span><br><span class="line"> <span class="comment"><span class="doctag">///</span> <span class="doctag"><summary></span> </span></span><br><span class="line"> <span class="comment"><span class="doctag">///</span> 矩阵的转置 </span></span><br><span class="line"> <span class="comment"><span class="doctag">///</span> <span class="doctag"></summary></span> </span></span><br><span class="line"> <span class="comment"><span class="doctag">///</span> <span class="doctag"><param name= "iMatrix "></span> <span class="doctag"></param></span> </span></span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">static</span> <span class="built_in">double</span>[,] Transpose(<span class="built_in">double</span>[,] iMatrix)</span><br><span class="line"> {</span><br><span class="line"> <span class="built_in">int</span> row = iMatrix.GetLength(<span class="number">0</span>);</span><br><span class="line"> <span class="built_in">int</span> column = iMatrix.GetLength(<span class="number">1</span>);</span><br><span class="line"> <span class="comment">//double[,] iMatrix = new double[column, row];</span></span><br><span class="line"> <span class="built_in">double</span>[,] TempMatrix = <span class="keyword">new</span> <span class="built_in">double</span>[row, column];</span><br><span class="line"> <span class="built_in">double</span>[,] iMatrixT = <span class="keyword">new</span> <span class="built_in">double</span>[column, row];</span><br><span class="line"> <span class="keyword">for</span> (<span class="built_in">int</span> i = <span class="number">0</span>; i < row; i++)</span><br><span class="line"> {</span><br><span class="line"> <span class="keyword">for</span> (<span class="built_in">int</span> j = <span class="number">0</span>; j < column; j++)</span><br><span class="line"> {</span><br><span class="line"> TempMatrix[i, j] = iMatrix[i, j];</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">for</span> (<span class="built_in">int</span> i = <span class="number">0</span>; i < column; i++)</span><br><span class="line"> {</span><br><span class="line"> <span class="keyword">for</span> (<span class="built_in">int</span> j = <span class="number">0</span>; j < row; j++)</span><br><span class="line"> {</span><br><span class="line"> iMatrixT[i, j] = TempMatrix[j, i];</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">return</span> iMatrixT;</span><br><span class="line"></span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="comment"><span class="doctag">///</span> <span class="doctag"><summary></span> </span></span><br><span class="line"> <span class="comment"><span class="doctag">///</span> 矩阵的逆矩阵 </span></span><br><span class="line"> <span class="comment"><span class="doctag">///</span> <span class="doctag"></summary></span> </span></span><br><span class="line"> <span class="comment"><span class="doctag">///</span> <span class="doctag"><param name= "iMatrix "></span> <span class="doctag"></param></span> </span></span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">static</span> <span class="built_in">double</span>[,] Athwart(<span class="built_in">double</span>[,] iMatrix)</span><br><span class="line"> {</span><br><span class="line"> <span class="built_in">int</span> i = <span class="number">0</span>;</span><br><span class="line"> <span class="built_in">int</span> row = iMatrix.GetLength(<span class="number">0</span>);</span><br><span class="line"> <span class="built_in">double</span>[,] MatrixZwei = <span class="keyword">new</span> <span class="built_in">double</span>[row, row * <span class="number">2</span>];</span><br><span class="line"> <span class="built_in">double</span>[,] iMatrixInv = <span class="keyword">new</span> <span class="built_in">double</span>[row, row];</span><br><span class="line"> <span class="keyword">for</span> (i = <span class="number">0</span>; i < row; i++)</span><br><span class="line"> {</span><br><span class="line"> <span class="keyword">for</span> (<span class="built_in">int</span> j = <span class="number">0</span>; j < row; j++)</span><br><span class="line"> {</span><br><span class="line"> MatrixZwei[i, j] = iMatrix[i, j];</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">for</span> (i = <span class="number">0</span>; i < row; i++)</span><br><span class="line"> {</span><br><span class="line"> <span class="keyword">for</span> (<span class="built_in">int</span> j = row; j < row * <span class="number">2</span>; j++)</span><br><span class="line"> {</span><br><span class="line"> MatrixZwei[i, j] = <span class="number">0</span>;</span><br><span class="line"> <span class="keyword">if</span> (i + row == j)</span><br><span class="line"> MatrixZwei[i, j] = <span class="number">1</span>;</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="keyword">for</span> (i = <span class="number">0</span>; i < row; i++)</span><br><span class="line"> {</span><br><span class="line"> <span class="keyword">if</span> (MatrixZwei[i, i] != <span class="number">0</span>)</span><br><span class="line"> {</span><br><span class="line"> <span class="built_in">double</span> intTemp = MatrixZwei[i, i];</span><br><span class="line"> <span class="keyword">for</span> (<span class="built_in">int</span> j = <span class="number">0</span>; j < row * <span class="number">2</span>; j++)</span><br><span class="line"> {</span><br><span class="line"> MatrixZwei[i, j] = MatrixZwei[i, j] / intTemp;</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">for</span> (<span class="built_in">int</span> j = <span class="number">0</span>; j < row; j++)</span><br><span class="line"> {</span><br><span class="line"> <span class="keyword">if</span> (j == i)</span><br><span class="line"> <span class="keyword">continue</span>;</span><br><span class="line"> <span class="built_in">double</span> intTemp = MatrixZwei[j, i];</span><br><span class="line"> <span class="keyword">for</span> (<span class="built_in">int</span> k = <span class="number">0</span>; k < row * <span class="number">2</span>; k++)</span><br><span class="line"> {</span><br><span class="line"> MatrixZwei[j, k] = MatrixZwei[j, k] - MatrixZwei[i, k] * intTemp;</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="keyword">for</span> (i = <span class="number">0</span>; i < row; i++)</span><br><span class="line"> {</span><br><span class="line"> <span class="keyword">for</span> (<span class="built_in">int</span> j = <span class="number">0</span>; j < row; j++)</span><br><span class="line"> {</span><br><span class="line"> iMatrixInv[i, j] = MatrixZwei[i, j + row];</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">return</span> iMatrixInv;</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="comment"><span class="doctag">///</span> <span class="doctag"><summary></span> </span></span><br><span class="line"> <span class="comment"><span class="doctag">///</span> 矩阵加法 </span></span><br><span class="line"> <span class="comment"><span class="doctag">///</span> <span class="doctag"></summary></span> </span></span><br><span class="line"> <span class="comment"><span class="doctag">///</span> <span class="doctag"><param name= "MatrixEin "></span> <span class="doctag"></param></span> </span></span><br><span class="line"> <span class="comment"><span class="doctag">///</span> <span class="doctag"><param name= "MatrixZwei "></span> <span class="doctag"></param></span> </span></span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">static</span> <span class="built_in">double</span>[,] AddMatrix(<span class="built_in">double</span>[,] MatrixEin, <span class="built_in">double</span>[,] MatrixZwei)</span><br><span class="line"> {</span><br><span class="line"> <span class="built_in">double</span>[,] MatrixResult = <span class="keyword">new</span> <span class="built_in">double</span>[MatrixEin.GetLength(<span class="number">0</span>), MatrixZwei.GetLength(<span class="number">1</span>)];</span><br><span class="line"> <span class="keyword">for</span> (<span class="built_in">int</span> i = <span class="number">0</span>; i < MatrixEin.GetLength(<span class="number">0</span>); i++)</span><br><span class="line"> <span class="keyword">for</span> (<span class="built_in">int</span> j = <span class="number">0</span>; j < MatrixZwei.GetLength(<span class="number">1</span>); j++)</span><br><span class="line"> MatrixResult[i, j] = MatrixEin[i, j] + MatrixZwei[i, j];</span><br><span class="line"> <span class="keyword">return</span> MatrixResult;</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="comment"><span class="doctag">///</span> <span class="doctag"><summary></span> </span></span><br><span class="line"> <span class="comment"><span class="doctag">///</span> 矩阵减法 </span></span><br><span class="line"> <span class="comment"><span class="doctag">///</span> <span class="doctag"></summary></span> </span></span><br><span class="line"> <span class="comment"><span class="doctag">///</span> <span class="doctag"><param name= "MatrixEin "></span> <span class="doctag"></param></span> </span></span><br><span class="line"> <span class="comment"><span class="doctag">///</span> <span class="doctag"><param name= "MatrixZwei "></span> <span class="doctag"></param></span> </span></span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">static</span> <span class="built_in">double</span>[,] SubMatrix(<span class="built_in">double</span>[,] MatrixEin, <span class="built_in">double</span>[,] MatrixZwei)</span><br><span class="line"> {</span><br><span class="line"> <span class="built_in">double</span>[,] MatrixResult = <span class="keyword">new</span> <span class="built_in">double</span>[MatrixEin.GetLength(<span class="number">0</span>), MatrixZwei.GetLength(<span class="number">1</span>)];</span><br><span class="line"> <span class="keyword">for</span> (<span class="built_in">int</span> i = <span class="number">0</span>; i < MatrixEin.GetLength(<span class="number">0</span>); i++)</span><br><span class="line"> <span class="keyword">for</span> (<span class="built_in">int</span> j = <span class="number">0</span>; j < MatrixZwei.GetLength(<span class="number">1</span>); j++)</span><br><span class="line"> MatrixResult[i, j] = MatrixEin[i, j] - MatrixZwei[i, j];</span><br><span class="line"> <span class="keyword">return</span> MatrixResult;</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="comment"><span class="doctag">///</span> <span class="doctag"><summary></span> </span></span><br><span class="line"> <span class="comment"><span class="doctag">///</span> 矩阵乘法 </span></span><br><span class="line"> <span class="comment"><span class="doctag">///</span> <span class="doctag"></summary></span> </span></span><br><span class="line"> <span class="comment"><span class="doctag">///</span> <span class="doctag"><param name= "MatrixEin "></span> <span class="doctag"></param></span> </span></span><br><span class="line"> <span class="comment"><span class="doctag">///</span> <span class="doctag"><param name= "MatrixZwei "></span> <span class="doctag"></param></span> </span></span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">static</span> <span class="built_in">double</span>[,] MultiplyMatrix(<span class="built_in">double</span>[,] MatrixEin, <span class="built_in">double</span>[,] MatrixZwei)</span><br><span class="line"> {</span><br><span class="line"> <span class="built_in">double</span>[,] MatrixResult = <span class="keyword">new</span> <span class="built_in">double</span>[MatrixEin.GetLength(<span class="number">0</span>), MatrixZwei.GetLength(<span class="number">1</span>)];</span><br><span class="line"> <span class="keyword">for</span> (<span class="built_in">int</span> i = <span class="number">0</span>; i < MatrixEin.GetLength(<span class="number">0</span>); i++)</span><br><span class="line"> {</span><br><span class="line"> <span class="keyword">for</span> (<span class="built_in">int</span> j = <span class="number">0</span>; j < MatrixZwei.GetLength(<span class="number">1</span>); j++)</span><br><span class="line"> {</span><br><span class="line"> <span class="keyword">for</span> (<span class="built_in">int</span> k = <span class="number">0</span>; k < MatrixEin.GetLength(<span class="number">1</span>); k++)</span><br><span class="line"> {</span><br><span class="line"> MatrixResult[i, j] += MatrixEin[i, k] * MatrixZwei[k, j];</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">return</span> MatrixResult;</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="comment"><span class="doctag">///</span> <span class="doctag"><summary></span> </span></span><br><span class="line"> <span class="comment"><span class="doctag">///</span> 矩阵对应行列式的值 </span></span><br><span class="line"> <span class="comment"><span class="doctag">///</span> <span class="doctag"></summary></span> </span></span><br><span class="line"> <span class="comment"><span class="doctag">///</span> <span class="doctag"><param name= "MatrixEin "></span> <span class="doctag"></param></span> </span></span><br><span class="line"> <span class="comment"><span class="doctag">///</span> <span class="doctag"><returns></span> <span class="doctag"></returns></span> </span></span><br><span class="line"> <span class="function"><span class="keyword">public</span> <span class="keyword">static</span> <span class="built_in">double</span> <span class="title">ResultDeterminant</span>(<span class="params"><span class="built_in">double</span>[,] MatrixEin</span>)</span></span><br><span class="line"> {</span><br><span class="line"> <span class="keyword">return</span> MatrixEin[<span class="number">0</span>, <span class="number">0</span>] * MatrixEin[<span class="number">1</span>, <span class="number">1</span>] * MatrixEin[<span class="number">2</span>, <span class="number">2</span>] + MatrixEin[<span class="number">0</span>, <span class="number">1</span>] * MatrixEin[<span class="number">1</span>, <span class="number">2</span>] * MatrixEin[<span class="number">2</span>, <span class="number">0</span>] + MatrixEin[<span class="number">0</span>, <span class="number">2</span>] * MatrixEin[<span class="number">1</span>, <span class="number">0</span>] * MatrixEin[<span class="number">2</span>, <span class="number">1</span>]</span><br><span class="line"> - MatrixEin[<span class="number">0</span>, <span class="number">2</span>] * MatrixEin[<span class="number">1</span>, <span class="number">1</span>] * MatrixEin[<span class="number">2</span>, <span class="number">0</span>] - MatrixEin[<span class="number">0</span>, <span class="number">1</span>] * MatrixEin[<span class="number">1</span>, <span class="number">0</span>] * MatrixEin[<span class="number">2</span>, <span class="number">2</span>] - MatrixEin[<span class="number">0</span>, <span class="number">0</span>] * MatrixEin[<span class="number">1</span>, <span class="number">2</span>] * MatrixEin[<span class="number">2</span>, <span class="number">1</span>];</span><br><span class="line"></span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"> }</span><br><span class="line">}</span><br><span class="line"></span><br></pre></td></tr></table></figure><h2 id="窗口代码"><a href="#窗口代码" class="headerlink" title="窗口代码"></a>窗口代码</h2><figure class="highlight csharp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br><span class="line">112</span><br><span class="line">113</span><br><span class="line">114</span><br><span class="line">115</span><br><span class="line">116</span><br><span class="line">117</span><br><span class="line">118</span><br><span class="line">119</span><br><span class="line">120</span><br><span class="line">121</span><br><span class="line">122</span><br><span class="line">123</span><br><span class="line">124</span><br><span class="line">125</span><br><span class="line">126</span><br><span class="line">127</span><br><span class="line">128</span><br><span class="line">129</span><br><span class="line">130</span><br><span class="line">131</span><br><span class="line">132</span><br><span class="line">133</span><br><span class="line">134</span><br><span class="line">135</span><br><span class="line">136</span><br><span class="line">137</span><br><span class="line">138</span><br><span class="line">139</span><br><span class="line">140</span><br><span class="line">141</span><br><span class="line">142</span><br><span class="line">143</span><br><span class="line">144</span><br><span class="line">145</span><br><span class="line">146</span><br><span class="line">147</span><br><span class="line">148</span><br><span class="line">149</span><br><span class="line">150</span><br><span class="line">151</span><br><span class="line">152</span><br><span class="line">153</span><br><span class="line">154</span><br><span class="line">155</span><br><span class="line">156</span><br><span class="line">157</span><br><span class="line">158</span><br><span class="line">159</span><br><span class="line">160</span><br><span class="line">161</span><br><span class="line">162</span><br><span class="line">163</span><br><span class="line">164</span><br><span class="line">165</span><br><span class="line">166</span><br><span class="line">167</span><br><span class="line">168</span><br><span class="line">169</span><br><span class="line">170</span><br><span class="line">171</span><br><span class="line">172</span><br><span class="line">173</span><br><span class="line">174</span><br><span class="line">175</span><br><span class="line">176</span><br><span class="line">177</span><br><span class="line">178</span><br><span class="line">179</span><br><span class="line">180</span><br><span class="line">181</span><br><span class="line">182</span><br><span class="line">183</span><br><span class="line">184</span><br><span class="line">185</span><br><span class="line">186</span><br><span class="line">187</span><br><span class="line">188</span><br><span class="line">189</span><br><span class="line">190</span><br><span class="line">191</span><br><span class="line">192</span><br><span class="line">193</span><br><span class="line">194</span><br><span class="line">195</span><br><span class="line">196</span><br><span class="line">197</span><br><span class="line">198</span><br><span class="line">199</span><br><span class="line">200</span><br><span class="line">201</span><br><span class="line">202</span><br><span class="line">203</span><br><span class="line">204</span><br><span class="line">205</span><br><span class="line">206</span><br><span class="line">207</span><br><span class="line">208</span><br><span class="line">209</span><br><span class="line">210</span><br><span class="line">211</span><br><span class="line">212</span><br><span class="line">213</span><br><span class="line">214</span><br><span class="line">215</span><br><span class="line">216</span><br><span class="line">217</span><br><span class="line">218</span><br><span class="line">219</span><br><span class="line">220</span><br><span class="line">221</span><br><span class="line">222</span><br><span class="line">223</span><br><span class="line">224</span><br><span class="line">225</span><br><span class="line">226</span><br><span class="line">227</span><br><span class="line">228</span><br><span class="line">229</span><br><span class="line">230</span><br><span class="line">231</span><br><span class="line">232</span><br><span class="line">233</span><br><span class="line">234</span><br><span class="line">235</span><br><span class="line">236</span><br><span class="line">237</span><br><span class="line">238</span><br><span class="line">239</span><br><span class="line">240</span><br><span class="line">241</span><br><span class="line">242</span><br><span class="line">243</span><br><span class="line">244</span><br><span class="line">245</span><br><span class="line">246</span><br><span class="line">247</span><br><span class="line">248</span><br><span class="line">249</span><br><span class="line">250</span><br><span class="line">251</span><br><span class="line">252</span><br><span class="line">253</span><br><span class="line">254</span><br><span class="line">255</span><br><span class="line">256</span><br><span class="line">257</span><br><span class="line">258</span><br><span class="line">259</span><br><span class="line">260</span><br><span class="line">261</span><br><span class="line">262</span><br><span class="line">263</span><br><span class="line">264</span><br><span class="line">265</span><br><span class="line">266</span><br><span class="line">267</span><br><span class="line">268</span><br><span class="line">269</span><br><span class="line">270</span><br><span class="line">271</span><br><span class="line">272</span><br><span class="line">273</span><br><span class="line">274</span><br><span class="line">275</span><br><span class="line">276</span><br><span class="line">277</span><br><span class="line">278</span><br><span class="line">279</span><br><span class="line">280</span><br><span class="line">281</span><br><span class="line">282</span><br><span class="line">283</span><br><span class="line">284</span><br><span class="line">285</span><br><span class="line">286</span><br><span class="line">287</span><br><span class="line">288</span><br><span class="line">289</span><br><span class="line">290</span><br><span class="line">291</span><br><span class="line">292</span><br><span class="line">293</span><br><span class="line">294</span><br><span class="line">295</span><br><span class="line">296</span><br><span class="line">297</span><br><span class="line">298</span><br><span class="line">299</span><br><span class="line">300</span><br><span class="line">301</span><br><span class="line">302</span><br><span class="line">303</span><br><span class="line">304</span><br><span class="line">305</span><br><span class="line">306</span><br><span class="line">307</span><br><span class="line">308</span><br><span class="line">309</span><br><span class="line">310</span><br><span class="line">311</span><br><span class="line">312</span><br><span class="line">313</span><br><span class="line">314</span><br><span class="line">315</span><br><span class="line">316</span><br><span class="line">317</span><br><span class="line">318</span><br><span class="line">319</span><br><span class="line">320</span><br><span class="line">321</span><br><span class="line">322</span><br><span class="line">323</span><br><span class="line">324</span><br><span class="line">325</span><br><span class="line">326</span><br><span class="line">327</span><br><span class="line">328</span><br><span class="line">329</span><br><span class="line">330</span><br><span class="line">331</span><br><span class="line">332</span><br><span class="line">333</span><br><span class="line">334</span><br><span class="line">335</span><br><span class="line">336</span><br><span class="line">337</span><br><span class="line">338</span><br><span class="line">339</span><br><span class="line">340</span><br><span class="line">341</span><br><span class="line">342</span><br><span class="line">343</span><br><span class="line">344</span><br><span class="line">345</span><br><span class="line">346</span><br><span class="line">347</span><br><span class="line">348</span><br><span class="line">349</span><br><span class="line">350</span><br><span class="line">351</span><br><span class="line">352</span><br><span class="line">353</span><br><span class="line">354</span><br><span class="line">355</span><br><span class="line">356</span><br><span class="line">357</span><br><span class="line">358</span><br><span class="line">359</span><br><span class="line">360</span><br><span class="line">361</span><br><span class="line">362</span><br><span class="line">363</span><br><span class="line">364</span><br><span class="line">365</span><br><span class="line">366</span><br><span class="line">367</span><br><span class="line">368</span><br><span class="line">369</span><br><span class="line">370</span><br><span class="line">371</span><br><span class="line">372</span><br><span class="line">373</span><br><span class="line">374</span><br><span class="line">375</span><br><span class="line">376</span><br><span class="line">377</span><br><span class="line">378</span><br><span class="line">379</span><br><span class="line">380</span><br><span class="line">381</span><br><span class="line">382</span><br><span class="line">383</span><br><span class="line">384</span><br><span class="line">385</span><br><span class="line">386</span><br><span class="line">387</span><br><span class="line">388</span><br><span class="line">389</span><br><span class="line">390</span><br><span class="line">391</span><br><span class="line">392</span><br><span class="line">393</span><br><span class="line">394</span><br><span class="line">395</span><br><span class="line">396</span><br><span class="line">397</span><br><span class="line">398</span><br><span class="line">399</span><br><span class="line">400</span><br><span class="line">401</span><br><span class="line">402</span><br><span class="line">403</span><br><span class="line">404</span><br><span class="line">405</span><br><span class="line">406</span><br><span class="line">407</span><br><span class="line">408</span><br><span class="line">409</span><br><span class="line">410</span><br><span class="line">411</span><br><span class="line">412</span><br><span class="line">413</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">using</span> System;</span><br><span class="line"><span class="keyword">using</span> System.Collections.Generic;</span><br><span class="line"><span class="keyword">using</span> System.ComponentModel;</span><br><span class="line"><span class="keyword">using</span> System.Data;</span><br><span class="line"><span class="keyword">using</span> System.Drawing;</span><br><span class="line"><span class="keyword">using</span> System.Linq;</span><br><span class="line"><span class="keyword">using</span> System.Text;</span><br><span class="line"><span class="keyword">using</span> System.Threading.Tasks;</span><br><span class="line"><span class="keyword">using</span> System.Windows.Forms;</span><br><span class="line"><span class="keyword">using</span> System.Data.SqlClient;</span><br><span class="line"><span class="keyword">using</span> System.Data;</span><br><span class="line"><span class="keyword">using</span> System.IO;</span><br><span class="line"><span class="keyword">using</span> System.Text.RegularExpressions;</span><br><span class="line"></span><br><span class="line"><span class="keyword">namespace</span> <span class="title">GPS</span>卫星坐标与单点定位计算</span><br><span class="line">{</span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">partial</span> <span class="keyword">class</span> <span class="title">Form1</span> : <span class="title">Form</span></span><br><span class="line"> {</span><br><span class="line"> List<Canshu> cslist = <span class="keyword">new</span> List<Canshu>();</span><br><span class="line"> <span class="built_in">string</span>[] info = <span class="literal">null</span>;</span><br><span class="line"> <span class="function"><span class="keyword">public</span> <span class="title">Form1</span>(<span class="params"></span>)</span></span><br><span class="line"> {</span><br><span class="line"> InitializeComponent();</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="function"><span class="keyword">private</span> <span class="keyword">void</span> <span class="title">label2_Click</span>(<span class="params"><span class="built_in">object</span> sender, EventArgs e</span>)</span></span><br><span class="line"> {</span><br><span class="line"></span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="function"><span class="keyword">private</span> <span class="keyword">void</span> <span class="title">splitContainer2_Panel1_Paint</span>(<span class="params"><span class="built_in">object</span> sender, PaintEventArgs e</span>)</span></span><br><span class="line"> {</span><br><span class="line"></span><br><span class="line"> }</span><br><span class="line"> <span class="comment"><span class="doctag">///</span> <span class="doctag"><summary></span></span></span><br><span class="line"> <span class="comment"><span class="doctag">///</span> 打开文件</span></span><br><span class="line"> <span class="comment"><span class="doctag">///</span> <span class="doctag"></summary></span></span></span><br><span class="line"> <span class="comment"><span class="doctag">///</span> <span class="doctag"><param name="sender"></span><span class="doctag"></param></span></span></span><br><span class="line"> <span class="comment"><span class="doctag">///</span> <span class="doctag"><param name="e"></span><span class="doctag"></param></span></span></span><br><span class="line"> <span class="keyword">private</span> <span class="keyword">void</span> 打开OToolStripMenuItem_Click(<span class="built_in">object</span> sender, EventArgs e)</span><br><span class="line"> {</span><br><span class="line"> OpenFileDialog pdlg = <span class="keyword">new</span> OpenFileDialog();</span><br><span class="line"> pdlg.Filter = <span class="string">"所有文件|*.*"</span>;</span><br><span class="line"> DialogResult rt = pdlg.ShowDialog();</span><br><span class="line"> <span class="keyword">if</span> (rt == DialogResult.OK)</span><br><span class="line"> {</span><br><span class="line"> <span class="built_in">string</span> filename = pdlg.FileName;</span><br><span class="line"> info = File.ReadAllLines(filename);</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> <span class="comment"><span class="doctag">///</span> <span class="doctag"><summary></span></span></span><br><span class="line"> <span class="comment"><span class="doctag">///</span> 分割字符串</span></span><br><span class="line"> <span class="comment"><span class="doctag">///</span> <span class="doctag"></summary></span></span></span><br><span class="line"> <span class="comment"><span class="doctag">///</span> <span class="doctag"><param name="sender"></span><span class="doctag"></param></span></span></span><br><span class="line"> <span class="comment"><span class="doctag">///</span> <span class="doctag"><param name="e"></span><span class="doctag"></param></span></span></span><br><span class="line"> <span class="keyword">private</span> <span class="keyword">void</span> 分割字符串ToolStripMenuItem_Click(<span class="built_in">object</span> sender, EventArgs e)</span><br><span class="line"> {</span><br><span class="line"> <span class="built_in">int</span> row = info.Length;</span><br><span class="line"> MessageBox.Show(<span class="string">"共"</span>+row.ToString()+<span class="string">"条数据"</span>);</span><br><span class="line"> <span class="built_in">int</span> ii = <span class="number">0</span>;</span><br><span class="line"> <span class="built_in">string</span> find = <span class="string">""</span>;</span><br><span class="line"> <span class="keyword">for</span> (ii = <span class="number">0</span>; ii < row<span class="number">-1</span>; ii++)</span><br><span class="line"> {</span><br><span class="line"> find = info[ii];</span><br><span class="line"> find = find.Trim();</span><br><span class="line"> <span class="keyword">if</span> (find == <span class="string">"END OF HEADER"</span>)</span><br><span class="line"> <span class="keyword">break</span>;</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">for</span>(ii=ii+<span class="number">1</span>;ii<row;ii=ii+<span class="number">8</span>)</span><br><span class="line"> {</span><br><span class="line"> Canshu canshu;</span><br><span class="line"> <span class="built_in">int</span> i = ii;</span><br><span class="line"> <span class="built_in">string</span> iline =info[i];</span><br><span class="line"> Regex re = <span class="keyword">new</span> Regex(<span class="string">@"(\d+(\.\d+)?)"</span>);</span><br><span class="line"> MatchCollection iarray = re.Matches(iline);</span><br><span class="line"></span><br><span class="line"> canshu.year = <span class="built_in">int</span>.Parse(iarray[<span class="number">1</span>].Value);</span><br><span class="line"> canshu.month = <span class="built_in">int</span>.Parse(iarray[<span class="number">2</span>].Value);</span><br><span class="line"> canshu.day = <span class="built_in">int</span>.Parse(iarray[<span class="number">3</span>].Value);</span><br><span class="line"> canshu.hour = <span class="built_in">int</span>.Parse(iarray[<span class="number">4</span>].Value);</span><br><span class="line"> canshu.minute = <span class="built_in">int</span>.Parse(iarray[<span class="number">5</span>].Value);</span><br><span class="line"> canshu.second = <span class="built_in">double</span>.Parse(iarray[<span class="number">6</span>].Value);</span><br><span class="line"> canshu.prn = <span class="built_in">int</span>.Parse(iarray[<span class="number">0</span>].Value);</span><br><span class="line"></span><br><span class="line"> <span class="built_in">double</span>[,] all = <span class="keyword">new</span> <span class="built_in">double</span>[<span class="number">7</span>, <span class="number">4</span>];</span><br><span class="line"> <span class="built_in">string</span>[] starray = <span class="keyword">new</span> <span class="built_in">string</span>[<span class="number">7</span>]; <span class="built_in">int</span> m = <span class="number">0</span>;</span><br><span class="line"> <span class="keyword">for</span> (<span class="built_in">int</span> k = i + <span class="number">1</span>; k < i + <span class="number">8</span>; k++, m++)</span><br><span class="line"> {</span><br><span class="line"> iline = info[k];</span><br><span class="line"> starray[m] = iline;</span><br><span class="line"> }</span><br><span class="line"> <span class="built_in">string</span> stallof = <span class="string">""</span>;</span><br><span class="line"> <span class="keyword">foreach</span> (<span class="built_in">string</span> strs <span class="keyword">in</span> starray)</span><br><span class="line"> {</span><br><span class="line"> stallof = stallof + strs;</span><br><span class="line"> }</span><br><span class="line"> Regex p = <span class="keyword">new</span> Regex(<span class="string">@"(-??\d?[.]\d{12}['D'][+-]\d\d)"</span>);</span><br><span class="line"> MatchCollection collection = p.Matches(stallof);</span><br><span class="line"> <span class="built_in">double</span>[] alls = <span class="keyword">new</span> <span class="built_in">double</span>[<span class="number">28</span>];</span><br><span class="line"> <span class="keyword">for</span> (<span class="built_in">int</span> n = <span class="number">0</span>; n < <span class="number">25</span>; n++)<span class="comment"><span class="doctag">///</span><span class="doctag">///</span>/</span></span><br><span class="line"> {</span><br><span class="line"> <span class="built_in">string</span>[] temst = collection[n].Value.Split(<span class="string">'D'</span>);</span><br><span class="line"> alls[n] = <span class="built_in">double</span>.Parse(temst[<span class="number">0</span>]) * Math.Pow(<span class="number">10</span>, <span class="built_in">double</span>.Parse(temst[<span class="number">1</span>]));</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">for</span> (<span class="built_in">int</span> a = <span class="number">0</span>; a < <span class="number">7</span>; a++)</span><br><span class="line"> {</span><br><span class="line"> <span class="keyword">for</span> (<span class="built_in">int</span> b = <span class="number">0</span>; b < <span class="number">4</span>; b++)</span><br><span class="line"> all[a, b] = alls[(<span class="number">4</span> * a) + b];</span><br><span class="line"> }</span><br><span class="line"> canshu.a = Math.Pow(all[<span class="number">1</span>, <span class="number">3</span>], <span class="number">2</span>);</span><br><span class="line"> canshu.cic = all[<span class="number">2</span>, <span class="number">1</span>];</span><br><span class="line"> canshu.cis = all[<span class="number">2</span>, <span class="number">3</span>];</span><br><span class="line"> canshu.crc = all[<span class="number">3</span>, <span class="number">1</span>];</span><br><span class="line"> canshu.crs = all[<span class="number">0</span>, <span class="number">1</span>];</span><br><span class="line"> canshu.cuc = all[<span class="number">1</span>, <span class="number">0</span>];</span><br><span class="line"> canshu.cus = all[<span class="number">1</span>, <span class="number">2</span>];</span><br><span class="line"> canshu.dn = all[<span class="number">0</span>, <span class="number">2</span>];</span><br><span class="line"> canshu.e = all[<span class="number">1</span>, <span class="number">1</span>];</span><br><span class="line"> canshu.idot = all[<span class="number">4</span>, <span class="number">0</span>];</span><br><span class="line"> canshu.io = all[<span class="number">3</span>, <span class="number">0</span>];</span><br><span class="line"> canshu.mo = all[<span class="number">0</span>, <span class="number">3</span>];</span><br><span class="line"> canshu.omega = all[<span class="number">3</span>, <span class="number">2</span>];</span><br><span class="line"> canshu.OMEGA = all[<span class="number">2</span>, <span class="number">2</span>];</span><br><span class="line"> canshu.to = all[<span class="number">2</span>, <span class="number">0</span>];</span><br><span class="line"> canshu.OMEGA_DOT = all[<span class="number">3</span>, <span class="number">3</span>];</span><br><span class="line"> canshu.gpsweek = all[<span class="number">4</span>, <span class="number">2</span>];</span><br><span class="line"> cslist.Add(canshu);</span><br><span class="line"> }</span><br><span class="line"> MessageBox.Show(<span class="string">"ok"</span>);</span><br><span class="line"> }</span><br><span class="line"> <span class="comment"><span class="doctag">///</span> <span class="doctag"><summary></span></span></span><br><span class="line"> <span class="comment"><span class="doctag">///</span> 查看</span></span><br><span class="line"> <span class="comment"><span class="doctag">///</span> <span class="doctag"></summary></span></span></span><br><span class="line"> <span class="comment"><span class="doctag">///</span> <span class="doctag"><param name="sender"></span><span class="doctag"></param></span></span></span><br><span class="line"> <span class="comment"><span class="doctag">///</span> <span class="doctag"><param name="e"></span><span class="doctag"></param></span></span></span><br><span class="line"> <span class="function"><span class="keyword">private</span> <span class="keyword">void</span> <span class="title">button1_Click</span>(<span class="params"><span class="built_in">object</span> sender, EventArgs e</span>)</span></span><br><span class="line"> {</span><br><span class="line"> <span class="keyword">if</span> (textBox1.Text == <span class="string">""</span>)</span><br><span class="line"> {</span><br><span class="line"> DataBase db2 = <span class="keyword">new</span> DataBase();</span><br><span class="line"> DataSet ds = <span class="keyword">new</span> DataSet();</span><br><span class="line"> db2.WatchDatabase(<span class="keyword">ref</span> ds);</span><br><span class="line"> dataGridView1.DataSource = ds.Tables[<span class="number">0</span>];</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">else</span></span><br><span class="line"> {</span><br><span class="line"> <span class="built_in">string</span> sprn = textBox1.Text;</span><br><span class="line"> <span class="built_in">string</span> year, month, day, hour, minute, second;</span><br><span class="line"> <span class="built_in">string</span> date = dateTimePicker3.Value.ToShortDateString();</span><br><span class="line"> <span class="built_in">string</span>[] sd=date.Split(<span class="string">'/'</span>);</span><br><span class="line"> year = sd[<span class="number">0</span>];</span><br><span class="line"> year = year.Substring(year.Length - <span class="number">1</span>);</span><br><span class="line"> month = sd[<span class="number">1</span>];</span><br><span class="line"> day = sd[<span class="number">2</span>];</span><br><span class="line"> <span class="built_in">string</span> time = dateTimePicker4.Value.ToLongTimeString();</span><br><span class="line"> <span class="built_in">string</span>[] st = time.Split(<span class="string">':'</span>);</span><br><span class="line"> hour = st[<span class="number">0</span>];</span><br><span class="line"> minute = st[<span class="number">1</span>];</span><br><span class="line"> second = st[<span class="number">2</span>];</span><br><span class="line"> DataBase db2 = <span class="keyword">new</span> DataBase();</span><br><span class="line"> DataSet ds = <span class="keyword">new</span> DataSet();</span><br><span class="line"> <span class="built_in">string</span> pre = <span class="string">" Where ( prn = "</span> + sprn + <span class="string">" and year = "</span> + year + <span class="string">" and month = "</span> + month + <span class="string">" and day = "</span> + day + <span class="string">" and hour = "</span> + hour + <span class="string">" and minute = "</span> + minute + <span class="string">" and second = "</span> + second + <span class="string">")"</span>;</span><br><span class="line"> db2.WatchDatabase(<span class="keyword">ref</span> ds, <span class="string">"wxc"</span>, pre);</span><br><span class="line"> dataGridView1.DataSource = ds.Tables[<span class="number">0</span>];</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> <span class="comment"><span class="doctag">///</span> <span class="doctag"><summary></span></span></span><br><span class="line"> <span class="comment"><span class="doctag">///</span> 参数装入数据库</span></span><br><span class="line"> <span class="comment"><span class="doctag">///</span> <span class="doctag"></summary></span></span></span><br><span class="line"> <span class="comment"><span class="doctag">///</span> <span class="doctag"><param name="sender"></span><span class="doctag"></param></span></span></span><br><span class="line"> <span class="comment"><span class="doctag">///</span> <span class="doctag"><param name="e"></span><span class="doctag"></param></span></span></span><br><span class="line"> <span class="keyword">private</span> <span class="keyword">void</span> 参数装入数据库ToolStripMenuItem_Click(<span class="built_in">object</span> sender, EventArgs e)</span><br><span class="line"> {</span><br><span class="line"> <span class="keyword">foreach</span> (Canshu canshu <span class="keyword">in</span> cslist)</span><br><span class="line"> {</span><br><span class="line"> DataBase db = <span class="keyword">new</span> DataBase();</span><br><span class="line"> db.InsertDatabase(canshu);</span><br><span class="line"> }</span><br><span class="line"> MessageBox.Show(<span class="string">"ok"</span>);</span><br><span class="line"> }</span><br><span class="line"> <span class="comment"><span class="doctag">///</span> <span class="doctag"><summary></span></span></span><br><span class="line"> <span class="comment"><span class="doctag">///</span> 卫星坐标计算与显示</span></span><br><span class="line"> <span class="comment"><span class="doctag">///</span> <span class="doctag"></summary></span></span></span><br><span class="line"> <span class="comment"><span class="doctag">///</span> <span class="doctag"><param name="sender"></span><span class="doctag"></param></span></span></span><br><span class="line"> <span class="comment"><span class="doctag">///</span> <span class="doctag"><param name="e"></span><span class="doctag"></param></span></span></span><br><span class="line"> <span class="function"><span class="keyword">private</span> <span class="keyword">void</span> <span class="title">button2_Click</span>(<span class="params"><span class="built_in">object</span> sender, EventArgs e</span>)</span></span><br><span class="line"> {</span><br><span class="line"> <span class="built_in">bool</span> bool1 = radioButton1.Checked;</span><br><span class="line"> <span class="built_in">bool</span> bool2 = radioButton2.Checked;</span><br><span class="line"> <span class="keyword">if</span> (bool1 == <span class="literal">false</span> && bool2 == <span class="literal">false</span>)</span><br><span class="line"> {</span><br><span class="line"> MessageBox.Show(<span class="string">"请选择计算类型"</span>);</span><br><span class="line"> }</span><br><span class="line"> <span class="built_in">string</span> y1, mon1, d1, h1, min1, s1, y2, mon2, d2, h2, min2, s2;</span><br><span class="line"> y1 = textBox8.Text;</span><br><span class="line"> mon1 = textBox9.Text;</span><br><span class="line"> d1 = textBox10.Text;</span><br><span class="line"> h1 = textBox11.Text;</span><br><span class="line"> min1 = textBox12.Text;</span><br><span class="line"> s1 = textBox13.Text;</span><br><span class="line"> y2 = textBox14.Text;</span><br><span class="line"> mon2 = textBox15.Text;</span><br><span class="line"> d2 = textBox16.Text;</span><br><span class="line"> h2 = textBox17.Text;</span><br><span class="line"> min2 = textBox18.Text;</span><br><span class="line"> s2 = textBox19.Text;</span><br><span class="line"> <span class="built_in">string</span> sprn = richTextBox1.Text;</span><br><span class="line"> <span class="built_in">string</span>[] sprns = sprn.Split(<span class="string">','</span>);</span><br><span class="line"> <span class="built_in">int</span> yp, monp, dp, hp, minp, yq, monq, dq, hq, minq;</span><br><span class="line"> <span class="built_in">double</span> sp, sq;</span><br><span class="line"> <span class="comment">//第一种情况:单颗卫星已知星历下的坐标</span></span><br><span class="line"> <span class="keyword">if</span> (bool1 == <span class="literal">true</span>)</span><br><span class="line"> {</span><br><span class="line"> yp = <span class="built_in">int</span>.Parse(y1);</span><br><span class="line"> monp = <span class="built_in">int</span>.Parse(mon1);</span><br><span class="line"> dp = <span class="built_in">int</span>.Parse(d1);</span><br><span class="line"> hp = <span class="built_in">int</span>.Parse(h1);</span><br><span class="line"> minp = <span class="built_in">int</span>.Parse(min1);</span><br><span class="line"> sp = <span class="built_in">double</span>.Parse(s1);</span><br><span class="line"> SatelliteCoordinate sc = <span class="keyword">new</span> SatelliteCoordinate(yp, monp, dp, hp, minp, sp);</span><br><span class="line"> DataSet ds2 = <span class="keyword">new</span> DataSet();</span><br><span class="line"> ds2 = sc.EphemerisCac(sprns[<span class="number">0</span>]);</span><br><span class="line"> dataGridView2.DataSource = ds2.Tables[<span class="number">0</span>];</span><br><span class="line"> }</span><br><span class="line"> <span class="comment">//第二种情况:求取多颗卫星某一时段的坐标</span></span><br><span class="line"> <span class="keyword">if</span> (bool2 == <span class="literal">true</span>)</span><br><span class="line"> {</span><br><span class="line"> <span class="keyword">if</span> (y2 == <span class="string">""</span> && mon2 == <span class="string">""</span> && d2 == <span class="string">""</span> && h2 == <span class="string">""</span> && min2 == <span class="string">""</span> && s2 == <span class="string">""</span>)</span><br><span class="line"> MessageBox.Show(<span class="string">"请完善参数!"</span>);</span><br><span class="line"> <span class="keyword">else</span></span><br><span class="line"> {</span><br><span class="line"> yp = <span class="built_in">int</span>.Parse(y1);</span><br><span class="line"> monp = <span class="built_in">int</span>.Parse(mon1);</span><br><span class="line"> dp = <span class="built_in">int</span>.Parse(d1);</span><br><span class="line"> hp = <span class="built_in">int</span>.Parse(h1);</span><br><span class="line"> minp = <span class="built_in">int</span>.Parse(min1);</span><br><span class="line"> yq = <span class="built_in">int</span>.Parse(y2);</span><br><span class="line"> monq = <span class="built_in">int</span>.Parse(mon2);</span><br><span class="line"> dq = <span class="built_in">int</span>.Parse(d2);</span><br><span class="line"> hq = <span class="built_in">int</span>.Parse(h2);</span><br><span class="line"> minq = <span class="built_in">int</span>.Parse(min2);</span><br><span class="line"> sp = <span class="built_in">double</span>.Parse(s1);</span><br><span class="line"> sq = <span class="built_in">double</span>.Parse(s2);</span><br><span class="line"> <span class="built_in">double</span> dsecond = (hq - hp) * <span class="number">3600</span> + (minq - minp) * <span class="number">60</span>;</span><br><span class="line"> <span class="built_in">int</span> count = Convert.ToInt32(dsecond / <span class="number">60</span>);</span><br><span class="line"> <span class="built_in">double</span> id = <span class="number">0</span>;</span><br><span class="line"> <span class="keyword">for</span> (<span class="built_in">int</span> i = <span class="number">0</span>; i < count; i++, minp++)</span><br><span class="line"> {</span><br><span class="line"> <span class="keyword">for</span> (<span class="built_in">int</span> j = <span class="number">0</span>; j < sprns.Length; j++)</span><br><span class="line"> {</span><br><span class="line"> SatelliteCoordinate sc = <span class="keyword">new</span> SatelliteCoordinate(yp, monp, dp, hp, minp, sp);</span><br><span class="line"> sc.CoordinateCac(sprns[j]);</span><br><span class="line"> <span class="keyword">if</span> (minp >= <span class="number">59</span>)</span><br><span class="line"> {</span><br><span class="line"> hp = hp + <span class="number">1</span>;</span><br><span class="line"> minp = <span class="number">0</span>;</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> DataSet ds = <span class="keyword">new</span> DataSet();</span><br><span class="line"> DataBase db = <span class="keyword">new</span> DataBase();</span><br><span class="line"> db.WatchDatabase(<span class="keyword">ref</span> ds, <span class="string">"xyz"</span>);</span><br><span class="line"> dataGridView2.DataSource = ds.Tables[<span class="number">0</span>];</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> } </span><br><span class="line"></span><br><span class="line"> <span class="function"><span class="keyword">private</span> <span class="keyword">void</span> <span class="title">tabPage2_Click</span>(<span class="params"><span class="built_in">object</span> sender, EventArgs e</span>)</span></span><br><span class="line"> {</span><br><span class="line"></span><br><span class="line"> }</span><br><span class="line"> <span class="comment"><span class="doctag">///</span> <span class="doctag"><summary></span></span></span><br><span class="line"> <span class="comment"><span class="doctag">///</span> 单点定位前端</span></span><br><span class="line"> <span class="comment"><span class="doctag">///</span> <span class="doctag"></summary></span></span></span><br><span class="line"> <span class="comment"><span class="doctag">///</span> <span class="doctag"><param name="sender"></span><span class="doctag"></param></span></span></span><br><span class="line"> <span class="comment"><span class="doctag">///</span> <span class="doctag"><param name="e"></span><span class="doctag"></param></span></span></span><br><span class="line"> <span class="function"><span class="keyword">private</span> <span class="keyword">void</span> <span class="title">button3_Click</span>(<span class="params"><span class="built_in">object</span> sender, EventArgs e</span>)</span></span><br><span class="line"> {</span><br><span class="line"> XYZ xyz0 = <span class="keyword">new</span> XYZ();</span><br><span class="line"> List<XYZ> xyzlist = <span class="keyword">new</span> List<XYZ>();</span><br><span class="line"> <span class="built_in">double</span> x0, y0, z0;</span><br><span class="line"> x0 = <span class="built_in">double</span>.Parse(textBox20.Text);</span><br><span class="line"> y0= <span class="built_in">double</span>.Parse(textBox21.Text);</span><br><span class="line"> z0= <span class="built_in">double</span>.Parse(textBox22.Text);</span><br><span class="line"> <span class="built_in">string</span> year, month, day, hour, minute, second;</span><br><span class="line"> <span class="built_in">string</span> date = dateTimePicker9.Value.ToShortDateString();</span><br><span class="line"> <span class="built_in">string</span>[] sd = date.Split(<span class="string">'/'</span>);</span><br><span class="line"> year = sd[<span class="number">0</span>];</span><br><span class="line"> year = year.Substring(year.Length - <span class="number">1</span>);</span><br><span class="line"> month = sd[<span class="number">1</span>];</span><br><span class="line"> day = sd[<span class="number">2</span>];</span><br><span class="line"> <span class="built_in">string</span> time = dateTimePicker1.Value.ToLongTimeString();</span><br><span class="line"> <span class="built_in">string</span>[] st = time.Split(<span class="string">':'</span>);</span><br><span class="line"> hour = st[<span class="number">0</span>];</span><br><span class="line"> minute = st[<span class="number">1</span>];</span><br><span class="line"> second = st[<span class="number">2</span>];</span><br><span class="line"> DataBase db2 = <span class="keyword">new</span> DataBase();</span><br><span class="line"> DataSet ds = <span class="keyword">new</span> DataSet();</span><br><span class="line"> <span class="built_in">string</span> pre = <span class="string">" Where ( year = "</span> + year + <span class="string">" and month = "</span> + month + <span class="string">" and day = "</span> + day + <span class="string">" and hour = "</span> + hour + <span class="string">" and minute = "</span> + minute + <span class="string">" and second = "</span> + second + <span class="string">")"</span>;</span><br><span class="line"> db2.WatchDatabase(<span class="keyword">ref</span> ds, <span class="string">"wxc"</span>, pre);</span><br><span class="line"> List<Inputdata> idlist = <span class="keyword">new</span> List<Inputdata>();</span><br><span class="line"> <span class="keyword">for</span>(<span class="built_in">int</span> i=<span class="number">0</span>;i< ds.Tables[<span class="number">0</span>].Rows.Count;i++)</span><br><span class="line"> {</span><br><span class="line"> SatelliteCoordinate sc = <span class="keyword">new</span> SatelliteCoordinate(<span class="built_in">int</span>.Parse(year), <span class="built_in">int</span>.Parse(month), <span class="built_in">int</span>.Parse(day), <span class="built_in">int</span>.Parse(hour), <span class="built_in">int</span>.Parse(minute), <span class="built_in">double</span>.Parse(second));</span><br><span class="line"> <span class="built_in">string</span> prns = ds.Tables[<span class="number">0</span>].Rows[i][<span class="number">0</span>].ToString();</span><br><span class="line"> Inputdata ipd = <span class="keyword">new</span> Inputdata();</span><br><span class="line"> ipd=sc.CoordinateCac(prns);</span><br><span class="line"> idlist.Add(ipd);</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">for</span>(<span class="built_in">int</span> i=<span class="number">0</span>;i<idlist.Count;i++)</span><br><span class="line"> {</span><br><span class="line"> xyz0.X = idlist[i].X;</span><br><span class="line"> xyz0.Y = idlist[i].Y;</span><br><span class="line"> xyz0.Z = idlist[i].Z;</span><br><span class="line"> xyzlist.Add(xyz0);</span><br><span class="line"> }</span><br><span class="line"> <span class="built_in">double</span>[,] x = <span class="keyword">new</span> <span class="built_in">double</span>[<span class="number">4</span>, <span class="number">1</span>];</span><br><span class="line"> SinglePoint sp = <span class="keyword">new</span> SinglePoint();</span><br><span class="line"> x = sp.singlecac(xyz0, xyzlist);</span><br><span class="line"> XYZ xyz = <span class="keyword">new</span> XYZ();</span><br><span class="line"> xyz.X = x[<span class="number">0</span>, <span class="number">0</span>]+x0;</span><br><span class="line"> xyz.Y = x[<span class="number">1</span>,<span class="number">0</span>] + y0;</span><br><span class="line"> xyz.Z = x[<span class="number">2</span>, <span class="number">0</span>] + z0;</span><br><span class="line"> CzDatabase cdb = <span class="keyword">new</span> CzDatabase();</span><br><span class="line"> cdb.InsertDatabase(xyz);</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="function"><span class="keyword">private</span> <span class="keyword">void</span> <span class="title">button4_Click</span>(<span class="params"><span class="built_in">object</span> sender, EventArgs e</span>)</span></span><br><span class="line"> {</span><br><span class="line"></span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="function"><span class="keyword">private</span> <span class="keyword">void</span> <span class="title">dateTimePicker1_ValueChanged</span>(<span class="params"><span class="built_in">object</span> sender, EventArgs e</span>)</span></span><br><span class="line"> {</span><br><span class="line"></span><br><span class="line"> }</span><br><span class="line"> <span class="comment"><span class="doctag">///</span> <span class="doctag"><summary></span></span></span><br><span class="line"> <span class="comment"><span class="doctag">///</span> 修改</span></span><br><span class="line"> <span class="comment"><span class="doctag">///</span> <span class="doctag"></summary></span></span></span><br><span class="line"> <span class="comment"><span class="doctag">///</span> <span class="doctag"><param name="sender"></span><span class="doctag"></param></span></span></span><br><span class="line"> <span class="comment"><span class="doctag">///</span> <span class="doctag"><param name="e"></span><span class="doctag"></param></span></span></span><br><span class="line"> <span class="function"><span class="keyword">private</span> <span class="keyword">void</span> <span class="title">button5_Click</span>(<span class="params"><span class="built_in">object</span> sender, EventArgs e</span>)</span></span><br><span class="line"> {</span><br><span class="line"> <span class="built_in">string</span> sprn = textBox2.Text;</span><br><span class="line"> <span class="built_in">string</span> year, month, day, hour, minute, second;</span><br><span class="line"> <span class="built_in">string</span> date = dateTimePicker6.Value.ToShortDateString();</span><br><span class="line"> <span class="built_in">string</span>[] sd = date.Split(<span class="string">'/'</span>);</span><br><span class="line"> year = sd[<span class="number">0</span>];</span><br><span class="line"> year = year.Substring(year.Length - <span class="number">1</span>);</span><br><span class="line"> month = sd[<span class="number">1</span>];</span><br><span class="line"> day = sd[<span class="number">2</span>];</span><br><span class="line"> <span class="built_in">string</span> time = dateTimePicker5.Value.ToLongTimeString();</span><br><span class="line"> <span class="built_in">string</span>[] st = time.Split(<span class="string">':'</span>);</span><br><span class="line"> hour = st[<span class="number">0</span>];</span><br><span class="line"> minute = st[<span class="number">1</span>];</span><br><span class="line"> second = st[<span class="number">2</span>];</span><br><span class="line"> <span class="built_in">string</span> forms = comboBox1.Text;</span><br><span class="line"> <span class="built_in">string</span> after = textBox3.Text;</span><br><span class="line"> DataBase db2 = <span class="keyword">new</span> DataBase();</span><br><span class="line"> DataSet ds = <span class="keyword">new</span> DataSet();</span><br><span class="line"> <span class="built_in">string</span> SQL2 = <span class="string">"update wxc set "</span> +forms+<span class="string">" = "</span>+after+ <span class="string">" Where ( prn = "</span> + sprn + <span class="string">" and year = "</span> + year + <span class="string">" and month = "</span> + month + <span class="string">" and day = "</span> + day + <span class="string">" and hour = "</span> + hour + <span class="string">" and minute = "</span> + minute + <span class="string">" and second = "</span> + second + <span class="string">")"</span>;</span><br><span class="line"> ds=db2.ReviseDatabase(SQL2);</span><br><span class="line"> dataGridView1.DataSource = ds.Tables[<span class="number">0</span>];</span><br><span class="line"> }</span><br><span class="line"> <span class="comment"><span class="doctag">///</span> <span class="doctag"><summary></span></span></span><br><span class="line"> <span class="comment"><span class="doctag">///</span> 删除</span></span><br><span class="line"> <span class="comment"><span class="doctag">///</span> <span class="doctag"></summary></span></span></span><br><span class="line"> <span class="comment"><span class="doctag">///</span> <span class="doctag"><param name="sender"></span><span class="doctag"></param></span></span></span><br><span class="line"> <span class="comment"><span class="doctag">///</span> <span class="doctag"><param name="e"></span><span class="doctag"></param></span></span></span><br><span class="line"> <span class="function"><span class="keyword">private</span> <span class="keyword">void</span> <span class="title">button6_Click</span>(<span class="params"><span class="built_in">object</span> sender, EventArgs e</span>)</span></span><br><span class="line"> {</span><br><span class="line"> <span class="built_in">string</span> sprn = textBox4.Text;</span><br><span class="line"> <span class="built_in">string</span> year, month, day, hour, minute, second;</span><br><span class="line"> <span class="built_in">string</span> date = dateTimePicker7.Value.ToShortDateString();</span><br><span class="line"> <span class="built_in">string</span>[] sd = date.Split(<span class="string">'/'</span>);</span><br><span class="line"> year = sd[<span class="number">0</span>];</span><br><span class="line"> year = year.Substring(year.Length - <span class="number">1</span>);</span><br><span class="line"> month = sd[<span class="number">1</span>];</span><br><span class="line"> day = sd[<span class="number">2</span>];</span><br><span class="line"> <span class="built_in">string</span> time = dateTimePicker8.Value.ToLongTimeString();</span><br><span class="line"> <span class="built_in">string</span>[] st = time.Split(<span class="string">':'</span>);</span><br><span class="line"> hour = st[<span class="number">0</span>];</span><br><span class="line"> minute = st[<span class="number">1</span>];</span><br><span class="line"> second = st[<span class="number">2</span>];</span><br><span class="line"> DataBase db2 = <span class="keyword">new</span> DataBase();</span><br><span class="line"> DataSet ds = <span class="keyword">new</span> DataSet();</span><br><span class="line"> <span class="built_in">string</span> sql=<span class="string">"delete from wxc where ( prn ="</span> + sprn + <span class="string">" and year = "</span> + year + <span class="string">" and month = "</span> + month + <span class="string">" and day = "</span> + day + <span class="string">" and hour = "</span> + hour + <span class="string">" and minute = "</span> + minute + <span class="string">" and second = "</span> + second + <span class="string">")"</span>;</span><br><span class="line"> ds = db2.DeleteDatabase(sql);</span><br><span class="line"> dataGridView1.DataSource = ds.Tables[<span class="number">0</span>];</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">private</span> <span class="keyword">void</span> 保存为文本文档ToolStripMenuItem_Click(<span class="built_in">object</span> sender, EventArgs e)</span><br><span class="line"> {</span><br><span class="line"> <span class="built_in">string</span> FullFileName = <span class="string">"D:\\result.txt"</span>;</span><br><span class="line"> StreamWriter sw = <span class="keyword">new</span> StreamWriter(FullFileName, <span class="literal">true</span>, Encoding.Default);</span><br><span class="line"> <span class="built_in">string</span> str = <span class="string">""</span>;</span><br><span class="line"> <span class="keyword">for</span> (<span class="built_in">int</span> i = <span class="number">0</span>; i < dataGridView2.Rows.Count - <span class="number">1</span>; i++)</span><br><span class="line"> {</span><br><span class="line"> <span class="keyword">for</span> (<span class="built_in">int</span> j = <span class="number">0</span>; j < dataGridView2.Columns.Count; j++)</span><br><span class="line"> {</span><br><span class="line"> str = dataGridView2.Rows[i].Cells[j].Value.ToString().Trim();</span><br><span class="line"> <span class="comment">//if (str.Length < 10)</span></span><br><span class="line"> <span class="comment">// str = str.PadRight(10, ' '); //不够长度的,补齐空格!du</span></span><br><span class="line"> str = str + <span class="string">" "</span>;</span><br><span class="line"> sw.Write(str);</span><br><span class="line"> }</span><br><span class="line"> sw.WriteLine(<span class="string">""</span>);</span><br><span class="line"> }</span><br><span class="line"> sw.Close();</span><br><span class="line"> }</span><br><span class="line"> </span><br><span class="line"> }</span><br><span class="line">}</span><br><span class="line"></span><br></pre></td></tr></table></figure><h2 id="SQL建表"><a href="#SQL建表" class="headerlink" title="SQL建表"></a>SQL建表</h2><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br></pre></td><td class="code"><pre><span class="line">use canshubase</span><br><span class="line">go</span><br><span class="line"><span class="keyword">create</span> <span class="keyword">table</span> wxc</span><br><span class="line">(</span><br><span class="line">prn <span class="type">int</span> <span class="keyword">not</span> <span class="keyword">null</span>,</span><br><span class="line"><span class="keyword">year</span> <span class="type">int</span> ,</span><br><span class="line"><span class="keyword">month</span> <span class="type">int</span>,</span><br><span class="line"><span class="keyword">day</span> <span class="type">int</span>,</span><br><span class="line"><span class="keyword">hour</span> <span class="type">int</span>,</span><br><span class="line"><span class="keyword">minute</span> <span class="type">int</span>,</span><br><span class="line"><span class="keyword">second</span> <span class="type">float</span>,</span><br><span class="line">a <span class="type">float</span>,</span><br><span class="line">dn <span class="type">float</span>,</span><br><span class="line">t0 <span class="type">float</span>,</span><br><span class="line">m0 <span class="type">float</span>,</span><br><span class="line">e <span class="type">float</span>,</span><br><span class="line">omega <span class="type">float</span>,</span><br><span class="line">cuc <span class="type">float</span>,</span><br><span class="line">cus <span class="type">float</span>,</span><br><span class="line">crc <span class="type">float</span>,</span><br><span class="line">crs <span class="type">float</span>,</span><br><span class="line">cic <span class="type">float</span>,</span><br><span class="line">cis <span class="type">float</span>,</span><br><span class="line">idot <span class="type">float</span>,</span><br><span class="line">i0 <span class="type">float</span>,</span><br><span class="line">bigomega <span class="type">float</span>,</span><br><span class="line">bigomegadot <span class="type">float</span>,</span><br><span class="line">)</span><br><span class="line">go</span><br><span class="line">use wxcanshu</span><br><span class="line">go</span><br><span class="line"><span class="keyword">create</span> <span class="keyword">table</span> xyz</span><br><span class="line">(</span><br><span class="line">prn <span class="type">int</span> <span class="keyword">not</span> <span class="keyword">null</span>,</span><br><span class="line"><span class="keyword">year</span> <span class="type">int</span> ,</span><br><span class="line"><span class="keyword">month</span> <span class="type">int</span>,</span><br><span class="line"><span class="keyword">day</span> <span class="type">int</span>,</span><br><span class="line"><span class="keyword">hour</span> <span class="type">int</span>,</span><br><span class="line"><span class="keyword">minute</span> <span class="type">int</span>,</span><br><span class="line"><span class="keyword">second</span> <span class="type">float</span>,</span><br><span class="line">x <span class="type">float</span>,</span><br><span class="line">y <span class="type">float</span>,</span><br><span class="line">z <span class="type">float</span>,</span><br><span class="line">)</span><br><span class="line">go</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">use canshu</span><br><span class="line">go</span><br><span class="line"></span><br><span class="line"><span class="keyword">TRUNCATE</span> <span class="keyword">TABLE</span> xyz</span><br><span class="line">go</span><br><span class="line"></span><br><span class="line"><span class="keyword">select</span> <span class="operator">*</span> <span class="keyword">from</span> xyz </span><br><span class="line">go</span><br><span class="line"></span><br><span class="line"><span class="keyword">create</span> <span class="keyword">table</span> cz</span><br><span class="line">(</span><br><span class="line">x <span class="type">float</span>,</span><br><span class="line">y <span class="type">float</span>,</span><br><span class="line">z <span class="type">float</span></span><br><span class="line">)</span><br><span class="line"></span><br></pre></td></tr></table></figure><h1 id="反思"><a href="#反思" class="headerlink" title="反思"></a>反思</h1><blockquote><p>调试完程序,编写完实习报告。为期五天的测绘编程实习终于告一段落。回顾这五天,时不时通宵修改代码。虽然辛苦,但是也是深有体会。也对自己之后的编程有了一定的教训。<br>首先之后拿到编程任务的时候不要忙着开始写程序,一定要写理清楚题目要求得的东西,程序要实现的功能,如果有窗体的话,规划窗体如何设计,要设置几个类,类与类之间的关系。把必要的计算过程理顺,绘制出流程图,然后再着手写程序。<br>编写程序的时候尽量用面向对象的思路设计,一定避免某一个地方好几百行程序,一定要用函数,减少程序的耦合度。一定要减少代码的冗余度,重复的代码一定要放在函数里,最好是封装到类里。<br>一定要增强程序的健壮性,通过提示,或者增加多种情况讨论来减少由于错误数据传入带来程序的崩掉。在代码编写的过程,一定要加注释,C#在对方法或者类注释的时候在前面打三个“/”就可以产生能够生成一个XML文件的注释形式,这一形式可以在调用的时候有提示。<br>再有就是对数组,列表等遍历的时候,一定考虑超限的问题。</p><p><a href="http://garner.ucsd.edu/pub/">http://garner.ucsd.edu/pub/</a><br>多数可以匿名登录,用户名:anonymous,密码:自己的Email地址<br>met 有M文件<br>nav 有N文件<br><a href="http://garner.ucsd.edu/pub/misc/BadData/">http://garner.ucsd.edu/pub/misc/BadData/</a> 有o文件</p></blockquote><p><a href="http://www.flyne.org/article/379">StarUML类图绘制</a></p>]]></content>
<tags>
<tag> c# </tag>
<tag> GNSS </tag>
</tags>
</entry>
<entry>
<title>基于python实现利用DEM数据计算坡度、坡向</title>
<link href="/2020/06/10/%E5%9F%BA%E4%BA%8Epython%E5%AE%9E%E7%8E%B0%E5%88%A9%E7%94%A8DEM%E6%95%B0%E6%8D%AE%E8%AE%A1%E7%AE%97%E5%9D%A1%E5%BA%A6%E3%80%81%E5%9D%A1%E5%90%91/"/>
<url>/2020/06/10/%E5%9F%BA%E4%BA%8Epython%E5%AE%9E%E7%8E%B0%E5%88%A9%E7%94%A8DEM%E6%95%B0%E6%8D%AE%E8%AE%A1%E7%AE%97%E5%9D%A1%E5%BA%A6%E3%80%81%E5%9D%A1%E5%90%91/</url>
<content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="\assets\css\APlayer.min.css"><script src="\assets\js\APlayer.min.js" class="aplayer-secondary-script-marker"></script><h2 id="基本概念"><a href="#基本概念" class="headerlink" title="基本概念"></a>基本概念</h2><p><strong>DEM数据</strong></p><pre><code>DataMark:CNSDTF-DEMVersion:1.0Unit:MAlpha:0.000000Compress:0.000000X0:258000.000Y0:324000.000DX:22.500DY:22.500Row:321Col:481ValueType:IntegerHzoom:1000 192743 191068 187814 181388 173357 165286 157185 152266 147335 142391 139052 137327 135608 130633 124014 117372 118908 123706 128495 133265 138026 139540 139440 139337 135994 131025 127669 124312 120947 119208 125633 135280 141643 149598 155913 160612 162106 163600 160300 160203 158500 156795 155094 151780 148466 143534 138590 133632 130287 126935 125208 126733 133122 136259 137773 139280 142407 143916 142199 142101 </code></pre><p><strong>坡度</strong><br><img src="https://img-blog.csdnimg.cn/20200610233101124.png" alt="在这里插入图片描述"><br>坡度是法线与铅垂线之间的夹角。如图2.2所示,利用坡度计算公式$\alpha=arctan \sqrt{f_x^2+f_y^2}$ ,进行求解。<br><strong>坡向</strong><br><img src="https://img-blog.csdnimg.cn/20200610233621788.png" alt="在这里插入图片描述"><br>坡向是法线在水平面上的投影与正北方向之间的夹角(顺时针度量)。如图2.3所示,利用坡向计算公式$A = \arctan \frac$ , 求解。</p><h2 id="程序流程"><a href="#程序流程" class="headerlink" title="程序流程"></a>程序流程</h2><p><img src="https://img-blog.csdnimg.cn/20200610233919356.png" alt="在这里插入图片描述"><br><img src="https://img-blog.csdnimg.cn/20200610233950490.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NTU2MTM1Nw==,size_16,color_FFFFFF,t_70" alt="在这里插入图片描述"></p><p>2)计算各点梯度<br><img src="https://img-blog.csdnimg.cn/20200610234043841.png" alt="在这里插入图片描述"></p><p>如图3.5所示,可以利用像下面的公式写一个函数进行计算,</p><p>首先计算3*3DEM格网数据的X,Y方向的变化。对于整幅图而言,由于本图像元点不是特别多,故对于边缘的点处理时,可以在栅格点外再加一圈栅格便于求梯度。而添加点的方式只需要把原本边缘的栅格点的高程值复制一遍即可,如图3.6所示。</p><p><img src="https://img-blog.csdnimg.cn/20200610234059566.png" alt="在这里插入图片描述"></p><p>3)解算坡度、坡向<br>如图3.5所示,可以利用下面的公式计算求得坡度和坡向$slop = \arctan \sqrt {slope_x^2 + slope_y^2 } \;\;\;A = \arctan \frac$。在这一过程中可以整体进行计算,从而较为方便地获得坡度和坡向的二维矩阵。</p><p>4)可视化<br>利用python中的绘图库matplotlib,编写了一个可视化函数,利用plot里面的imshow,将之前计算得到的二维矩阵存进去,最后以栅格的方式显示。对于三维DEM显示,利用Axes3D的方法,利用DEM文件中的起始坐标和分辨率推算出各个栅格的坐标,对应出高程值,绘制出三维图形。</p><h2 id="程序代码"><a href="#程序代码" class="headerlink" title="程序代码"></a>程序代码</h2><h3 id="DEMclass模块"><a href="#DEMclass模块" class="headerlink" title="DEMclass模块"></a>DEMclass模块</h3><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br><span class="line">112</span><br><span class="line">113</span><br><span class="line">114</span><br><span class="line">115</span><br><span class="line">116</span><br><span class="line">117</span><br><span class="line">118</span><br><span class="line">119</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">from</span> mpl_toolkits.mplot3d <span class="keyword">import</span> Axes3D</span><br><span class="line"><span class="keyword">from</span> matplotlib <span class="keyword">import</span> cbook</span><br><span class="line"><span class="keyword">from</span> matplotlib <span class="keyword">import</span> cm</span><br><span class="line"><span class="keyword">from</span> matplotlib.colors <span class="keyword">import</span> LightSource</span><br><span class="line"><span class="keyword">import</span> matplotlib.pyplot <span class="keyword">as</span> plt</span><br><span class="line"><span class="keyword">import</span> numpy <span class="keyword">as</span> np</span><br><span class="line"><span class="keyword">import</span> re</span><br><span class="line"><span class="keyword">import</span> math</span><br><span class="line"><span class="comment">#####读取文件并处理成numpy并返回</span></span><br><span class="line"><span class="function"><span class="keyword">def</span> <span class="title">readfile</span>():</span></span><br><span class="line"> <span class="keyword">with</span> <span class="built_in">open</span>(<span class="string">'datas.DEM'</span>, <span class="string">'r'</span>, encoding=<span class="string">'utf-8'</span>)<span class="keyword">as</span> file:</span><br><span class="line"> datas = file.readlines()[<span class="number">13</span>:]</span><br><span class="line"> list1 = []</span><br><span class="line"> strs = <span class="string">""</span></span><br><span class="line"> row = <span class="number">321</span></span><br><span class="line"> col = <span class="number">481</span></span><br><span class="line"> npdata = np.zeros((row, col), dtype=np.int16)</span><br><span class="line"> <span class="keyword">for</span> data <span class="keyword">in</span> datas:</span><br><span class="line"> data = data.strip()</span><br><span class="line"> <span class="keyword">if</span> <span class="built_in">len</span>(data) > <span class="number">20</span>:</span><br><span class="line"> strs = strs + <span class="string">" "</span> + data</span><br><span class="line"> <span class="keyword">if</span> <span class="built_in">len</span>(data) < <span class="number">20</span>:</span><br><span class="line"> strs = strs + <span class="string">" "</span> + data</span><br><span class="line"> list1.append(strs)</span><br><span class="line"> strs = <span class="string">""</span></span><br><span class="line"></span><br><span class="line"> <span class="keyword">for</span> i, sitem <span class="keyword">in</span> <span class="built_in">enumerate</span>(list1):</span><br><span class="line"> item = <span class="built_in">str</span>(sitem).strip()</span><br><span class="line"> <span class="comment"># item=item.split(" ")</span></span><br><span class="line"> item = re.findall(<span class="string">r'\d+'</span>, item)</span><br><span class="line"> <span class="keyword">for</span> j, one <span class="keyword">in</span> <span class="built_in">enumerate</span>(item): <span class="comment"># i是序号,one是数值</span></span><br><span class="line"> npdata[i][j] = <span class="built_in">int</span>(one)</span><br><span class="line"> <span class="keyword">return</span> npdata</span><br><span class="line"><span class="comment">#####在原栅格图像周围加一圈并返回</span></span><br><span class="line"><span class="function"><span class="keyword">def</span> <span class="title">AddRound</span>(<span class="params">npgrid</span>):</span></span><br><span class="line"> ny, nx = npgrid.shape <span class="comment"># ny:行数,nx:列数</span></span><br><span class="line"> zbc=np.zeros((ny+<span class="number">2</span>,nx+<span class="number">2</span>))</span><br><span class="line"> zbc[<span class="number">1</span>:-<span class="number">1</span>,<span class="number">1</span>:-<span class="number">1</span>]=npgrid</span><br><span class="line"> <span class="comment">#四边</span></span><br><span class="line"> zbc[<span class="number">0</span>,<span class="number">1</span>:-<span class="number">1</span>]=npgrid[<span class="number">0</span>,:]</span><br><span class="line"> zbc[-<span class="number">1</span>,<span class="number">1</span>:-<span class="number">1</span>]=npgrid[-<span class="number">1</span>,:]</span><br><span class="line"> zbc[<span class="number">1</span>:-<span class="number">1</span>,<span class="number">0</span>]=npgrid[:,<span class="number">0</span>]</span><br><span class="line"> zbc[<span class="number">1</span>:-<span class="number">1</span>,-<span class="number">1</span>]=npgrid[:,-<span class="number">1</span>]</span><br><span class="line"> <span class="comment">#角点</span></span><br><span class="line"> zbc[<span class="number">0</span>,<span class="number">0</span>]=npgrid[<span class="number">0</span>,<span class="number">0</span>]</span><br><span class="line"> zbc[<span class="number">0</span>,-<span class="number">1</span>]=npgrid[<span class="number">0</span>,-<span class="number">1</span>]</span><br><span class="line"> zbc[-<span class="number">1</span>,<span class="number">0</span>]=npgrid[-<span class="number">1</span>,<span class="number">0</span>]</span><br><span class="line"> zbc[-<span class="number">1</span>,-<span class="number">1</span>]=npgrid[-<span class="number">1</span>,<span class="number">0</span>]</span><br><span class="line"> <span class="keyword">return</span> zbc</span><br><span class="line"><span class="comment">#####计算xy方向的梯度</span></span><br><span class="line"><span class="function"><span class="keyword">def</span> <span class="title">Cacdxdy</span>(<span class="params">npgrid,sizex,sizey</span>):</span></span><br><span class="line"> zbc=AddRound(npgrid)</span><br><span class="line"> dx=((zbc[<span class="number">1</span>:-<span class="number">1</span>,:-<span class="number">2</span>])-(zbc[<span class="number">1</span>:-<span class="number">1</span>,<span class="number">2</span>:]))/sizex/<span class="number">2</span>/<span class="number">1000</span></span><br><span class="line"> dy=((zbc[<span class="number">2</span>:,<span class="number">1</span>:-<span class="number">1</span>])-(zbc[:-<span class="number">2</span>,<span class="number">1</span>:-<span class="number">1</span>]))/sizey/<span class="number">2</span>/<span class="number">1000</span></span><br><span class="line"> dx=dx[<span class="number">1</span>:-<span class="number">1</span>,<span class="number">1</span>:-<span class="number">1</span>]</span><br><span class="line"> dy=dy[<span class="number">1</span>:-<span class="number">1</span>,<span class="number">1</span>:-<span class="number">1</span>]</span><br><span class="line"> np.savetxt(<span class="string">"dxdy.csv"</span>,dx,delimiter=<span class="string">","</span>)</span><br><span class="line"> <span class="keyword">return</span> dx,dy</span><br><span class="line"><span class="comment">####计算坡度\坡向</span></span><br><span class="line"><span class="function"><span class="keyword">def</span> <span class="title">CacSlopAsp</span>(<span class="params">dx,dy</span>):</span></span><br><span class="line"> slope=(np.arctan(np.sqrt(dx*dx+dy*dy)))*<span class="number">57.29578</span> <span class="comment">#转换成°</span></span><br><span class="line"> slope=slope[<span class="number">1</span>:-<span class="number">1</span>,<span class="number">1</span>:-<span class="number">1</span>]</span><br><span class="line"> <span class="comment">#坡向</span></span><br><span class="line"> a=np.zeros([dx.shape[<span class="number">0</span>],dx.shape[<span class="number">1</span>]]).astype(np.float32)</span><br><span class="line"> <span class="keyword">for</span> i <span class="keyword">in</span> <span class="built_in">range</span>(dx.shape[<span class="number">0</span>]):</span><br><span class="line"> <span class="keyword">for</span> j <span class="keyword">in</span> <span class="built_in">range</span>(dx.shape[<span class="number">1</span>]):</span><br><span class="line"> x=<span class="built_in">float</span>(dx[i,j])</span><br><span class="line"> y=<span class="built_in">float</span>(dy[i,j])</span><br><span class="line"> <span class="keyword">if</span> (x==<span class="number">0.</span>)& (y==<span class="number">0.</span>):</span><br><span class="line"> a[i,j]=-<span class="number">1</span></span><br><span class="line"> <span class="keyword">elif</span> x==<span class="number">0.</span>:</span><br><span class="line"> <span class="keyword">if</span> y><span class="number">0.</span>:</span><br><span class="line"> a[i,j]=<span class="number">0.</span></span><br><span class="line"> <span class="keyword">else</span>:</span><br><span class="line"> a[i,j]=<span class="number">180.</span></span><br><span class="line"> <span class="keyword">elif</span> y==<span class="number">0.</span>:</span><br><span class="line"> <span class="keyword">if</span> x><span class="number">0</span>:</span><br><span class="line"> a[i,j]=<span class="number">90.</span></span><br><span class="line"> <span class="keyword">else</span>:</span><br><span class="line"> a[i,j]=<span class="number">270.</span></span><br><span class="line"> <span class="keyword">else</span>:</span><br><span class="line"> a[i,j]=<span class="built_in">float</span>(math.atan(y/x))*<span class="number">57.29578</span></span><br><span class="line"> <span class="keyword">if</span> a[i,j]<<span class="number">0.</span>:</span><br><span class="line"> a[i,j]=<span class="number">90.</span>-a[i,j]</span><br><span class="line"> <span class="keyword">elif</span> a[i,j]><span class="number">90.</span>:</span><br><span class="line"> a[i,j]=<span class="number">450.</span>-a[i,j]</span><br><span class="line"> <span class="keyword">else</span>:</span><br><span class="line"> a[i,j]=<span class="number">90.</span>-a[i,j]</span><br><span class="line"> <span class="keyword">return</span> slope,a</span><br><span class="line"><span class="comment">####绘制平面栅格图</span></span><br><span class="line"><span class="function"><span class="keyword">def</span> <span class="title">Drawgrid</span>(<span class="params">judge,pre=[],A=[],strs=<span class="string">""</span></span>):</span></span><br><span class="line"> <span class="keyword">if</span> judge==<span class="number">0</span>:</span><br><span class="line"> <span class="keyword">if</span> strs == <span class="string">""</span>:</span><br><span class="line"> plt.imshow(A, interpolation=<span class="string">'nearest'</span>, cmap=plt.cm.hot, origin=<span class="string">'lower'</span>) <span class="comment"># cmap='bone' cmap=plt.cm.hot</span></span><br><span class="line"> plt.colorbar(shrink=<span class="number">0.8</span>)</span><br><span class="line"> plt.xticks(())</span><br><span class="line"> plt.yticks(())</span><br><span class="line"> plt.show()</span><br><span class="line"> <span class="keyword">else</span>:</span><br><span class="line"> plt.imshow(A, interpolation=<span class="string">'nearest'</span>, cmap=strs, origin=<span class="string">'lower'</span>) <span class="comment"># cmap='bone' cmap=plt.cm.hot</span></span><br><span class="line"> plt.colorbar(shrink=<span class="number">0.8</span>)</span><br><span class="line"> xt=<span class="built_in">range</span>(<span class="number">258000</span>, <span class="number">268822</span>,<span class="number">22</span>)</span><br><span class="line"> yt=<span class="built_in">range</span>(<span class="number">324000</span>, <span class="number">331222</span>,<span class="number">22</span>)</span><br><span class="line"> plt.xticks(())</span><br><span class="line"> plt.yticks(())</span><br><span class="line"> plt.show()</span><br><span class="line"> <span class="keyword">elif</span> judge==<span class="number">1</span>:</span><br><span class="line"> fig = plt.figure()</span><br><span class="line"> ax = Axes3D(fig)</span><br><span class="line"> <span class="comment"># X = np.arange(1,482,1)</span></span><br><span class="line"> <span class="comment"># Y = np.arange(1,322,1)</span></span><br><span class="line"> X = np.arange(<span class="number">258000.000</span>, <span class="number">268822.500</span>, <span class="number">22.5</span>)</span><br><span class="line"> Y = np.arange(<span class="number">324000.000</span>, <span class="number">331222.500</span>, <span class="number">22.5</span>)</span><br><span class="line"> X, Y = np.meshgrid(X, Y)</span><br><span class="line"> Z = pre</span><br><span class="line"> ax.plot_surface(X, Y, Z, rstride=<span class="number">1</span>, cstride=<span class="number">1</span>, cmap=plt.get_cmap(<span class="string">'rainbow'</span>)) <span class="comment"># cmap=plt.get_cmap('rainbow')</span></span><br><span class="line"> ax.contourf(X, Y, Z, zdir=<span class="string">'z'</span>, offset=-<span class="number">2</span>, cmap=plt.cm.hot)</span><br><span class="line"> ax.set_zlim(<span class="number">0</span>, <span class="number">200000</span>)</span><br><span class="line"> plt.show()</span><br></pre></td></tr></table></figure><h3 id="主函数"><a href="#主函数" class="headerlink" title="主函数"></a>主函数</h3><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> DEMclass <span class="keyword">as</span> dem</span><br><span class="line"><span class="keyword">from</span> DEMclass <span class="keyword">import</span> Drawgrid</span><br><span class="line"><span class="keyword">import</span> numpy <span class="keyword">as</span> np</span><br><span class="line"><span class="comment">####程序入口</span></span><br><span class="line"><span class="keyword">if</span> __name__==<span class="string">'__main__'</span>:</span><br><span class="line"> npgrid=dem.readfile()</span><br><span class="line"> pre=npgrid</span><br><span class="line"> npgrid=dem.AddRound(npgrid)</span><br><span class="line"> dx,dy=dem.Cacdxdy(npgrid,<span class="number">22.5</span>,<span class="number">22.5</span>)</span><br><span class="line"> slope,arf=dem.CacSlopAsp(dx,dy)</span><br><span class="line"> dem.np.savetxt(<span class="string">"slope.csv"</span>,slope,delimiter=<span class="string">","</span>)</span><br><span class="line"> <span class="comment">#绘制三维DEM</span></span><br><span class="line"> Drawgrid(judge=<span class="number">1</span>,pre=pre)</span><br><span class="line"> <span class="comment">#绘制二维DEM</span></span><br><span class="line"> Drawgrid(judge=<span class="number">0</span>,A=pre,strs=<span class="string">"bone"</span>)</span><br><span class="line"> <span class="comment">#绘制坡度图</span></span><br><span class="line"> Drawgrid(judge=<span class="number">0</span>,A=slope,strs=<span class="string">"rainbow"</span>)</span><br><span class="line"> <span class="comment">#绘制坡向图</span></span><br><span class="line"> Drawgrid(judge=<span class="number">0</span>,A=arf)</span><br></pre></td></tr></table></figure><h2 id="效果图"><a href="#效果图" class="headerlink" title="效果图"></a>效果图</h2><p>三维图:<br><img src="https://img-blog.csdnimg.cn/20200610234752608.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NTU2MTM1Nw==,size_16,color_FFFFFF,t_70" alt="在这里插入图片描述"><br>二维DEM:<br><img src="https://img-blog.csdnimg.cn/20200610234806344.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NTU2MTM1Nw==,size_16,color_FFFFFF,t_70" alt="在这里插入图片描述"><br>坡度图:<br><img src="https://img-blog.csdnimg.cn/20200610234819846.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NTU2MTM1Nw==,size_16,color_FFFFFF,t_70" alt="在这里插入图片描述"><br>坡向图:<br><img src="https://img-blog.csdnimg.cn/20200610234831418.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NTU2MTM1Nw==,size_16,color_FFFFFF,t_70" alt="在这里插入图片描述"></p><h2 id="参考资料"><a href="#参考资料" class="headerlink" title="参考资料"></a>参考资料</h2><blockquote><p>1.Python的地形三维可视化——简介Matplotlib和gdal<br><a href="https://blog.csdn.net/allenlu2008/article/details/51880333">https://blog.csdn.net/allenlu2008/article/details/51880333</a><br>2.Pycharm中配置GDAL库的一种方法<br><a href="https://blog.csdn.net/qq_35960361/article/details/96438650">https://blog.csdn.net/qq_35960361/article/details/96438650</a><br>3.python 调用gdal 处理dem数据<br><a href="https://blog.csdn.net/qq_15642411/article/details/79123677">https://blog.csdn.net/qq_15642411/article/details/79123677</a><br>4.适用于Python扩展程序包的非官方Windows二进制文件——GDAL<br><a href="https://www.lfd.uci.edu/~gohlke/pythonlibs/#gdal">https://www.lfd.uci.edu/~gohlke/pythonlibs/#gdal</a><br>5.python gdal安装与简单使用<br><a href="https://blog.csdn.net/nima1994/article/details/79207805/">https://blog.csdn.net/nima1994/article/details/79207805/</a><br>pip install GDAL-2.4.1-cp37-cp37m-win_amd64.whl<br>6.(目测有用)【GDAL】python读取DEM计算坡度与坡向<br><a href="https://blog.csdn.net/qq_37935516/article/details/85028979">https://blog.csdn.net/qq_37935516/article/details/85028979</a><br>7.arcgis计算坡度、坡向<br><a href="http://help.arcgis.com/zh-cn/arcgisdesktop/10.0/help/index.html#//009z000000vz000000">http://help.arcgis.com/zh-cn/arcgisdesktop/10.0/help/index.html#//009z000000vz000000</a><br>8.C语言实现GDAL使用DEM数据计算坡度坡向<br><a href="https://blog.csdn.net/liminlu0314/article/details/8498985">https://blog.csdn.net/liminlu0314/article/details/8498985</a><br>9.gdal在python功能(官方)<br><a href="https://gdal.org/python/index.html">https://gdal.org/python/index.html</a><br>10.玩转python的正则表达式|提取字符串中的所有数字<br><a href="https://blog.csdn.net/guanyonglai/article/details/89512659">https://blog.csdn.net/guanyonglai/article/details/89512659</a><br><a href="https://blog.csdn.net/u011436427/article/details/82628597">https://blog.csdn.net/u011436427/article/details/82628597</a><br>可视化<br>1.三维图(目测有用)<br><a href="https://blog.51cto.com/9291927/2435621">https://blog.51cto.com/9291927/2435621</a><br>2.地图+热力图(可以用于坡度坡向)<br><a href="https://www.zhihu.com/question/33783546">https://www.zhihu.com/question/33783546</a><br>3.统计<br><a href="https://www.cnblogs.com/dudududu/p/9149762.html">https://www.cnblogs.com/dudududu/p/9149762.html</a><br>4.turtle库<br><a href="https://blog.csdn.net/weixin_44078196/article/details/10065651">https://blog.csdn.net/weixin_44078196/article/details/10065651</a></p></blockquote>]]></content>
<categories>
<category> python </category>
</categories>
<tags>
<tag> python </tag>
<tag> matplotlib </tag>
<tag> GIS </tag>
</tags>
</entry>
</search>