Skip to content

Commit d37b078

Browse files
committed
Return contour from processImage
1 parent bbf795b commit d37b078

File tree

2 files changed

+29
-8
lines changed

2 files changed

+29
-8
lines changed

src/hello.cpp

Lines changed: 19 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -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

src/index.js

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -159,18 +159,26 @@ const onProcessImage = (module, processImage) => () => {
159159
const elapsedTime = document.getElementById('elapsed-time')
160160
elapsedTime.innerText = (endTime - startTime).toFixed(2)
161161
const returnDataAddr = addr / module.HEAP32.BYTES_PER_ELEMENT
162-
const returnData = module.HEAP32.slice(returnDataAddr, returnDataAddr + 20)
162+
const returnData = module.HEAP32.slice(returnDataAddr, returnDataAddr + 22)
163163
const [
164164
bbx, bby, bbw, bbh,
165165
outImage1Width, outImage1Height, outImage1Channels, outImage1Addr,
166-
outImage2Width, outImage2Height, outImage2Channels, outImage2Addr
166+
outImage2Width, outImage2Height, outImage2Channels, outImage2Addr,
167+
, , , , , , , , // corners
168+
numContourPoints, contourAddr
167169
] = returnData
168170
const boundingBox1 = [bbx, bby, bbw, bbh]
169171
const corners = range(4).map(cornerIndex => ({
170172
x: returnData[12 + cornerIndex * 2],
171173
y: returnData[12 + cornerIndex * 2 + 1]
172174
}))
173175

176+
console.log('numContourPoints:', numContourPoints)
177+
console.log('contourAddr:', contourAddr)
178+
const contourAddr32 = contourAddr / module.HEAP32.BYTES_PER_ELEMENT
179+
const contourPointsData = module.HEAP32.slice(contourAddr32, contourAddr32 + numContourPoints)
180+
console.dir(contourPointsData)
181+
174182
const outImage1DataSize = outImage1Width * outImage1Height * outImage1Channels
175183
const outImage1Data = module.HEAPU8.slice(outImage1Addr, outImage1Addr + outImage1DataSize)
176184
const imageData1 = outImage1Channels === 1

0 commit comments

Comments
 (0)