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

#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;

}

以上内容,自己手写,转载请注明出处!!谢谢!!

  • 4
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Teleger

你的支持是我前进的方向

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值