- 博客(58)
- 资源 (7)
- 收藏
- 关注
原创 C# WPF实现TextBox屏蔽非法字符
本篇文章总结一下,如何在WPF中,通过PreviewKeyDown事件,实现在TextBox中只允许输入数字,屏蔽非法字符。以前用Winform时,我习惯用KeyPress事件管控TextBox中的字符输入,但是在WPF中,发现没有KeyPress事件了...经过一番研究,发现可以用PreviewKeyDown事件代替。这里说明一下,除了PreviewKeyDown事件,另外还有个KeyDown事件,也可以实现类似的功能,不过和PreviewKeyDown相比,KeyDown事件并不完美,因为有些按键不
2021-03-23 10:10:02
2523
2
原创 C#动态加载第三方DLL
C#动态加载第三方DLL当我们需要加载第三方非托管DLL时,通常会直接使用DllImport的方式,代码如下:[DllImport("GetFile.dll", CallingConvention = CallingConvention.StdCall, CharSet = CharSet.Unicode)]static extern string GetFileData(string fileName);上图的调用方式,默认GetFile.dll文件位于与调用程序(.exe文件)相同.
2021-01-14 15:14:59
11933
原创 C# ShowCursor使用心得
在C#中,可通过ShowCursor()函数,进行光标的显示和隐藏,使用方式如下:1. 首先引用命名空间:using System.Runtime.InteropServices;2. 写入以下语句:[DllImport("user32", EntryPoint = "ShowCursor")]public extern staticintShowCursor(bool sho...
2019-10-20 22:09:03
1744
原创 VS2019 Emgu CV环境搭建
C/C++中用的是OpenCV,而C#里用的则是EmguCV。EmguCV是使用.NET编程语言(C#)对OpenCV函数进行了封装,使其可以在.NET平台上调用OpenCV的功能。对于刚开始接触EmguCV的人来说,如果配置不好会有异常。经过网上查找资料并实践,我目前已解决报错问题,下面把环境搭建过程写出来供大家参考。我电脑是Win10 64位家庭版,EmguCV版本是libemgucv-w...
2019-10-18 23:17:10
4788
原创 C# EMGU 3.4.1学习笔记(十二)示例程序:直方图均衡化(彩色图像)
本示例是《OpenCV3编程入门》中7.5.3中的示例程序的C# + EMGU 3.4.1版,演示了如何用EqualizeHist()函数进行图像的直方图均衡化。原书代码仅演示了对灰度图像的直方图均衡化,对此我做了一些改变,从而可对彩色图像进行直方图均衡化。彩色图像的直方图均衡化说明由于opencv自带的函数是对灰度图像进行直方图均衡化的,所以在需要对彩色图像进行直方图均衡化时,不可直...
2018-09-26 21:53:21
2132
原创 C# EMGU 3.4.1学习笔记(十一)示例程序:仿射变换
本示例是《OpenCV3编程入门》中7.4.5中的示例程序的C# + EMGU 3.4.1版,演示了以WarpAffine和GetRotationMatrix2D函数为核心的对图像进行仿射变换的操作。using System;using System.Collections.Generic;using System.Linq;using System.Text;using Syste...
2018-09-26 16:41:30
2448
1
原创 C# EMGU 3.4.1学习笔记(十)综合示例:实现多种重映射
本示例是《OpenCV3编程入门》中7.3.4中的综合示例程序的C# + EMGU 3.4.1版,演示了重映射函数remap的用法,并可以通过按键控制四种不同的映射模式。其中要变换的四种模式如下:1. 图像宽高缩小一半,并居中显示:映射方法函数h(i,j) = (2 * j - src.cols / 2 + 0.5, 2 * i - src.rows / 2 + 0.5),所有成对的参...
2018-09-26 11:42:53
625
原创 C# EMGU 3.4.1学习笔记(九)示例程序:基本重映射
本示例是《OpenCV3编程入门》中7.3.2中的示例程序的C# + EMGU 3.4.1版,这个示例演示了重映射函数remap的用法,与C++ OpenCv的版本相比,有如下几点需要注意:1. C# EMGU中,不能用类似map_x.at<float>(i,j)的形式遍历mat中的元素;2. 为了实现mat元素的遍历,替代的方法是,首先获得mat变量的首地址(指针),然后通过...
2018-09-25 23:40:32
757
1
原创 C# EMGU 3.4.1学习笔记(八)示例程序:霍夫圆变换HoughCircles函数
霍夫圆变换的基本思路是认为图像上每一个非零像素点都有可能是一个潜在的圆上的一点,跟霍夫线变换一样,也是通过投票,生成累积坐标平面,设置一个累积权重来定位圆。在笛卡尔坐标系中圆的方程为:其中(a,b)是圆心,r是半径,也可以表述为:即:所以在abr组成的三维坐标系中,一个点可以唯一确定一个圆。 而在笛卡尔的xy坐标系中经过某一点的所有圆映射到abr坐标系中就是一条三维...
2018-09-24 18:08:32
3433
1
原创 C# EMGU 3.4.1学习笔记(七)示例程序:标准霍夫变换HoughLines函数
本示例是《OpenCV3编程入门》中7.2.4的示例程序的C# + EMGU 3.4.1版,关于C# EMGU中的霍夫变换,有如下几点需要注意:1. HoughLines函数检测出来的不是线段,而是(ρ,θ)对,在C++ OpenCv中,使用std::vector<Vec2f> lines来存放,而在C# EMGU中,则用EMGU.CV.Util.VectorOfPointF li...
2018-09-23 22:33:10
4393
4
原创 C# EMGU 3.4.1学习笔记(六)综合示例:边缘检测
本示例是《OpenCV3编程入门》中7.1.6的综合示例的C# + EMGU 3.4.1版,在这个示例程序中,分别演示了canny边缘检测、sobel边缘检测、Laplacian算子,scharr滤波器的使用,经过详细注释的代码如下:using System;using System.Collections.Generic;using System.ComponentModel;usi...
2018-09-22 22:36:21
2152
1
原创 C# EMGU 3.4.1学习笔记(五)示例程序:基本阈值操作
本示例是《OpenCV3编程入门》中6.7.3的示例程序的C# + EMGU 3.4.1版,比较简单,代码如下:using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Linq;usin...
2018-09-20 23:16:18
436
原创 C# EMGU 3.4.1学习笔记(四)综合示例:漫水填充
本示例是《OpenCV3编程入门》中6.5.4的示例程序的C# + EMGU 3.4.1版,和C++程序相比,有以下几点不同:1. 使用winform实现,主要控件有:MenuStrip(用于显示程序操作说明),ImageBox(用于显示图片),RichTextBox(用于记录并显示程序操作过程),TrackBar(用于变更负差最大值和正差最大值)。2. 使用KeyDown事件,实现键盘按...
2018-09-17 16:29:48
1563
原创 C# EMGU 3.4.1学习笔记(三)综合示例:形态学滤波(腐蚀/膨胀、开运算/闭运算、顶帽运算/黑帽运算)
以下是《OpenCV3编程入门》中6.4.9的示例程序的C# + EMGU 3.4.1版:有任何问题或疑问,欢迎交流探讨。using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Lin...
2018-09-03 00:04:48
1992
原创 C# EMGU 3.4.1学习笔记(二)XML和YAML文件的写入
以下是《OpenCV3编程入门》中5.6.3的示例程序的C# + EMGU 3.4.1版,和C++程序相比,有如下几点不同:1. 使用Matrix<>存储多维数组,多维数组的各维需要使用{}扩起来,之间用逗号分隔;2. C#中无法使用<<和>>实现流的输入和输出,对应于<<的是Insert和Write函数,Insert函数只能插入string...
2018-09-01 07:20:00
796
1
原创 C# EMGU 3.4.1学习笔记(一)离散傅里叶变换
最近在学习OpenCV3编程入门(毛星云编著)这本书,书中的示例都是用C++写的,而自己用的是C#,配合EMGU 3.4.1版本,网上的资料非常非常少,很多时候遇到问题,都找不到解决方法。为了记录自己的学习过程,也为了后来的学习者能有资料参考,在此分享自己转化后的C# EMGU3.4.1版本的代码。下面是原书中5.5.8章节的一个示例程序:离散傅里叶变换,我用C#配合EMGU 3.4.1.29...
2018-08-29 10:51:43
3287
3
原创 C#入门经典 第6版 练习4.6(2)
(2)编写一个应用程序,其中包含练习(1)中的逻辑,要求用户输入数字,并显示它们,但拒绝接受两个数字都大于10的情况,并要求用户重新输入。using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;namespace Ch
2017-05-26 18:56:49
799
1
原创 C#入门经典 第6版 练习3.6(5)
(5)编写一个控制台应用程序,要求用户输入4个int值,并显示它们的乘积。using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;namespace Chapter3_5{ class Program
2017-05-25 15:36:21
896
原创 C++ Primer 第5版--练习12.7
练习 12.7:重做上一题,这次使用shared_ptr而不是内置指针。#include #include #include using namespace std;shared_ptr> new_vec(){ auto p = make_shared>(); return p;}shared_ptr> input(shared_ptr> v){
2017-05-20 15:41:55
320
原创 C++ Primer 第5版--练习12.6
练习 12.6:编写函数,返回一个动态分配的int的vector。将此vector传递给另一个函数,这个函数读取标准输入,将读入的值保存在vector元素中。再将vector传递给另一个函数,打印读入的值。记得在恰当的时刻delete vector。#include #include #include using namespace std;vector *new_vec(){
2017-05-20 15:40:07
508
原创 C++ Primer 第5版--练习12.2
练习 12.2:编写你自己的StrBlob类,包含const版本的front和back。#include #include #include #include using namespace std;class StrBlob{public: typedef vector::size_type size_type; StrBlob(); StrBlob
2017-05-19 20:58:14
359
原创 C++ Primer 第5版--练习11.33
练习 11.33:实现你自己版本的单词转换程序。练习 11.34:如果你将transform函数中的find替换为下标运算符,会发生什么情况?练习 11.35:在buildMap中,如果进行如下改写,会有什么效果? trans_map[key] = value.substr(1); 改为trans_map.insert({key, value.substr(1)})
2017-05-15 21:55:34
300
1
原创 C++ Primer 第5版--练习11.31
练习 11.31:编写程序,定义一个作者及其作品的multimap。使用find在multimap中查找一个元素并用erase删除它。确保你的程序在元素不在map中时也能正常运行。练习11.32:使用上一题定义的multimap编写一个程序,按字典序打印作者列表和他们的作品。#include #include using namespace std;int main(){
2017-05-15 14:17:04
308
原创 C++ Primer 第5版--练习11.20
练习 11.20:重写11.1节练习(第376)的单词计数程序,使用insert代替下标操作。你认为哪个程序更容易编写和阅读?解释原因。#include #include using namespace std;int main(){ map word_count; string word; while (cin >> word) {
2017-05-14 20:01:01
297
原创 C++ Primer 第5版--练习11.13
练习 11.13:在上一题的程序中,至少有三种创建pair的方法。编写此程序的三个版本,分别采用不同的方法创建pair。解释你认为哪种形式最易于编写和理解,为什么?#include #include #include using namespace std;int main(){ vector student{"Celina", "Amaya", "Fiona", "An
2017-05-14 18:10:35
272
原创 C++ Primer 第5版--练习11.12
练习 11.12:编写程序,读入string和int的序列,将每个string和int存入一个pair中,pair保存在一个vector中。#include #include #include using namespace std;int main(){ vector student{"Celina", "Amaya", "Fiona", "Angel"}; v
2017-05-14 14:32:55
234
原创 C++ Primer 第5版--练习11.7
练习 11.7:定义一个map,关键字是家庭的姓,值是一个vector,保存家中孩子(们)的名。编写代码,实现添加新的家庭以及向已有家庭中添加新的孩子。#include #include #include #include using namespace std;int main(){ map> family = { {"Green", {"Jim", "Kati",
2017-05-12 22:55:05
527
原创 C++ Primer 第5版--练习11.4
练习 11.4:扩展你的程序,忽略大小写和标点。例如,"example."、"example,"和"Example"应该递增相同的计数器。#include #include using namespace std;//将大写字符转变为小写字符string makelower(const string &s){ string temp(s); for (int i
2017-05-11 22:21:16
260
原创 C++ Primer 第5版--练习11.3
练习 11.3:编写你自己的单词计数程序。#include #include using namespace std;int main(){ map word_count; string word; while (cin >> word) ++word_count[word]; for (const auto &w : word_co
2017-05-11 22:16:50
233
原创 C++ Primer 第5版--练习10.37
练习10.37:给定一个包含10个元素的vector,将位置3到7之间的元素按逆序拷贝到一个list中。#include #include #include #include #include using namespace std;int main(){ vector vec = {0,1,2,3,4,5,6,7,8,9}; list lst(5,0);
2017-05-09 00:02:32
286
原创 C++ Primer 第5版--练习10.36.
练习10.36:使用find在一个int的list中查找最后一个值为0的元素。#include #include #include #include using namespace std;int main(){ list lst = {1,0,3,5,0,8,9}; auto zero = find(lst.crbegin(), lst.crend(), 0)
2017-05-07 23:45:21
254
原创 C++ Primer 第5版--练习10.35
练习10.35:使用普通迭代器逆序打印一个vector。#include #include #include using namespace std;int main(){ vector vec = {1,2,3,4,5,6,7}; auto iter = vec.end(); while(iter != vec.begin()) cout
2017-05-07 23:27:56
447
原创 C++ Primer 第5版--练习10.34
练习10.34:使用reverse_iterator逆序打印一个vector。#include #include #include using namespace std;int main(){ vector vec = {1,2,3,4,5,6,7}; for (auto iter = vec.rbegin(); iter != vec.rend(); ++it
2017-05-07 23:26:43
241
原创 C++ Primer 第5版--练习10.33
练习10.33:编写程序,接受三个参数:一个输入文件和两个输出文件的文件名。输入文件保存的应该是整数。使用istream_iterator读取输入文件。使用ostream_iterator将奇数写入第一个输出文件,每个值之后都跟一个空格。将偶数写入第二个文件,每个值都独占一行。#include #include #include using namespace std;int ma
2017-05-07 22:42:25
353
原创 C++ Primer 第5版--练习10.29
练习10.29:编写程序,使用流迭代器读取一个文本文件,存入一个vector中的string里。#include #include #include #include #include using namespace std;int main(){ ifstream in("myfile.txt"); //该文件放在与源文件相同的目录下 istream_it
2017-05-06 23:09:15
324
原创 C++ Primer 第5版--练习10.25
练习 10.25:在 10.3.2 节(第 349 页)的练习中,编写了一个使用 partition 的 biggies 版本。使用 check_size 和 bind 重写此函数。
2017-03-23 00:18:00
353
原创 C++ Primer 第5版--练习10.24
练习 10.24:给定一个 string,使用 bind 和 check_size 在一个 int 的 vector 中查找第一个大于 string 长度的值。
2017-03-22 23:50:41
307
原创 C++ Primer 第5版--练习10.21
练习 10.21:编写一个 lambda,捕获一个局部 int 变量,并递减变量值,直至它变为 0。一旦变量变为 0,再调用 lambda 应该不再递减变量。lambda 应该返回一个 bool 值,指出捕获的变量是否为 0。
2017-03-22 22:10:35
432
Delete Files.rar
2019-05-27
C#入门经典第7版
2018-10-14
Remap实现多种重映射
2018-09-26
边缘检测综合示例
2018-09-22
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人