学OpenCV

===========================================

根据公式,这个mean在这里是平均值

mask只能用单通道的uchar类型。

===========================================

  1 #include <iostream>
  2 
  3 #include <opencv2/opencv.hpp>
  4 #include <opencv2/core/utils/logger.hpp>
  5 
  6 
  7 template <typename T>
  8 T* MakeSerialArr(int datasize)
  9 {
 10     T* ptr = new T[datasize];
 11     for (int i = 0; i < datasize; i++)
 12     {
 13         ptr[i] = (T)i;
 14     }
 15     return ptr;
 16 }
 17 
 18 #define SerialArr_Heap(name,type,size) \
 19     type* name = new type[size];\
 20     for (int i = 0; i < size; i++) \
 21     {\
 22         name[i] = (type)i;\
 23     }
 24 
 25 #define SerialArr_Stack(name,type,size) \
 26     type name[size]={};\
 27     for (int i = 0; i < size; i++) \
 28     {\
 29         name[i] = (type)i;\
 30     }
 31 
 32 
 33 void Test1()
 34 {
 35     SerialArr_Stack(arr, int, 5*5*3);
 36 
 37     cv::Mat img(5, 5, CV_32SC3, arr);
 38     int channels = img.channels();
 39 
 40     cv::Scalar sarr1=cv::mean(img);
 41     
 42     for (int i = 0; i < channels; i++)
 43     {
 44         std::cout <<"Test1 mean " << sarr1[i] << std::endl;
 45     }
 46 
 47     uchar arr2[] = {    1,1,1,1,1,
 48                         1,1,1,1,1,
 49                         0,0,0,0,0,
 50                         0,0,0,0,0 ,
 51                         0,0,0,0,0 };
 52 
 53     cv::Mat mask(5, 5, CV_8UC1,arr2);
 54 
 55     cv::Scalar sarr2 = cv::mean(img,mask);
 56 
 57     for (int i = 0; i < channels; i++)
 58     {
 59         std::cout << "Test1 mean with mask " << sarr2[i] << std::endl;
 60     }
 61 }
 62 
 63 void Test2()
 64 {
 65     SerialArr_Stack(arr, int, 5 * 5 * 3);
 66 
 67     cv::Mat img(5, 5, CV_32SC3, arr);
 68     int channels = img.channels();
 69     
 70     cv::Scalar mean, stddev;
 71     cv::meanStdDev(img,mean,stddev);
 72 
 73     for (int i = 0; i < channels; i++)
 74     {
 75         std::cout << "Test2 mean " << mean[i] << std::endl;
 76     }
 77     for (int i = 0; i < channels; i++)
 78     {
 79         std::cout << "Test2 stddev " << stddev[i] << std::endl;
 80     }
 81 
 82     uchar arr2[] = { 0,0,1,0,0,
 83                     0,1,1,1,0 ,
 84                     1,1,1,1,1 ,
 85                     0,1,1,1,0 ,
 86                     0,0,1,0,0 };
 87 
 88     cv::Mat mask(5, 5, CV_8UC1, arr2);
 89     cv::Scalar mean2, stddev2;
 90     cv::meanStdDev(img,mean2,stddev2);
 91 
 92     for (int i = 0; i < channels; i++)
 93     {
 94         std::cout << "Test2 mean with mask" << mean2[i] << std::endl;
 95     }
 96     for (int i = 0; i < channels; i++)
 97     {
 98         std::cout << "Test2 stddev with mask" << stddev2[i] << std::endl;
 99     }
100 }
101 
102 int main()
103 {
104     cv::utils::logging::setLogLevel(cv::utils::logging::LOG_LEVEL_ERROR);
105     
106     Test1();
107     Test2();
108 
109     cv::waitKey(0);
110 
111     return 0;
112 }

 效果