• [OpenCV+C#]开发环境的搭建


    作者:彭军    邮件:poonjun at gmail com

    一 首先下载EmguCV,就是可以在Visual Studio2005/2008中引用OpenCV的函数的dll库。可以到这里下载:http://download.csdn.net/source/1051040     名为“Emgu.CV.Windows.Binary-1.3.0.0.zip”
    二 将文件解压出来,放到哪里都可以,不过建议将解压出来的文件夹放到OpenCV的目录下面,这样不会误删吧,呵呵。
    三 当然,在用EmguCV之前,要安装了OpenCV,并且OpenCV的各项配置都配置OK了,我这里说的只是配置EmguCV的。所以,请确保在配置 EmguCV之前你的OpenCV的开发环境已经配置OK了。如果不会,可以看我的一篇文章。就在“学海泛舟篇”中,找找看吧。【OpenCV】 Visual Studio2005的配置:http://hi.baidu.com/pengjun/blog/item /5782962b151a18f2e6cd40a4.html
    四 打开Visual Studio 2005/2008,新建C#的Win32窗体应用程序。然后,点击“项目”-〉“添加引用”-〉“浏览”,然后把EmguCV1.3.0目录下的 Emgu.CV.dll Emgu.Util.dll ZedGraph.dll zlib.net.dll 都添加到引用里面,其实也不用全部添加,不过由于我们不知道有些函数在那些dll中,所以索性全添加就可以了。
    五 然后,再程序的开头中加上 using Emgu.CV; using Emgu.Util; 之后就可以用EmguCV中所有的库函数了。
    六 在窗体上画一个按钮,然后再按纽的下面写上如下的程序:
    private void btnOpenImage_Click(object sender, EventArgs e)
            {
                OpenFileDialog openFileDialog = new OpenFileDialog();
                openFileDialog.Filter = "BMP文件|*.bmp|JPG文件|*.jpg|JPEG文件|*.jpeg|所有文件|*.*";
                if (openFileDialog.ShowDialog() == DialogResult.OK)
                {
                    CvInvoke.cvNamedWindow("打开图片");
                    IntPtr img = CvInvoke.cvLoadImage(openFileDialog.FileName, Emgu.CV.CvEnum.LOAD_IMAGE_TYPE.CV_LOAD_IMAGE_UNCHANGED);
                    CvInvoke.cvShowImage("打开图片", img);
                    this.img = img;
                    CvInvoke.cvWaitKey(0);
                    CvInvoke.cvReleaseImage(ref img);
                    CvInvoke.cvDestroyWindow("打开图片");
                }
            }
    这样,我们就能用OpenCv的函数来打开和显示一个图片了。如果要保存图片可以如下:
    private void btnSaveImage_Click(object sender, EventArgs e)
            {
                SaveFileDialog saveFileDialog = new SaveFileDialog();
                saveFileDialog.Filter = "BMP文件|*.bmp|JPG文件|*.jpg|JPEG文件|*.jpeg|所有文件|*.*";
                if (saveFileDialog.ShowDialog() == DialogResult.OK)
                {
                    CvInvoke.cvSaveImage(saveFileDialog.FileName, this.img);
                }
            }
    如果要打开一个AVI视频文件,可以如下:
    private void btnOpenAVI_Click(object sender, EventArgs e)
            {
                OpenFileDialog openFileDialog = new OpenFileDialog();
                openFileDialog.Filter = "AVI文件|*.avi";
                if (openFileDialog.ShowDialog() == DialogResult.OK)
                {
                    CvInvoke.cvNamedWindow("打开视频");
                    IntPtr capture=CvInvoke.cvCreateFileCapture(openFileDialog.FileName);
                    this.video = capture;
                    IntPtr frame = new IntPtr();
                    while (true)
                    {
                        frame = CvInvoke.cvQueryFrame(capture);
                        CvInvoke.cvShowImage("打开视频", frame);
                        //if (!frame) break;
                        int c = CvInvoke.cvWaitKey(20);
                        if (c == 13) break;
                    }
                    //this.video = capture;
                    CvInvoke.cvWaitKey(0);
                    CvInvoke.cvReleaseCapture(ref capture);
                    CvInvoke.cvDestroyWindow("打开视频");
                }
            }
    要保存一个AVI文件可以如下:
    private void btnSaveAVI_Click(object sender, EventArgs e)
            {
                IntPtr avi = this.video;
                SaveFileDialog saveFileDialog = new SaveFileDialog();
                saveFileDialog.Filter = "BMP文件|*.bmp|JPG文件|*.jpg|JPEG文件|*.jpeg|所有文件|*.*";
                if (saveFileDialog.ShowDialog() == DialogResult.OK)
                {
                    IntPtr videoWriter = CvInvoke.cvCreateVideoWriter(saveFileDialog.FileName, -1, 20, new Emgu.CV.MCvSize(480, 500), 1);
                    IntPtr capture=CvInvoke.cvCreateFileCapture(saveFileDialog.FileName);
                    IntPtr frame = new IntPtr();
                    while (true)
                    {
                        frame = CvInvoke.cvQueryFrame(capture);
                        CvInvoke.cvWriteFrame(videoWriter, frame);
                    }
                }
            }
    注意上面的保存AVI和打开AVI文件还存在问题:就是在AVI文件结尾处,如何退出的问题。在C++里面我们可以用if(!frame) break;来退出。但是在C#中这样是不行的,因为在C#中图片的类型是IntPtr类型。所以,在打开AVI文件的程序中,我用了 cvWaitKey()的返回值来退出播放AVI文件。而在保存中没有设置什么时候保存完毕,所以,保存AVI文件会出现问题。不过,只是提供了一种思路 罢了。如果想起有其他的方法来检测什么时候AVI文件播放完毕,在贴上来。
    网友评论
    • 回复1匿名网友2009-01-06 17:28
      楼主麻烦你解释一下,this.img和this.video是什么意思啊?好像没有声明啊?我保存了你这篇bolg,能发到我用邮箱吗?谢谢!
    • 回复2匿名网友2009-01-06 17:29
      也可以直接在评论里解释,谢谢! 持续关注中!
    • 回复3dreamflyman2009-02-14 17:56
      img/video 只是类的一个成员变量,为了是能够方便后面对读入的图片或视频的操作,它们的类型都是IntPtr类型的。因为在OpenCV中可以用IplImage指 针来指向一幅图片,而在这里只能用IntPtr类型的指针。因为这个Emgu类库只是通过C#来引用原来的C++类库的。而并没有自己去用C#代码实现 Opencv的那些函数。
    • 回复4cliff2009-03-18 08:54
      继续加油啊!
    • 回复5dreamflyman2009-03-18 23:01
      this.img代表的我引用的img是当前窗体类的一个成员变量,而后面的img很明显是我刚刚读入的图片。this.video=video是同样的道理。由于我要在不同的按钮下操作图片数据,所以需要将图片设置为可以共享的成员变量。
    • 回复6匿名网友2009-03-27 16:44
      谢谢,受益匪浅啊
    • 回复7匿名网友2009-03-30 20:57
      楼主,你好,非常感谢你分享这么好的东西,不过我在复制你的代码的时候,“this.img=img;”这一句报错了,说img不是窗体的方法,我把这一句注释起来后就可以显示图片了,我是刚刚接触op
  • 相关阅读:
    采样频率和采样点数以及奈奎斯特采样定理
    三阶截断点TOI或IP3
    动态库、静态库
    Qt添加静态库
    给测试开发工程师的5条建议
    软件测试中7个令人震惊的真相
    2022 年值得测试同学关注的技术趋势
    度量自动化测试效果的10个指标
    如何优化selenium webdriver的执行速度
    单元测试用例该如何设计
  • 原文地址:https://www.cnblogs.com/qqhfeng/p/2194615.html
Copyright © 2020-2023  润新知