Facebook
From Sludgy Elephant, 1 Week ago, written in Plain Text.
Embed
Download Paste or View Raw
Hits: 24
  1. #include "opencv2/core/core.hpp"
  2. #include "opencv2/highgui/highgui.hpp"
  3. #include <iostream>
  4. #include <cmath>
  5. #include <string>
  6. #include <vector>
  7.  
  8. cv::Mat& perform(cv::Mat& I){
  9.   CV_Assert(I.depth() != sizeof(uchar));
  10.   switch(I.channels())  {
  11.   case 1:
  12.     for( int i = 0; i < I.rows; ++i)
  13.         for( int j = 0; j < I.cols; ++j )
  14.             I.at<uchar>(i,j) = (I.at<uchar>(i,j)/32)*32;
  15.     break;
  16.   case 3:
  17.     cv::Mat_<cv::Vec3b> _I = I;
  18.     for( int i = 0; i < I.rows; ++i)
  19.         for( int j = 0; j < I.cols; ++j ){
  20.             _I(i,j)[0] = (_I(i,j)[0]/32)*32;
  21.             _I(i,j)[1] = (_I(i,j)[1]/32)*32;
  22.             _I(i,j)[2] = (_I(i,j)[2]/32)*32;
  23.         }
  24.     I = _I;
  25.     break;
  26.   }
  27.   return I;
  28. }
  29.  
  30. cv::Mat selectMax(cv::Mat& I){
  31.     CV_Assert(I.depth() != sizeof(uchar));
  32.     cv::Mat  res(I.rows,I.cols, CV_8UC3);
  33.     switch(I.channels())  {
  34.     case 3:
  35.         cv::Mat_<cv::Vec3b> _I = I;
  36.         cv::Mat_<cv::Vec3b> _R = res;
  37.         for( int i = 0; i < I.rows; ++i)
  38.             for( int j = 0; j < I.cols; ++j ){
  39.                 int sel = (_I(i,j)[0] < _I(i,j)[1])?1:0;
  40.                 sel = _I(i,j)[sel] < _I(i,j)[2]?2:sel;
  41.                 _R(i,j)[0] = sel==0?255:0;
  42.                 _R(i,j)[1] = sel==1?255:0;
  43.                 _R(i,j)[2] = sel==2?255:0;
  44.             }
  45.         res = _R;
  46.         break;
  47.     }
  48.     return res;
  49. }
  50.  
  51. int pole(cv::Mat& I) {
  52.         int pole = 0;
  53.         CV_Assert(I.depth() != sizeof(uchar));
  54.         cv::Mat  res(I.rows, I.cols, CV_8UC3);
  55.         switch (I.channels()) {
  56.         case 3:
  57.                 cv::Mat_<cv::Vec3b> _I = I;
  58.                 cv::Mat_<cv::Vec3b> _R = res;
  59.  
  60.  
  61.                 for (int i = 0; i < I.rows; ++i)
  62.                         for (int j = 0; j < I.cols; ++j) {
  63.                                 if (_I(i, j)[0] == 0) {
  64.                                         pole++;
  65.                                 }
  66.                         }
  67.                 res = _R;
  68.                 break;
  69.         }
  70.         return pole;
  71. }
  72.  
  73.  
  74.  
  75. int obwod(cv::Mat& I) {
  76.         int ob = 0;
  77.         CV_Assert(I.depth() != sizeof(uchar));
  78.         switch (I.channels()) {
  79.         case 3:
  80.                 cv::Mat_<cv::Vec3b> _I = I;
  81.  
  82.  
  83.                 for (int i = 1; i < I.rows -1; ++i)
  84.                         for (int j = 1; j < I.cols -1 ; ++j) {
  85.                                 if (_I(i, j)[0] == 0) {
  86.                                         if (_I(i+1, j+1)[0] != 0)
  87.                                                 ob++;
  88.                                         else if (_I(i + 1, j )[0] != 0)
  89.                                                 ob++;
  90.                                         else if (_I(i + 1, j - 1)[0] != 0)
  91.                                                 ob++;
  92.                                         else if (_I(i - 1, j + 1)[0] != 0)
  93.                                                 ob++;
  94.                                         else if (_I(i - 1, j)[0] != 0)
  95.                                                 ob++;
  96.                                         else if (_I(i - 1, j - 1)[0] != 0)
  97.                                                 ob++;
  98.                                         else if (_I(i , j - 1)[0] != 0)
  99.                                                 ob++;
  100.                                         else if (_I(i, j + 1)[0] != 0)
  101.                                                 ob++;
  102.                                 }
  103.                         }
  104.                 break;
  105.         }
  106.         return ob;
  107. }
  108.  
  109. double w3(int ob, int p) {
  110.         //double pi = 3.14159265;
  111.         double pi = 3.14;
  112.         return (ob / (2 * sqrt(pi * p))) - 1;
  113. }
  114.  
  115. long maleM(cv::Mat& I, int p, int q) {
  116.         long pole = 0;
  117.         CV_Assert(I.depth() != sizeof(uchar));
  118.         cv::Mat  res(I.rows, I.cols, CV_8UC3);
  119.         switch (I.channels()) {
  120.         case 3:
  121.                 cv::Mat_<cv::Vec3b> _I = I;
  122.                 cv::Mat_<cv::Vec3b> _R = res;
  123.                 for (int i = 0; i < I.rows; ++i)
  124.                         for (int j = 0; j < I.cols; ++j) {
  125.                                 if (_I(i, j)[0] == 0) {
  126.                                         pole += pow(i, p) * pow(j, q);
  127.                                 }
  128.                         }
  129.                 res = _R;
  130.                 break;
  131.         }
  132.         return pole;
  133. }
  134.  
  135. double M02(cv::Mat& I) {
  136.         long m02 = maleM(I, 0, 2);
  137.         long m01 = maleM(I, 0, 1);
  138.         long m00 = maleM(I, 0, 0);
  139.  
  140.         return m02 - pow(m01, 2)  / m00;
  141. }
  142.  
  143. double M20(cv::Mat& I) {
  144.         long m20 = maleM(I, 2, 0);
  145.         long m10 = maleM(I, 1, 0);
  146.         long m00 = maleM(I, 0, 0);
  147.  
  148.         return m20 - pow(m10, 2)  / m00;
  149. }
  150.  
  151. double M11(cv::Mat& I) {
  152.         double m11 = maleM(I, 1, 1);
  153.         double m10 = maleM(I, 1, 0);
  154.         double m01 = maleM(I, 0, 1);
  155.         double m00 = maleM(I, 0, 0);
  156.  
  157.         return m11 - ((m10 * m01) / m00);
  158. }
  159.  
  160. double M1(cv::Mat& I) {
  161.         long m00 = maleM(I, 0, 0);
  162.         return (M02(I) + M20(I)) / pow(m00, 2);
  163. }
  164.  
  165. double M7(cv::Mat& I) {
  166.         long m00 = maleM(I, 0, 0);
  167.  
  168.         return (M20(I)* M02(I) - pow(M11(I), 2)) / pow(m00, 4);
  169. }
  170.  
  171. long m(cv::Mat& I, int p, int q, int g, int r) {
  172.         long pole = 0;
  173.         CV_Assert(I.depth() != sizeof(uchar));
  174.         cv::Mat  res(I.rows, I.cols, CV_8UC3);
  175.         switch (I.channels()) {
  176.         case 3:
  177.                 cv::Mat_<cv::Vec3b> _I = I;
  178.                 cv::Mat_<cv::Vec3b> _R = res;
  179.                 for (int i = 0; i < I.rows; ++i)
  180.                         for (int j = 0; j < I.cols; ++j) {
  181.                                 if (_I(i, j)[1] == r && _I(i, j)[2] == g) {
  182.                                         pole += pow(i, p) * pow(j, q);
  183.                                 }
  184.                         }
  185.                 res = _R;
  186.                 break;
  187.         }
  188.         return pole;
  189. }
  190.  
  191. cv::Mat& to_nk(cv::Mat& I, int g, int r) {
  192.         CV_Assert(I.depth() != sizeof(uchar));
  193.         switch (I.channels()) {
  194.         case 1:
  195.                 break;
  196.         case 3:
  197.                 cv::Mat_<cv::Vec3b> _I = I;
  198.                 for (int i = 0; i < I.rows; ++i)
  199.                         for (int j = 0; j < I.cols; ++j) {
  200.                                 if (_I(i, j)[1] == r && _I(i, j)[2] == g) {
  201.                                         _I(i, j)[0] = 0;
  202.                                         _I(i, j)[1] = 0;
  203.                                         _I(i, j)[2] = 0;
  204.                                 }
  205.                                 else {
  206.                                         _I(i, j)[0] = 255;
  207.                                         _I(i, j)[1] = 255;
  208.                                         _I(i, j)[2] = 255;
  209.                                 }
  210.                         }
  211.                 I = _I;
  212.                 break;
  213.         }
  214.         return I;
  215. }
  216.  
  217.  
  218. int main(int, char *[]) {
  219.         char *line[5] = { "elipsa.dib", "elipsa1.dib", "kolo.dib", "prost.dib", "troj.dib" };
  220.  
  221.         for (int i = 0; i < 5; i++) {
  222.                
  223.                 cv::Mat image = cv::imread(line[i]);
  224.                 int ob = obwod(image);
  225.                 int p = pole(image);
  226.                 int m00 = maleM(image, 0, 0);
  227.                 double a = w3(ob, p);
  228.  
  229.                 double m1 = M1(image);
  230.                 double m7 = M7(image);
  231.  
  232.                 std::cout << line[i] << " S: " << p << " L: " << ob << " W3: " << a << " M1: " << m1 << " M7: " << m7 << std::endl;
  233.         }
  234.  
  235.         for (int i = 0; i < 5; i++) {
  236.  
  237.                 cv::Mat st = cv::imread("strzalki_1.dib");
  238.                 cv::Mat image = to_nk(st, i * 45, 180 - i * 45);
  239.  
  240.                 int ob = obwod(image);
  241.                 int p = pole(image);
  242.                 int m00 = maleM(image, 0, 0);
  243.                 double a = w3(ob, p);
  244.  
  245.                 double m1 = M1(image);
  246.                 double m7 = M7(image);
  247.  
  248.                 std::cout << "strzalki_1 " << i  << " S: " << p << " L: " << ob << " W3: " << a << " M1: " << m1 << " M7: " << m7 << std::endl;
  249.  
  250.  
  251.         }
  252.  
  253.     cv::waitKey(-1);
  254.     return 0;
  255. }
  256.