/Code/core/ComponentBinaryMask.cpp

https://github.com/roboshepherd/swistrackplus · C++ · 107 lines · 81 code · 15 blank · 11 comment · 29 complexity · 01a037be9e71e934d8503f4150409b46 MD5 · raw file

  1. #include "ComponentBinaryMask.h"
  2. #define THISCLASS ComponentBinaryMask
  3. #include <highgui.h>
  4. #include "DisplayEditor.h"
  5. THISCLASS::ComponentBinaryMask(SwisTrackCore *stc):
  6. Component(stc, wxT("BinaryMask")),
  7. mMaskImage(0),
  8. mDisplayOutput(wxT("Output"), wxT("After applying mask")) {
  9. // Data structure relations
  10. mCategory = &(mCore->mCategoryPreprocessingBinary);
  11. AddDataStructureRead(&(mCore->mDataStructureImageBinary));
  12. AddDataStructureWrite(&(mCore->mDataStructureImageBinary));
  13. AddDisplay(&mDisplayOutput);
  14. // Read the XML configuration file
  15. Initialize();
  16. }
  17. THISCLASS::~ComponentBinaryMask() {
  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. // BGR case, we convert to gray
  33. IplImage *img = cvCreateImage(cvSize(mMaskImage->width, mMaskImage->height), mMaskImage->depth, 1);
  34. cvCvtColor(mMaskImage, img, CV_BGR2GRAY);
  35. cvReleaseImage(&mMaskImage);
  36. mMaskImage = img;
  37. } else if (mMaskImage->nChannels == 1) {
  38. // Already in gray, do nothing
  39. } else {
  40. // Other cases, we take the first channel
  41. IplImage *img = cvCreateImage(cvSize(mMaskImage->width, mMaskImage->height), mMaskImage->depth, 1);
  42. cvCvtPixToPlane(mMaskImage, img, NULL, NULL, NULL);
  43. cvReleaseImage(&mMaskImage);
  44. mMaskImage = img;
  45. }
  46. // load other parameters:
  47. OnReloadConfiguration();
  48. return;
  49. }
  50. void THISCLASS::OnReloadConfiguration() {
  51. // Mask mode
  52. wxString mode = GetConfigurationString(wxT("Mode"), wxT("black-black"));
  53. if (mode == wxT("white-white")) {
  54. mMode = cMode_WhiteWhite;
  55. } else if (mode == wxT("white-black")) {
  56. mMode = cMode_WhiteBlack;
  57. cvNot(mMaskImage, mMaskImage);
  58. } else if (mode == wxT("black-white")) {
  59. mMode = cMode_BlackWhite;
  60. cvNot(mMaskImage, mMaskImage);
  61. } else {
  62. mMode = cMode_BlackBlack;
  63. }
  64. }
  65. void THISCLASS::OnStep() {
  66. if (! mCore->mDataStructureImageBinary.mImage) {
  67. AddError(wxT("No input image."));
  68. return;
  69. }
  70. // Mask the image
  71. if (mMaskImage) {
  72. if ((mCore->mDataStructureImageBinary.mImage->width != mMaskImage->width) || (mCore->mDataStructureImageBinary.mImage->height != mMaskImage->height)) {
  73. AddError(wxT("Wrong mask size."));
  74. return;
  75. }
  76. if ((mMode == cMode_WhiteWhite) || (mMode == cMode_BlackWhite)) {
  77. cvOr(mCore->mDataStructureImageBinary.mImage, mMaskImage, mCore->mDataStructureImageBinary.mImage);
  78. } else {
  79. cvAnd(mCore->mDataStructureImageBinary.mImage, mMaskImage, mCore->mDataStructureImageBinary.mImage);
  80. }
  81. }
  82. // Set the display
  83. DisplayEditor de(&mDisplayOutput);
  84. if (de.IsActive()) {
  85. de.SetMainImage(mCore->mDataStructureImageBinary.mImage);
  86. }
  87. }
  88. void THISCLASS::OnStepCleanup() {
  89. }
  90. void THISCLASS::OnStop() {
  91. cvReleaseImage(&mMaskImage);
  92. }