您的位置:首页 > 运维架构

OpenCV中取ROI区域RGB的均值,求方差,ROI区域颜色是否明显区分

2016-07-19 20:07 281 查看
#include <iostream>

#include <math.h>

#include <opencv2/opencv.hpp>

#include <opencv2/core/core.hpp>

#include <opencv2/highgui/highgui.hpp>

#define REC_W_H 30

using namespace std;

int main()

{

IplImage *res, *dst;

IplImage *dst1, *dst2, *dst3;

CvRect rect;

CvRect rect1, rect2, rect3;

rect.x = 1200, rect.y = 180, rect.width = REC_W_H, rect.height = REC_W_H;//ROI0 的坐标以及大小

rect1.x = 1200, rect1.y = 240, rect1.width = REC_W_H, rect1.height = REC_W_H;//ROI1 的坐标以及大小

rect2.x = 1230, rect2.y = 510, rect2.width = REC_W_H, rect2.height = REC_W_H;//ROI2 的坐标以及大小

rect3.x = 1230, rect3.y = 560, rect3.width = REC_W_H, rect3.height = REC_W_H;//ROI3 的坐标以及大小

res = cvLoadImage("d:/project/tt/1.bmp");//载入一张图片

dst = cvCreateImage(cvSize(REC_W_H, REC_W_H), 8, 3);//创建图像空间

dst1 = cvCreateImage(cvSize(REC_W_H, REC_W_H), 8, 3);//创建图像空间1

dst2 = cvCreateImage(cvSize(REC_W_H, REC_W_H), 8, 3);//创建图像空间2

dst3 = cvCreateImage(cvSize(REC_W_H, REC_W_H), 8, 3);//创建图像空间3

//创建窗口

cvNamedWindow("res", CV_WINDOW_AUTOSIZE);

cvNamedWindow("dst", CV_WINDOW_AUTOSIZE);

cvNamedWindow("dst1", CV_WINDOW_AUTOSIZE);

cvNamedWindow("dst2", CV_WINDOW_AUTOSIZE);

cvNamedWindow("dst3", CV_WINDOW_AUTOSIZE);

//设置ROI区域

cvSetImageROI(res, rect);

//提取ROI

cvCopy(res, dst);

cvSetImageROI(res, rect1);

cvCopy(res, dst1);

cvSetImageROI(res, rect2);

cvCopy(res, dst2);

cvSetImageROI(res, rect3);

cvCopy(res, dst3);

//取消设置

cvResetImageROI(res);

//显示图像

cvShowImage("res", res);

cvShowImage("dst", dst);

cvShowImage("dst1", dst1);

cvShowImage("dst2", dst2);

cvShowImage("dst3", dst3);

//需要提取图像ROI区域RGB的平均值,发现有一个cvAvg函数:

//CvScalar cvAvg( const CvArr* arr, const CvArr* mask=NULL );

CvScalar avgChannels = cvAvg(dst);

double avgB = avgChannels.val[0];

double avgG = avgChannels.val[1];

double avgR = avgChannels.val[2];//ROI 的均值

CvScalar avgChannels1 = cvAvg(dst1);

double avgB1 = avgChannels1.val[0];

double avgG1 = avgChannels1.val[1];

double avgR1 = avgChannels1.val[2];//ROI 1 的均值

CvScalar avgChannels2 = cvAvg(dst2);

double avgB2 = avgChannels2.val[0];

double avgG2 = avgChannels2.val[1];

double avgR2 = avgChannels2.val[2];//ROI 2 的均值

CvScalar avgChannels3 = cvAvg(dst3);

double avgB3 = avgChannels3.val[0];

double avgG3 = avgChannels3.val[1];

double avgR3 = avgChannels3.val[2];//ROI 3 的均值

double ret = sqrt( pow((avgB - avgB2), 2) + pow((avgG - avgG2), 2) + pow((avgR - avgR2), 2));

double ret1 = sqrt(pow((avgB1 - avgB2), 2) + pow((avgG1 - avgG2), 2) + pow((avgR1 - avgR2), 2));

double ret2 = sqrt(pow((avgB - avgB3), 2) + pow((avgG - avgG3), 2) + pow((avgR - avgR3), 2));

double ret3 = sqrt(pow((avgB1 - avgB3), 2) + pow((avgG1 - avgG3), 2) + pow((avgR1 - avgR3), 2));

cout << "result :" << ret << endl;

cout << "result1 :" << ret1 << endl;

cout << "result2 :" << ret2 << endl;

cout << "result3 :" << ret3 << endl;//控制台打印方差值

//CV_BGR2HSV();

cvWaitKey(0);

cvDestroyWindow("res");

cvDestroyWindow("dst");

cvDestroyWindow("dst1");

cvDestroyWindow("dst2");

cvDestroyWindow("dst3");

cvReleaseImage(&res);

cvReleaseImage(&dst);

cvReleaseImage(&dst1);

cvReleaseImage(&dst2);

cvReleaseImage(&dst3);

return 0;

}

以上内容,自己手写,转载请注明出处!!谢谢!!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: