用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检测");

        }