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;
}
以上内容,自己手写,转载请注明出处!!谢谢!!
#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;
}
以上内容,自己手写,转载请注明出处!!谢谢!!
相关文章推荐
- linux下cp复制文件或目录指令介绍
- CentOS修改hostname(主机名)
- Xshell访问kali配置
- sed命令
- linux网卡报错设置
- Nginx模块开发-日志模型
- seq 命令
- Linux中C/C++的输入输出小结
- 基本opencv2处理方法(二)
- Windows Ubuntu双系统安装日志
- OpenLDAP学习笔记
- 图解tomcat
- Hive Hadoop 解析 orc 文件
- Proguard中optimize设置不当引发SimException
- 为什么Linux内存使用率吃紧 【转】
- Docker 系列之 Linux 下安装篇
- Hadoop Shell命令
- 七 OpenGL ES 2.0 渲染流程整理
- hadoop命令详解
- Codis的架构设计