/Code/core/ComponentColorMask.cpp

https://github.com/roboshepherd/swistrackplus · C++ · 104 lines · 79 code · 15 blank · 10 comment · 29 complexity · 5480cf60bd3db580c3d7693c4707f290 MD5 · raw file

  1. #include "ComponentColorMask.h"
  2. #define THISCLASS ComponentColorMask
  3. #include <highgui.h>
  4. #include "DisplayEditor.h"
  5. THISCLASS::ComponentColorMask(SwisTrackCore *stc):
  6. Component(stc, wxT("ColorMask")),
  7. mMaskImage(0), mMode(cMode_BlackBlack),
  8. mDisplayOutput(wxT("Output"), wxT("After applying mask")) {
  9. // Data structure relations
  10. mCategory = &(mCore->mCategoryPreprocessingColor);
  11. AddDataStructureRead(&(mCore->mDataStructureImageColor));
  12. AddDataStructureWrite(&(mCore->mDataStructureImageColor));
  13. AddDisplay(&mDisplayOutput);
  14. // Read the XML configuration file
  15. Initialize();
  16. }
  17. THISCLASS::~ComponentColorMask() {
  18. }
  19. void THISCLASS::OnStart() {
  20. // Load mask image
  21. wxString filename_string = GetConfigurationString(wxT("MaskImage"), wxT(""));
  22. wxFileName filename = mCore->GetProjectFileName(filename_string);
  23. if (filename.IsOk()) {
  24. mMaskImage = cvLoadImage(filename.GetFullPath().mb_str(wxConvFile), CV_LOAD_IMAGE_ANYDEPTH | CV_LOAD_IMAGE_ANYCOLOR);
  25. }
  26. if (! mMaskImage) {
  27. AddError(wxT("Cannot open mask file."));
  28. return;
  29. }
  30. // Convert mask image
  31. if (mMaskImage->nChannels == 3) {
  32. // Already in BGR, do nothing
  33. } else if (mMaskImage->nChannels == 1) {
  34. // Grayscale image, we convert to BGR
  35. IplImage *img = cvCreateImage(cvSize(mMaskImage->width, mMaskImage->height), mMaskImage->depth, 3);
  36. cvCvtColor(mMaskImage, img, CV_GRAY2BGR);
  37. cvReleaseImage(&mMaskImage);
  38. mMaskImage = img;
  39. } else {
  40. AddError(wxT("Invalid mask file. The mask file must be a grayscale or color image."));
  41. return;
  42. }
  43. // load other parameters:
  44. OnReloadConfiguration();
  45. return;
  46. }
  47. void THISCLASS::OnReloadConfiguration() {
  48. // Mask mode
  49. wxString mode = GetConfigurationString(wxT("Mode"), wxT("black-black"));
  50. if (mode == wxT("white-white")) {
  51. mMode = cMode_WhiteWhite;
  52. } else if (mode == wxT("white-black")) {
  53. mMode = cMode_WhiteBlack;
  54. cvNot(mMaskImage, mMaskImage);
  55. } else if (mode == wxT("black-white")) {
  56. mMode = cMode_BlackWhite;
  57. cvNot(mMaskImage, mMaskImage);
  58. } else {
  59. mMode = cMode_BlackBlack;
  60. }
  61. }
  62. void THISCLASS::OnStep() {
  63. if (! mCore->mDataStructureImageColor.mImage) {
  64. AddError(wxT("No input image."));
  65. return;
  66. }
  67. // Mask the image
  68. if (mMaskImage) {
  69. if ((mCore->mDataStructureImageColor.mImage->width != mMaskImage->width) || (mCore->mDataStructureImageColor.mImage->height != mMaskImage->height)) {
  70. AddError(wxT("Wrong mask size."));
  71. return;
  72. }
  73. if ((mMode == cMode_WhiteWhite) || (mMode == cMode_BlackWhite)) {
  74. cvOr(mCore->mDataStructureImageColor.mImage, mMaskImage, mCore->mDataStructureImageColor.mImage);
  75. } else {
  76. cvAnd(mCore->mDataStructureImageColor.mImage, mMaskImage, mCore->mDataStructureImageColor.mImage);
  77. }
  78. }
  79. // Set the display
  80. DisplayEditor de(&mDisplayOutput);
  81. if (de.IsActive()) {
  82. de.SetMainImage(mCore->mDataStructureImageColor.mImage);
  83. }
  84. }
  85. void THISCLASS::OnStepCleanup() {
  86. }
  87. void THISCLASS::OnStop() {
  88. cvReleaseImage(&mMaskImage);
  89. }