@@ -103,7 +103,7 @@ int *processImage(uchar *array, int width, int height) {
103103 findContours (matBinary, contours, hierarchy, mode, method);
104104
105105 if (contours.empty ()) {
106- return 0 ;
106+ return nullptr ;
107107 }
108108
109109 auto areas = vector<double >(contours.size ());
@@ -115,9 +115,10 @@ int *processImage(uchar *array, int width, int height) {
115115
116116 auto itMaxArea = max_element (areas.cbegin (), areas.cend ());
117117 auto indexMaxArea = distance (areas.cbegin (), itMaxArea);
118- auto bb = boundingRect (contours[indexMaxArea]);
118+ auto contour = contours[indexMaxArea]; // vector<Point>
119+ auto bb = boundingRect (contour);
119120
120- auto corners = findCorners (contours[indexMaxArea] );
121+ auto corners = findCorners (contour );
121122 Mat matUnwarped;
122123 applyWarpPerspective (matNormalised, matUnwarped, corners);
123124
@@ -131,13 +132,22 @@ int *processImage(uchar *array, int width, int height) {
131132 int return_image_2_channels = matUnwarped.channels ();
132133 int return_image_2_size = return_image_2_width * return_image_2_height * return_image_2_channels;
133134
134- int return_data_size = 20 * sizeof (int ) + return_image_1_size + return_image_2_size;
135- int *return_data = reinterpret_cast <int *>(malloc (return_data_size));
136- uchar *return_image_1_addr = reinterpret_cast <uchar*>(&return_data[20 ]);
135+ int numContourPoints = contour.size ();
136+ int return_contour_size = numContourPoints * 2 * sizeof (int );
137+
138+ int return_data_size = 22 * sizeof (int ) + return_image_1_size + return_image_2_size + return_contour_size;
139+ int *return_data = static_cast <int *>(malloc (return_data_size));
140+ uchar *return_image_1_addr = reinterpret_cast <uchar*>(&return_data[22 ]);
137141 uchar *return_image_2_addr = return_image_1_addr + return_image_1_size;
142+ int *return_contour_addr = reinterpret_cast <int *>(return_image_2_addr + return_image_2_size);
138143 memcpy (return_image_1_addr, matNormalised.data , return_image_1_size);
139144 memcpy (return_image_2_addr, matUnwarped.data , return_image_2_size);
140145
146+ for (auto i = 0 ; i < numContourPoints; i++) {
147+ return_contour_addr[i * 2 ] = contour[i].x ;
148+ return_contour_addr[i * 2 + 1 ] = contour[i].y ;
149+ }
150+
141151 return_data[0 ] = bb.x ;
142152 return_data[1 ] = bb.y ;
143153 return_data[2 ] = bb.width ;
@@ -158,6 +168,9 @@ int *processImage(uchar *array, int width, int height) {
158168 return_data[17 ] = corners[2 ].y ;
159169 return_data[18 ] = corners[3 ].x ;
160170 return_data[19 ] = corners[3 ].y ;
171+ return_data[20 ] = numContourPoints;
172+ return_data[21 ] = reinterpret_cast <int >(return_contour_addr);
173+
161174 return return_data;
162175}
163176
0 commit comments