mexopencv  0.1
mex interface for opencv library
AlignMTB_.cpp
Go to the documentation of this file.
1 
8 #include "mexopencv.hpp"
9 #include "opencv2/photo.hpp"
10 using namespace std;
11 using namespace cv;
12 
13 // Persistent objects
14 namespace {
16 int last_id = 0;
18 map<int,Ptr<AlignMTB> > obj_;
19 
25 Ptr<AlignMTB> create_AlignMTB(
26  vector<MxArray>::const_iterator first,
27  vector<MxArray>::const_iterator last)
28 {
29  ptrdiff_t len = std::distance(first, last);
30  nargchk((len%2)==0);
31  int max_bits = 6;
32  int exclude_range = 4;
33  bool cut = true;
34  for (; first != last; first += 2) {
35  string key(first->toString());
36  const MxArray& val = *(first + 1);
37  if (key == "MaxBits")
38  max_bits = val.toInt();
39  else if (key == "ExcludeRange")
40  exclude_range = val.toInt();
41  else if (key == "Cut")
42  cut = val.toBool();
43  else
44  mexErrMsgIdAndTxt("mexopencv:error",
45  "Unrecognized option %s", key.c_str());
46  }
47  return createAlignMTB(max_bits, exclude_range, cut);
48 }
49 }
50 
58 void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[])
59 {
60  // Check the number of arguments
61  nargchk(nrhs>=2 && nlhs<=2);
62 
63  // Argument vector
64  vector<MxArray> rhs(prhs, prhs+nrhs);
65  int id = rhs[0].toInt();
66  string method(rhs[1].toString());
67 
68  // Constructor is called. Create a new object from argument
69  if (method == "new") {
70  nargchk(nrhs>=2 && nlhs<=1);
71  obj_[++last_id] = create_AlignMTB(
72  rhs.begin() + 2, rhs.end());
73  plhs[0] = MxArray(last_id);
74  return;
75  }
76 
77  // Big operation switch
78  Ptr<AlignMTB> obj = obj_[id];
79  if (method == "delete") {
80  nargchk(nrhs==2 && nlhs==0);
81  obj_.erase(id);
82  }
83  else if (method == "clear") {
84  nargchk(nrhs==2 && nlhs==0);
85  obj->clear();
86  }
87  else if (method == "load") {
88  nargchk(nrhs>=3 && (nrhs%2)==1 && nlhs==0);
89  string objname;
90  bool loadFromString = false;
91  for (int i=3; i<nrhs; i+=2) {
92  string key(rhs[i].toString());
93  if (key == "ObjName")
94  objname = rhs[i+1].toString();
95  else if (key == "FromString")
96  loadFromString = rhs[i+1].toBool();
97  else
98  mexErrMsgIdAndTxt("mexopencv:error",
99  "Unrecognized option %s", key.c_str());
100  }
101  /*
102  obj_[id] = (loadFromString ?
103  Algorithm::loadFromString<AlignMTB>(rhs[2].toString(), objname) :
104  Algorithm::load<AlignMTB>(rhs[2].toString(), objname));
105  */
107  // HACK: workaround for missing AlignMTB::create()
108  FileStorage fs(rhs[2].toString(), FileStorage::READ +
109  (loadFromString ? FileStorage::MEMORY : 0));
110  obj->read(objname.empty() ? fs.getFirstTopLevelNode() : fs[objname]);
111  if (obj.empty())
112  mexErrMsgIdAndTxt("mexopencv:error", "Failed to load algorithm");
113  //*/
114  }
115  else if (method == "save") {
116  nargchk(nrhs==3 && nlhs==0);
117  obj->save(rhs[2].toString());
118  }
119  else if (method == "empty") {
120  nargchk(nrhs==2 && nlhs<=1);
121  plhs[0] = MxArray(obj->empty());
122  }
123  else if (method == "getDefaultName") {
124  nargchk(nrhs==2 && nlhs<=1);
125  plhs[0] = MxArray(obj->getDefaultName());
126  }
127  else if (method == "process") {
128  nargchk(nrhs==3 && nlhs<=1);
129  vector<Mat> src, dst;
130  {
131  vector<MxArray> arr(rhs[2].toVector<MxArray>());
132  src.reserve(arr.size());
133  for (vector<MxArray>::const_iterator it = arr.begin(); it != arr.end(); ++it)
134  src.push_back(it->toMat(CV_8U));
135  }
136  obj->process(src, dst);
137  plhs[0] = MxArray(dst);
138  }
139  else if (method == "calculateShift") {
140  nargchk(nrhs==4 && nlhs<=1);
141  Mat img0(rhs[2].toMat(CV_8U)),
142  img1(rhs[3].toMat(CV_8U));
143  Point shift = obj->calculateShift(img0, img1);
144  plhs[0] = MxArray(shift);
145  }
146  else if (method == "shiftMat") {
147  nargchk(nrhs==4 && nlhs<=1);
148  Mat src(rhs[2].toMat()), dst;
149  Point shift(rhs[3].toPoint());
150  obj->shiftMat(src, dst, shift);
151  plhs[0] = MxArray(dst);
152  }
153  else if (method == "computeBitmaps") {
154  nargchk(nrhs==3 && nlhs<=2);
155  Mat img(rhs[2].toMat(CV_8U)), tb, eb;
156  obj->computeBitmaps(img, tb, eb);
157  plhs[0] = MxArray(tb);
158  if (nlhs>1)
159  plhs[1] = MxArray(eb);
160  }
161  else if (method == "get") {
162  nargchk(nrhs==3 && nlhs<=1);
163  string prop(rhs[2].toString());
164  if (prop == "MaxBits")
165  plhs[0] = MxArray(obj->getMaxBits());
166  else if (prop == "ExcludeRange")
167  plhs[0] = MxArray(obj->getExcludeRange());
168  else if (prop == "Cut")
169  plhs[0] = MxArray(obj->getCut());
170  else
171  mexErrMsgIdAndTxt("mexopencv:error",
172  "Unrecognized property %s", prop.c_str());
173  }
174  else if (method == "set") {
175  nargchk(nrhs==4 && nlhs==0);
176  string prop(rhs[2].toString());
177  if (prop == "MaxBits")
178  obj->setMaxBits(rhs[3].toInt());
179  else if (prop == "ExcludeRange")
180  obj->setExcludeRange(rhs[3].toInt());
181  else if (prop == "Cut")
182  obj->setCut(rhs[3].toBool());
183  else
184  mexErrMsgIdAndTxt("mexopencv:error",
185  "Unrecognized property %s", prop.c_str());
186  }
187  else
188  mexErrMsgIdAndTxt("mexopencv:error",
189  "Unrecognized operation %s", method.c_str());
190 }
void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[])
Main entry called from Matlab.
Definition: AlignMTB_.cpp:58
int toInt() const
Convert MxArray to int.
Definition: MxArray.cpp:489
mxArray object wrapper for data conversion and manipulation.
Definition: MxArray.hpp:123
void nargchk(bool cond)
Alias for input/ouput arguments number check.
Definition: mexopencv.hpp:166
Global constant definitions.