zoukankan      html  css  js  c++  java
  • 用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检测");

            }

  • 相关阅读:
    Day12 文件操作
    Day11 集合、集合操作
    Day10 【小程序】商城管理(购物车小程序的增强版)
    Day8 字符串操作
    Day9 字典操作
    文件操作
    【python练习】购物车程序
    2296 寻找道路
    2661 信息传递(tarjan&拓扑)
    【模板】LCA(tarjan)
  • 原文地址:https://www.cnblogs.com/zkwarrior/p/4958145.html
Copyright © 2011-2022 走看看