HuMoments.cpp 1.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152
  1. #include "opencv2/opencv.hpp"
  2. using namespace cv;
  3. using namespace std;
  4. int main(int argc, char **argv)
  5. {
  6. bool showLogTransformedHuMoments = true;
  7. for (int i = 1; i < argc; i++)
  8. {
  9. // Obtain filename from command line argument
  10. string filename(argv[i]);
  11. // Read Image
  12. Mat im = imread(filename,IMREAD_GRAYSCALE);
  13. // Threshold image
  14. threshold(im, im, 128, 255, THRESH_BINARY);
  15. // Calculate Moments
  16. Moments moment = moments(im, false);
  17. // Calculate Hu Moments
  18. double huMoments[7];
  19. HuMoments(moment, huMoments);
  20. // Print Hu Moments
  21. cout << filename << ": ";
  22. for(int i = 0; i < 7; i++)
  23. {
  24. if(showLogTransformedHuMoments)
  25. {
  26. // Log transform Hu Moments to make squash the range
  27. cout << -1 * copysign(1.0, huMoments[i]) * log10(abs(huMoments[i])) << " ";
  28. }
  29. else
  30. {
  31. // Hu Moments without log transform.
  32. cout << huMoments[i] << " ";
  33. }
  34. }
  35. // One row per file
  36. cout << endl;
  37. }
  38. }