【问题标题】:How to cut a sub-part of an image using Emgu CV (or OpenCV)?如何使用 Emgu CV(或 OpenCV)剪切图像的子部分?
【发布时间】:2012-07-09 23:03:16
【问题描述】:

我想使用 Emgu CV(或 OpenCV)剪切图像的一个子部分(或裁剪它)并计算该部分的平均颜色;寻找变化。

谢谢

【问题讨论】:

    标签: c# video-processing emgucv


    【解决方案1】:
    1. 设置您正在处理的图像的 ROI(感兴趣区域),这意味着任何计算都只在该区域上进行。

      image.ROI = new Rectangle(x,Y,Width,Height);

    2. 计算 ROI 的平均值,其中“TYPE”是图像相关的 Bgr,颜色为 Gray,为 Grayscale

    TYPE average = image.GetAverage(image);

    1. 重置图像 ROI 后,您可以再次看到整个图像。

    该过程所做的就是循环遍历每个像素,将其值相加,然后除以像素总数。节省您自己编写代码的时间。

    谢谢 克里斯

    【讨论】:

      【解决方案2】:

      我认为较新版本的 OpenCV (2.3+) 具有不同的 ROI 方法。手册是这样写的:

      // create a new 320x240 image
      Mat img(Size(320,240),CV_8UC3);
      // select a ROI
      Mat roi(img, Rect(10,10,100,100));
      // fill the ROI with (0,255,0) (which is green in RGB space);
      // the original 320x240 image will be modified
      roi = Scalar(0,255,0);
      

      这是我在一个实例中所做的:

      // adding a header on top of image
      Mat dst = Mat::zeros(frame.rows + HEADER_HEIGHT, frame.cols, CV_8UC3); 
      // frame portion
      Mat roi(dst, Rect(0, HEADER_HEIGHT-1, frame.cols, frame.rows));
      // header portion
      Mat head(dst, Rect(0,0,frame.cols, HEADER_HEIGHT));
      // zeros to clear the header portion
      Mat zhead = Mat::zeros(head.rows, head.cols, CV_8UC3);
      
      frame.copyTo(roi); // copy new image to image portion of dst
      zhead.copyTo(head); // clear the header portion of dst
      

      您可以使用任何子帧(在我的示例中为roihead)来计算该区域的平均值。有一个 adjustROI 函数可以移动感兴趣的区域,还有一个函数 locateROI 也可能有用。

      【讨论】:

        猜你喜欢
        • 2021-07-06
        • 2012-10-28
        • 1970-01-01
        • 2017-12-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-07-03
        • 1970-01-01
        相关资源
        最近更新 更多