• EmguCV学习——简单使用


    关于EmguCV我就不多说了,是对应于OpenCV的一套net库。

    公司是视觉方面的业务,我又不会c++(好想会啊,正在学习中)。由于各种需求,自己觉得对c++不是特别感冒,所以选用了net下的opencv的封装EmguCV。python也有对应的opencv的库。无奈我python还处于入门阶段。

    不废话,先说Emgucv的配置,我是看园子里的博客配置的,附上链接:

     http://www.cnblogs.com/bomo/archive/2013/03/28/2986113.html

    下面先演示一下简单的显示图片及视频。

    视频需要安装ffshow解码器,自行百度下载

    EmguCV显示图片:

    1 var img = CvInvoke.cvLoadImage(imgname, Emgu.CV.CvEnum.LOAD_IMAGE_TYPE.CV_LOAD_IMAGE_ANYCOLOR);
    2 CvInvoke.cvNamedWindow("mainWin");
    3 if (img == null)
    4 {
    5     CvInvoke.cvReleaseImage(ref img);
    6     continue;
    7 }
    8 CvInvoke.cvShowImage("mainWin", img);

    EmguCV显示视频:

     1 IntPtr CatchFrame = CvInvoke.cvCreateFileCapture(path.ToString());
     2 // 得到总帧数
     3 var count = CvInvoke.cvGetCaptureProperty(CatchFrame, Emgu.CV.CvEnum.CAP_PROP.CV_CAP_PROP_FRAME_COUNT);
     4 // 视频宽度
     5 int wd = (int)CvInvoke.cvGetCaptureProperty(CatchFrame, Emgu.CV.CvEnum.CAP_PROP.CV_CAP_PROP_FRAME_WIDTH);
     6 // 视频高度
     7 int hg = (int)CvInvoke.cvGetCaptureProperty(CatchFrame, Emgu.CV.CvEnum.CAP_PROP.CV_CAP_PROP_FRAME_HEIGHT);
     8 // 当前帧位置
     9 //CvInvoke.cvGetCaptureProperty(CatchFrame, Emgu.CV.CvEnum.CAP_PROP.CV_CAP_PROP_POS_FRAMES);
    10 // 帧频
    11 CvInvoke.cvGetCaptureProperty(CatchFrame, Emgu.CV.CvEnum.CAP_PROP.CV_CAP_PROP_FPS);
    12 
    13 IntPtr FrameImg;
    14 int i = 0;
    15 CvInvoke.cvNamedWindow("mainWin");
    16 //灰度图
    17 //IntPtr grayImg = CvInvoke.cvCreateImage(new Size(wd,hg),Emgu.CV.CvEnum.IPL_DEPTH.IPL_DEPTH_8U,1);
    18 while ((FrameImg = CvInvoke.cvQueryFrame(CatchFrame)) != IntPtr.Zero)
    19 {
    20     //转换为灰度图
    21     //CvInvoke.cvCvtColor(FrameImg, grayImg, Emgu.CV.CvEnum.COLOR_CONVERSION.BGR2GRAY);
    22     //EmguCV中的Image 转换为 C#中的Bitmap
    23     //Image<Bgr, byte> FramePic = new Image<Bgr, byte>(wd, hg);
    24     //CvInvoke.cvCopy(FrameImg, FramePic, IntPtr.Zero);
    25     //Bitmap bt = new Bitmap(FramePic.ToBitmap());
    26     //FramePic.Dispose();
    27     CvInvoke.cvShowImage("mainWin", FrameImg );
    28 }
    29 CvInvoke.cvReleaseImage(ref FrameImg );
    30 CvInvoke.cvDestroyWindow("mainWin");

    另附上python的调用opencv的代码

    python需要安装numpy和scipy!

    显示图片代码:

     1 import cv2
     2 import numpy as np
     3 #读取图片
     4 img = cv2.imread("./IMGS/1.jpg")
     5 #实例化8位图
     6 emptyImage = np.zeros(img.shape, np.uint8)
     7 emptyImage2 = img.copy()
     8 #灰度图
     9 emptyImage3 = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
    10 #显示图片
    11 cv2.imshow("emptyImage",emptyImage)
    12 cv2.imshow("emptyImage2",emptyImage2)
    13 cv2.imshow("emptyImage3",emptyImage3)
    14 cv2.imshow("img",img)
    15 #保存图片 质量为5 和 100
    16 cv2.imwrite("./1.jpg",img,[int(cv2.IMWRITE_JPEG_QUALITY),5])
    17 cv2.imwrite("./2.jpg",img,[int(cv2.IMWRITE_JPEG_QUALITY),100])
    18 #png压缩大小
    19 cv2.imwrite("./3.png",img,[int(cv2.IMWRITE_PNG_COMPRESSION),0])
    20 cv2.imwrite("./4.png",img,[int(cv2.IMWRITE_PNG_COMPRESSION),9])
    21 
    22 #cv2.namedWindow("image")
    23 #cv2.imshow("image",image)
    24 cv2.waitKey(0)
    25 cv2.destroyAllWindows()

    播放视频,并把每帧保存成图片:

     1 #!/usr/bin/env python
     2 # -*- coding: utf-8 -*-
     3 # @Author: 禾子三金
     4 # @Date:   2015-08-05 17:45:45
     5 # @Last Modified by:   禾子三金
     6 # @Last Modified time: 2015-08-13 15:41:00
     7 import cv2
     8 
     9 videoCapture = cv2.VideoCapture("./cs.mp4",'utf-8')
    10 
    11 fps = videoCapture.get(cv2.cv.CV_CAP_PROP_FPS)
    12 size = (int(videoCapture.get(cv2.cv.CV_CAP_PROP_FRAME_WIDTH)),int(videoCapture.get(cv2.cv.CV_CAP_PROP_FRAME_HEIGHT)))
    13 
    14 success, frame = videoCapture.read()
    15 i = 0
    16 while success:
    17     cv2.imshow("video",frame)
    18     cv2.waitKey(1000/int(fps))
    19     cv2.imwrite("./img/%d.jpg" % i,frame)
    20     i = i + 1
    21     success, frame = videoCapture.read()

    以上代码都是我自己网上找的demo或者自己写的简单例子,代码粗糙,嘿嘿。

                  我坚信:种一棵树最好的时间是十年前,其次是现在。

  • 相关阅读:
    三种方法
    渐渐明白
    出手的时候到了
    URL OpenDocument
    熟练使用IDT
    时间快到了
    还是这样
    接口的多态性
    接口(interface)的使用
    抽象类(abstract class)与抽象方法
  • 原文地址:https://www.cnblogs.com/jixin/p/4727505.html
Copyright © 2020-2023  润新知