OpenCv 获取某一区域的RGB平均值

来源:互联网 发布:microsoft软件有哪些 编辑:程序博客网 时间:2024/05/29 19:05

OpenCv 获取某一区域的RGB平均值

最早的想法是通过cvGet2D或者直接访问ImageData获取ROI中的每个点的RGB值从而获得平均值 代码如下:

int cnt = (m_ROI[i][j][1].x - m_ROI[i][j][0].x)*(m_ROI[i][j][1].y - m_ROI[i][j][0].y);            for (int n = m_ROI[i][j][0].x; n < m_ROI[i][j][1].x; n++)                for (int m = m_ROI[i][j][0].y; m < m_ROI[i][j][1].y; m++)                {                    //CvScalar s = cvGet2D(m_pInputImage, n, m);                    //m_Color[i][j].B += s.val[0];                    //m_Color[i][j].G += s.val[1];                    //m_Color[i][j].R += s.val[2];                    m_RGBColor[i][j][0] += m_pInputImage->imageData[m*m_pInputImage->widthStep + 3 * n + 0];                    m_RGBColor[i][j][1] += m_pInputImage->imageData[m*m_pInputImage->widthStep + 3 * n + 1];                    m_RGBColor[i][j][2] += m_pInputImage->imageData[m*m_pInputImage->widthStep + 3 * n + 2];                }

测试后发现这一方法又笨又不好用;
后来想到一个方法,新建个图片,把ROI复制到新图片中,再使用cvAvg获取各个通道的平均值即可。

            IplImage* pBlock;            pBlock = cvCreateImage(cvSize((m_ROI[i][j][1].x - m_ROI[i][j][0].x), (m_ROI[i][j][1].y - m_ROI[i][j][0].y)), 8, 3);            cvResetImageROI(m_pInputImage);            cvSetImageROI(m_pInputImage, cvRect(m_ROI[i][j][0].x, m_ROI[i][j][0].y, (m_ROI[i][j][1].x - m_ROI[i][j][0].x), (m_ROI[i][j][1].y - m_ROI[i][j][0].y)));            cvCopy(m_pInputImage, pBlock);            CvScalar s = cvAvg(m_pInputImage);            m_RGBColor[i][j][0] = s.val[0];            m_RGBColor[i][j][1] = s.val[1];            m_RGBColor[i][j][2] = s.val[2];            RGB2Lab(m_RGBColor[i][j], m_LabColor[i][j]);            cvReleaseImage(&pBlock);
0 0