用Visual C#开发基于OpenCV的Windows应用程序
http://blog.163.com/wangxh_jy/blog/static/28233883201001581640283/
关于详细的配置及程序运行截图,请下载:http://download.csdn.net/source/1127474名为《用Visual C#开发基于OpenCV的Windows应用程序》的文章。
由于百度允许的字数太少了,所以就不贴全部程序了。有需要源程序的话,请下载:http://download.csdn.net/source/1127477
下面是主要的程序:
?using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using Emgu.CV;
using Emgu.Util;
/*
*1、判断一个视频是否读到文件尾,不能用null,要用一个为空类型的IntPtr,就是IntPtr eof = new IntPtr(),看其是否与eof相等
*2、IplImage*,CvCapture*等指针在C#中都用IntPtr来代替,且其中没有cvGetMCvSize函数,故用cvGetImageROI来暂时代替
*3、由于C#中没有取地址符号&,所以在这里所有的取地址都用引用来代替,即ref
*4、OpenCV中的所有的预定义的常量,都封装在Emgu.CV.CvEnum这个枚举类型里面
*/
namespace OpenCV
{
public partial class mainForm : Form
{
IntPtr eof = new IntPtr();
public mainForm()
{
InitializeComponent();
}
private void btnOpen_Click(object sender, EventArgs e)
{
OpenFileDialog ofd = new OpenFileDialog();
ofd.DefaultExt = "*.bmp";
ofd.Filter="BMP files(*.bmp)|*.bmp|JPG files(*.jpg)|*.jpg|AVI files(*.avi)|*.avi";
if(ofd.ShowDialog()==DialogResult.OK)
{
tbxPath.Text = ofd.FileName;
}
else
{
tbxPath.Text = "";
}
}
private void btnOpenImage_Click(object sender, EventArgs e)
{
string path = tbxPath.Text;
if(path=="")
{
MessageBox.Show("Please select an image at first.","Information");
return;
}
else
{
string ext = path.Substring(path.Length - 3,3);
ext = ext.ToLower();
ext = ext.Trim();
if (ext.CompareTo("bmp") != 0 && ext.CompareTo("jpg")!=0)
{
MessageBox.Show("You must select an .bmp or .jpg file at first.", "Information");
return;
}
IntPtr img = CvInvoke.cvLoadImage(path,Emgu.CV.CvEnum.LOAD_IMAGE_TYPE.CV_LOAD_IMAGE_ANYCOLOR);
if(img==eof)
{
MessageBox.Show("Can not open the image.", "Information");
return;
}
CvInvoke.cvNamedWindow(path);
CvInvoke.cvShowImage(path, img);
CvInvoke.cvWaitKey(0);
CvInvoke.cvReleaseImage(ref img);
CvInvoke.cvDestroyWindow(path);
}
}
private void btnOpenAVI_Click(object sender, EventArgs e)
{
string path = tbxPath.Text;
if(path=="")
{
MessageBox.Show("Please select an AVI file at first.", "Information");
return;
}
string ext = path.Substring(path.Length - 3);
ext = ext.ToLower();
ext = ext.Trim();
if(ext.CompareTo("avi")!=0)
{
MessageBox.Show("You must select an AVI file at first.", "Information");
return;
}
IntPtr capture = CvInvoke.cvCreateFileCapture(path);
if(capture==eof)
{
MessageBox.Show("Can not create file capture.", "Information");
return;
}
IntPtr frame;
CvInvoke.cvNamedWindow(path);
double fps = CvInvoke.cvGetCaptureProperty(capture, Emgu.CV.CvEnum.CAP_PROP.CV_CAP_PROP_FPS);
while((frame= CvInvoke.cvQueryFrame(capture))!=eof)
{
CvInvoke.cvShowImage(path,frame);
int ch=CvInvoke.cvWaitKey(1000/(int)fps);
if(ch==13) break;
}
CvInvoke.cvReleaseCapture(ref capture);
CvInvoke.cvDestroyWindow(path);
}
private void btnOpenCamera_Click(object sender, EventArgs e)
{
IntPtr capture = CvInvoke.cvCreateCameraCapture(-1);
if(capture==eof)
{
MessageBox.Show("Can not create camera capture.", "Information");
return;
}
IntPtr frame;
CvInvoke.cvNamedWindow("Camera");
while((frame=CvInvoke.cvQueryFrame(capture))!=eof)
{
CvInvoke.cvShowImage("Camera", frame);
int ch = CvInvoke.cvWaitKey(10);
if (ch == 13) break;
}
CvInvoke.cvReleaseCapture(ref capture);
CvInvoke.cvDestroyWindow("Camera");
}
private void btnSaveImage_Click(object sender, EventArgs e)
{
string txt = tbxPath.Text;
string path;
if(txt=="")
{
MessageBox.Show("Please select an image at first.", "Information");
return;
}
IntPtr oldImg = CvInvoke.cvLoadImage(txt, Emgu.CV.CvEnum.LOAD_IMAGE_TYPE.CV_LOAD_IMAGE_ANYCOLOR);
if(oldImg==eof)
{
MessageBox.Show("can not load the image.", "Information");
return;
}
SaveFileDialog sfd = new SaveFileDialog();
sfd.Filter = "BMP files(*.bmp)|*.bmp|JPG files(*.jpg)|*.jpg";
sfd.DefaultExt = "*.bmp";
if(sfd.ShowDialog()==DialogResult.OK)
{
path = sfd.FileName;
}
else
{
CvInvoke.cvReleaseImage(ref oldImg);
return;
}
CvInvoke.cvSaveImage(path, oldImg);
CvInvoke.cvReleaseImage(ref oldImg);
MessageBox.Show("Saved As the image successfully.","Information");
}
private void btnRgbToGray_Click(object sender, EventArgs e)
{
string path = tbxPath.Text;
if (path == "")
{
MessageBox.Show("Please select an image at first.", "Information");
return;
}
string ext = path.Substring(path.Length - 3, 3);
ext = ext.ToLower();
ext = ext.Trim();
if (ext.CompareTo("bmp") != 0 && ext.CompareTo("jpg") != 0)
{
MessageBox.Show("You must select an .bmp or .jpg file at first.", "Information");
return;
}
IntPtr oldImg = CvInvoke.cvLoadImage(path, Emgu.CV.CvEnum.LOAD_IMAGE_TYPE.CV_LOAD_IMAGE_ANYCOLOR);
if(oldImg==eof)
{
MessageBox.Show("can not load the image:" + path, "Information");
return;
}
MCvRect cr = CvInvoke.cvGetImageROI(oldImg);
int width = cr.width;
int height = cr.height;
IntPtr grayImg = CvInvoke.cvCreateImage(new MCvSize(width,height), Emgu.CV.CvEnum.IPL_DEPTH.IPL_DEPTH_8U,1);
if(grayImg==eof)
{
MessageBox.Show("can not create an image in memory.", "Information");
return;
}
CvInvoke.cvCvtColor(oldImg, grayImg, Emgu.CV.CvEnum.COLOR_CONVERSION.CV_BGR2GRAY);
CvInvoke.cvNamedWindow("灰度图");
CvInvoke.cvShowImage("灰度图", grayImg);
CvInvoke.cvWaitKey(0);
CvInvoke.cvReleaseImage(ref oldImg);
CvInvoke.cvReleaseImage(ref grayImg);
CvInvoke.cvDestroyWindow("灰度图");
}
private void btnCannyImg_Click(object sender, EventArgs e)
{
string path = tbxPath.Text;
if (path == "")
{
MessageBox.Show("Please select an image at first.", "Information");
return;
}
string ext = path.Substring(path.Length - 3, 3);
ext = ext.ToLower();
ext = ext.Trim();
if (ext.CompareTo("bmp") != 0 && ext.CompareTo("jpg") != 0)
{
MessageBox.Show("You must select an .bmp or .jpg file at first.", "Information");
return;
}
IntPtr srcImg = CvInvoke.cvLoadImage(path, Emgu.CV.CvEnum.LOAD_IMAGE_TYPE.CV_LOAD_IMAGE_GRAYSCALE);
if(srcImg==eof)
{
MessageBox.Show("Can not load the image:" + path, "Information");
return;
}
MCvRect crect = CvInvoke.cvGetImageROI(srcImg);
IntPtr dstImg = CvInvoke.cvCreateImage(new MCvSize(crect.width, crect.height), Emgu.CV.CvEnum.IPL_DEPTH.IPL_DEPTH_8U, 1);
int sobel;
double thresh1, thresh2;
CannyWindow cw = new CannyWindow();
cw.ShowDialog();
sobel = cw.sobel;
thresh1 = cw.thresh1;
thresh2 = cw.thresh2;
if (thresh1 == 0 || thresh2 == 0 || sobel == 0) return;
CvInvoke.cvCanny(srcImg, dstImg, thresh1, thresh2, sobel);
CvInvoke.cvNamedWindow("Canny检测");
CvInvoke.cvShowImage("Canny检测", dstImg);
CvInvoke.cvWaitKey(0);
CvInvoke.cvReleaseImage(ref srcImg);
CvInvoke.cvReleaseImage(ref dstImg);
CvInvoke.cvDestroyWindow("Canny检测");
}
private void btnGrayVideo_Click(object sender, EventArgs e)
{
string path = tbxPath.Text;
if (path == "")
{
MessageBox.Show("Please select an AVI file at first.", "Information");
return;
}
string ext = path.Substring(path.Length - 3, 3);
ext = ext.ToLower();
ext = ext.Trim();
if (ext.CompareTo("avi") != 0)
{
MessageBox.Show("You must select an .avi file at first.", "Information");
return;
}
IntPtr capture = CvInvoke.cvCreateFileCapture(path);
if(capture==eof)
{
MessageBox.Show("can not create file capture:" + path, "Information");
return;
}
IntPtr frame=CvInvoke.cvQueryFrame(capture);
if(frame==eof)
{
MessageBox.Show("can not query frame from the capture.", "Information");
return;
}
MCvRect c = CvInvoke.cvGetImageROI(frame);
IntPtr gray = CvInvoke.cvCreateImage(new MCvSize(c.width, c.height), Emgu.CV.CvEnum.IPL_DEPTH.IPL_DEPTH_8U, 1);
CvInvoke.cvNamedWindow("灰度视频");
while((frame=CvInvoke.cvQueryFrame(capture))!=eof)
{
CvInvoke.cvCvtColor(frame, gray, Emgu.CV.CvEnum.COLOR_CONVERSION.CV_BGR2GRAY);
CvInvoke.cvFlip(gray, gray, 0);
CvInvoke.cvShowImage("灰度视频", gray);
int ch = CvInvoke.cvWaitKey(10);
if (ch == 13) break;
}
CvInvoke.cvReleaseCapture(ref capture);
CvInvoke.cvReleaseImage(ref gray);
CvInvoke.cvDestroyWindow("灰度视频");
}
private void btnGrayCamera_Click(object sender, EventArgs e)
{
IntPtr capture = CvInvoke.cvCreateCameraCapture(-1);
if(capture==eof)
{
MessageBox.Show("can not create camera capture.", "Information");
return;
}
IntPtr frame = CvInvoke.cvQueryFrame(capture);
if(frame==eof)
{
MessageBox.Show("can not query frame from capture.", "Information");
return;
}
MCvRect c = CvInvoke.cvGetImageROI(frame);
IntPtr gray = CvInvoke.cvCreateImage(new MCvSize(c.width, c.height), Emgu.CV.CvEnum.IPL_DEPTH.IPL_DEPTH_8U, 1);
CvInvoke.cvNamedWindow("灰度摄像头");
while ((frame = CvInvoke.cvQueryFrame(capture)) != eof)
{
CvInvoke.cvCvtColor(frame, gray, Emgu.CV.CvEnum.COLOR_CONVERSION.CV_BGR2GRAY);
CvInvoke.cvFlip(gray, gray, 0);
CvInvoke.cvShowImage("灰度摄像头", gray);
int ch = CvInvoke.cvWaitKey(10);
if (ch == 13) break;
}
CvInvoke.cvReleaseCapture(ref capture);
CvInvoke.cvReleaseImage(ref gray);
CvInvoke.cvDestroyWindow("灰度摄像头");
}
private void btnCannyVideo_Click(object sender, EventArgs e)
{
string path = tbxPath.Text;
if (path == "")
{
MessageBox.Show("Please select an AVI file at first.", "Information");
return;
}
string ext = path.Substring(path.Length - 3, 3);
ext = ext.ToLower();
ext = ext.Trim();
if (ext.CompareTo("avi") != 0)
{
MessageBox.Show("You must select an .avi file at first.", "Information");
return;
}
IntPtr capture = CvInvoke.cvCreateFileCapture(path);
if(capture==eof)
{
MessageBox.Show("can not create file capture:" + path, "Information");
return;
}
IntPtr frame = CvInvoke.cvQueryFrame(capture);
if(frame==eof)
{
MessageBox.Show("can not query frame from capture.", "Information");
return;
}
MCvRect c = CvInvoke.cvGetImageROI(frame);
IntPtr gray = CvInvoke.cvCreateImage(new MCvSize(c.width, c.height), Emgu.CV.CvEnum.IPL_DEPTH.IPL_DEPTH_8U, 1);
IntPtr canny = CvInvoke.cvCreateImage(new MCvSize(c.width, c.height), Emgu.CV.CvEnum.IPL_DEPTH.IPL_DEPTH_8U, 1);
int sobel;
double thresh1, thresh2;
CannyWindow cw = new CannyWindow();
cw.ShowDialog();
sobel = cw.sobel;
thresh1 = cw.thresh1;
thresh2 = cw.thresh2;
if (thresh1 == 0 || thresh2 == 0 || sobel == 0) return;
double fps = CvInvoke.cvGetCaptureProperty(capture, Emgu.CV.CvEnum.CAP_PROP.CV_CAP_PROP_FPS);
CvInvoke.cvNamedWindow("Canny检测");
while ((frame = CvInvoke.cvQueryFrame(capture)) != eof)
{
CvInvoke.cvCvtColor(frame, gray, Emgu.CV.CvEnum.COLOR_CONVERSION.CV_BGR2GRAY);
CvInvoke.cvCanny(gray, canny, thresh1,thresh2,sobel);
CvInvoke.cvFlip(canny, canny, 0);
CvInvoke.cvShowImage("Canny检测", canny);
int ch = CvInvoke.cvWaitKey(1000/(int)fps);
if (ch == 13) break;
}
CvInvoke.cvReleaseCapture(ref capture);
CvInvoke.cvReleaseImage(ref gray);
CvInvoke.cvReleaseImage(ref canny);
CvInvoke.cvDestroyWindow("Canny检测");
}
用Visual C#开发基于OpenCV的Windows应用程序的更多相关文章
- 在Windows下使用Dev-C++开发基于pthread.h的多线程程序【转】
在Windows下使用Dev-C++开发基于pthread.h的多线程程序[转] 在Windows下使用Dev-C++开发基于pthread.h的多线程程序 文章分类:C++编程 ...
- windows下使用pycharm开发基于ansible api的python程序
Window下python安装ansible,基于ansible api开发python程序 在windows下使用pycharm开发基于ansible api的python程序时,发现ansible ...
- Creating Dialogbased Windows Application (1) / 创建基于对话框的Windows应用程序(一)新建窗体 / VC++, Windows
创建基于对话框的Windows应用程序(一) —— 新建窗体 1.新建一个Visual C++的Empty Project. 2.在Solution Explorer中右键Add New Item, ...
- Creating Dialogbased Windows Application (4) / 创建基于对话框的Windows应用程序(四)Edit Control、Combo Box的应用、Unicode转ANSI、Open File Dialog、文件读取、可变参数、文本框自动滚动 / VC++, Windows
创建基于对话框的Windows应用程序(四)—— Edit Control.Combo Box的应用.Unicode转ANSI.Open File Dialog.文件读取.可变参数.自动滚动 之前的介 ...
- Creating Dialogbased Windows Application (3) / 创建基于对话框的Windows应用程序(三)Checkbox的应用、窗体置顶、设置图标 / VC++, Windows
创建基于对话框的Windows应用程序(三) —— Checkbox的应用.窗体置顶.设置图标 上一节创建的窗体应用程序中,我们用到了Button和StaticText这两个控件.这一节中我们将学习使 ...
- Creating Dialogbased Windows Application (2) / 创建基于对话框的Windows应用程序(二)Button的应用、新建子窗体 / VC++, Windows
创建基于对话框的Windows应用程序(二) —— Button的应用.新建子窗体 可以发现上一节创建的窗体中,点击OK和Cancel两个按钮是没有任何反应的.现在我们来为他们添加退出对话框的功能. ...
- 轻装上阵Flink--在IDEA上开发基于Flink的实时数据流程序
前言 本文介绍如何在IDEA上快速开发基于Flink框架的DataStream程序.先直接上手! 环境清单 案例是在win7运行.安装VirtualBox,在VirtualBox上安装Centos操作 ...
- Windows下使用Dev-C++开发基于pthread.h的多线程程序
一.下载Windows版本的pthread 目前最新版本是:pthreads-w32-2-9-1-release.zip. 二.解压pthread到指定目录 我选择的目录是:E:\DEV-C ...
- 使用VS2012开发基于Office 2013的AddIn程序
默认VS2012开发的Office Add是基于2010的,如下所示: 如果你机器上安装的Office版本是2013,那么使用VS2012创建的工程是无法运行的,弹出如下的错误: 那么此时怎么办呢?将 ...
随机推荐
- ArrayList 源码分析 -- 扩容问题及序列化问题
目录 一.前言二.ArrayList 的继承与实现关系 2.1 ArrayList.java 2.2 抽象类AbstractList.java 2.3 接口List.java ...
- redis主从配置+sentinel哨兵
redis主从配置+sentinel哨兵 1:编译环境准备 1.1环境确认 Redis是一个开源.支持网络.基于内存.键值对存储数据库,使用ANSI C编写.所以在搭建Redis服务器时需要C语言的编 ...
- Centos7下安装Seafile实现私有网盘
Seafile是一个开源.专业.可靠的云存储平台:解决文件集中存储.共享和跨平台访问等问题,由北京海文互知网络有限公司开发,发布于2012年10月:除了一般网盘所提供的云存储以及共享功能外,Seafi ...
- [寒假学习笔记](二)Python初学
Python 学习 python的自学从几个月前断断续续地进行,想好好利用这个寒假,好好地学一学. 回顾 已学习:基本操作.函数 已有C++的一定基础,只要注意python中比较特殊的部分就行 进入正 ...
- 用vsstudio 设计Winform 高分屏上布局错乱的问题
在使用win10高分辨率150%,200%系统进行winform开发时, 会有布局错乱的现象,比如之前定义的300px的宽度,往往被设置成600px (200%分辨率下). 这个问题vs2015的解决 ...
- tomcat 最大并发连接数设置
转自: http://blog.csdn.net/qysh123/article/details/11678903 这是个很简单的问题,但是搜了一圈,发现大家都写错了.所以这里总结一下: 几乎所有的中 ...
- High School: Become Human(数学思维)
Year 2118. Androids are in mass production for decades now, and they do all the work for humans. But ...
- 软工1816 · Alpha冲刺(7/10)
团队信息 队名:爸爸饿了 组长博客:here 作业博客:here 组员情况 组员1(组长):王彬 过去两天完成了哪些任务 学会了POSTMAN的使用,对后端已经完成的接口进行了收发消息正确性的验证 推 ...
- Alpha事后诸葛亮(团队)
设想和目标 1.我们的软件要解决什么问题?是否定义得很清楚?是否对典型用户和典型场景有清晰的描述? 我们的软件要解决用手机使没有指纹验证硬件的电脑可以利用指纹进行文件的加密.定义的很清楚.我们针对的是 ...
- lintcode-202-线段树的查询
202-线段树的查询 对于一个有n个数的整数数组,在对应的线段树中, 根节点所代表的区间为0-n-1, 每个节点有一个额外的属性max,值为该节点所代表的数组区间start到end内的最大值. 为Se ...