【发布时间】:2012-07-09 23:03:16
【问题描述】:
我想使用 Emgu CV(或 OpenCV)剪切图像的一个子部分(或裁剪它)并计算该部分的平均颜色;寻找变化。
谢谢
【问题讨论】:
标签: c# video-processing emgucv
我想使用 Emgu CV(或 OpenCV)剪切图像的一个子部分(或裁剪它)并计算该部分的平均颜色;寻找变化。
谢谢
【问题讨论】:
标签: c# video-processing emgucv
设置您正在处理的图像的 ROI(感兴趣区域),这意味着任何计算都只在该区域上进行。
image.ROI = new Rectangle(x,Y,Width,Height);
计算 ROI 的平均值,其中“TYPE”是图像相关的 Bgr,颜色为 Gray,为 Grayscale
TYPE average = image.GetAverage(image);
该过程所做的就是循环遍历每个像素,将其值相加,然后除以像素总数。节省您自己编写代码的时间。
谢谢 克里斯
【讨论】:
我认为较新版本的 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
您可以使用任何子帧(在我的示例中为roi 和head)来计算该区域的平均值。有一个 adjustROI 函数可以移动感兴趣的区域,还有一个函数 locateROI 也可能有用。
【讨论】: