forked from VisionLabs/torch-opencv
-
Notifications
You must be signed in to change notification settings - Fork 0
/
photo.cpp
596 lines (505 loc) · 19.9 KB
/
photo.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
#include <photo.hpp>
extern "C" struct TensorWrapper inpaint(struct TensorWrapper src, struct TensorWrapper inpaintMask,
struct TensorWrapper dst, double inpaintRadius, int flags)
{
MatT dst_mat = dst.toMatT();
cv::inpaint(src.toMat(), inpaintMask.toMat(), dst_mat, inpaintRadius, flags);
return TensorWrapper(dst_mat);
}
extern "C" struct TensorWrapper fastNlMeansDenoising1(struct TensorWrapper src, struct TensorWrapper dst,
float h, int templateWindowSize, int searchWindowSize)
{
MatT dst_mat = dst.toMatT();
cv::fastNlMeansDenoising(src.toMat(), dst_mat, h, templateWindowSize, searchWindowSize);
return TensorWrapper(dst_mat);
}
extern "C" struct TensorWrapper fastNlMeansDenoising2(struct TensorWrapper src, struct TensorWrapper dst,
struct TensorWrapper h, int templateWindowSize,
int searchWindowSize, int normType)
{
MatT dst_mat = dst.toMatT();
cv::fastNlMeansDenoising(src.toMat(), dst_mat, h.toMat(), templateWindowSize, searchWindowSize, normType);
return TensorWrapper(dst_mat);
}
extern "C" struct TensorWrapper fastNlMeansDenoisingColored(struct TensorWrapper src, struct TensorWrapper dst,
float h, float hColor, int templateWindowSize, int searchWindowSize)
{
MatT dst_mat = dst.toMatT();
cv::fastNlMeansDenoisingColored(src.toMat(), dst_mat, h, hColor, templateWindowSize, searchWindowSize);
return TensorWrapper(dst_mat);
}
extern "C" struct TensorWrapper fastNlMeansDenoisingMulti1(struct TensorArray srcImgs, struct TensorWrapper dst,
int imgToDenoiseIndex, int temporalWindowSize, float h,
int templateWindowSize, int searchWindowSize)
{
MatT dst_mat = dst.toMatT();
cv::fastNlMeansDenoisingMulti(srcImgs.toMatList(), dst_mat, imgToDenoiseIndex, temporalWindowSize, h,
templateWindowSize, searchWindowSize);
return TensorWrapper(dst_mat);
}
extern "C" struct TensorWrapper fastNlMeansDenoisingMulti2(struct TensorArray srcImgs, struct TensorWrapper dst,
int imgToDenoiseIndex, int temporalWindowSize, struct TensorWrapper h,
int templateWindowSize, int searchWindowSize, int normType)
{
MatT dst_mat = dst.toMatT();
cv::fastNlMeansDenoisingMulti(srcImgs.toMatList(), dst_mat, imgToDenoiseIndex, temporalWindowSize, h.toMat(),
templateWindowSize, searchWindowSize, normType);
return TensorWrapper(dst_mat);
}
extern "C" struct TensorWrapper fastNlMeansDenoisingColoredMulti(struct TensorArray srcImgs, struct TensorWrapper dst,
int imgToDenoiseIndex, int temporalWindowSize, float h,
float hColor, int templateWindowSize, int searchWindowSize)
{
MatT dst_mat = dst.toMatT();
cv::fastNlMeansDenoisingColoredMulti(srcImgs.toMatList(), dst_mat, imgToDenoiseIndex, temporalWindowSize, h,
hColor, templateWindowSize, searchWindowSize);
return TensorWrapper(dst_mat);
}
extern "C" struct TensorWrapper denoise_TVL1(struct TensorArray observations, struct TensorWrapper result,
double lambda, int niters) {
cv::Mat result_mat;
if (result.isNull()) {
cv::denoise_TVL1(observations.toMatList(), result_mat, lambda, niters);
return TensorWrapper(MatT(result_mat));
} else {
result_mat = result.toMat();
cv::denoise_TVL1(observations.toMatList(), result_mat, lambda, niters);
}
return result;
}
extern "C" struct TensorArray decolor(struct TensorWrapper src, struct TensorWrapper grayscale,
struct TensorWrapper color_boost)
{
std::vector<MatT> retval(2);
retval[0] = grayscale.toMatT();
retval[1] = color_boost.toMatT();
cv::decolor(src.toMat(), retval[0], retval[1]);
return TensorArray(retval);
}
extern "C" struct TensorWrapper seamlessClone(struct TensorWrapper src, struct TensorWrapper dst,
struct TensorWrapper mask, struct PointWrapper p,
struct TensorWrapper blend, int flags)
{
MatT blend_mat = blend.toMatT();
cv::seamlessClone(src.toMat(), blend_mat, mask.toMat(), p, blend.toMat(), flags);
return TensorWrapper(blend_mat);
}
extern "C" struct TensorWrapper colorChange(struct TensorWrapper src, struct TensorWrapper mask,
struct TensorWrapper dst, float red_mul,
float green_mul, float blue_mul)
{
MatT dst_mat = dst.toMatT();
cv::colorChange(src.toMat(), mask.toMat(), dst_mat, red_mul, green_mul, blue_mul);
return TensorWrapper(dst_mat);
}
extern "C" struct TensorWrapper illuminationChange(struct TensorWrapper src, struct TensorWrapper mask,
struct TensorWrapper dst, float alpha, float beta)
{
MatT dst_mat = dst.toMatT();
cv::illuminationChange(src.toMat(), mask.toMat(), dst_mat, alpha, beta);
return TensorWrapper(dst_mat);
}
extern "C" struct TensorWrapper textureFlattening(struct TensorWrapper src, struct TensorWrapper mask,
struct TensorWrapper dst, float low_threshold, float high_threshold,
int kernel_size)
{
MatT dst_mat = dst.toMatT();
cv::textureFlattening(src.toMat(), mask.toMat(), dst_mat, low_threshold,
high_threshold, kernel_size);
return TensorWrapper(dst_mat);
}
extern "C" struct TensorWrapper edgePreservingFilter(struct TensorWrapper src, struct TensorWrapper dst,
int flags, float sigma_s, float sigma_r)
{
MatT dst_mat = dst.toMatT();
cv::edgePreservingFilter(src.toMat(), dst_mat, flags, sigma_s, sigma_r);
return TensorWrapper(dst_mat);
}
extern "C" struct TensorWrapper detailEnhance(struct TensorWrapper src, struct TensorWrapper dst,
float sigma_s, float sigma_r)
{
MatT dst_mat = dst.toMatT();
cv::detailEnhance(src.toMat(), dst_mat, sigma_s, sigma_r);
return TensorWrapper(dst_mat);
}
extern "C" struct TensorArray pencilSketch(struct TensorWrapper src, struct TensorWrapper dst1,
struct TensorWrapper dst2, float sigma_s, float sigma_r, float shade_factor)
{
std::vector<MatT> retval(2);
retval[0] = dst1.toMatT();
retval[1] = dst2.toMatT();
cv::pencilSketch(src.toMat(), retval[0], retval[1], sigma_s, sigma_r, shade_factor);
return TensorArray(retval);
}
extern "C" struct TensorWrapper stylization(struct TensorWrapper src, struct TensorWrapper dst,
float sigma_s, float sigma_r)
{
MatT dst_mat = dst.toMatT();
cv::stylization(src.toMat(), dst_mat, sigma_s, sigma_r);
return TensorWrapper(dst_mat);
}
/****************** Classes ******************/
// Tonemap
extern "C" struct TonemapPtr Tonemap_ctor(float gamma)
{
return rescueObjectFromPtr(cv::createTonemap(gamma));
}
extern "C" struct TensorWrapper Tonemap_process(struct TonemapPtr ptr, struct TensorArray src, struct TensorWrapper dst)
{
MatT dst_mat = dst.toMatT();
ptr->process(src.toMatList(), dst_mat);
return TensorWrapper(dst_mat);
}
extern "C" float Tonemap_getGamma(struct TonemapPtr ptr)
{
return ptr->getGamma();
}
extern "C" void Tonemap_setGamma(struct TonemapPtr ptr, float gamma)
{
ptr->setGamma(gamma);
}
// TonemapDrago
extern "C" struct TonemapDragoPtr TonemapDrago_ctor(float gamma, float saturation, float bias)
{
return rescueObjectFromPtr(cv::createTonemapDrago(gamma, saturation, bias));
}
extern "C" float TonemapDrago_getSaturation(struct TonemapDragoPtr ptr)
{
return ptr->getSaturation();
}
extern "C" void TonemapDrago_setSaturation(struct TonemapDragoPtr ptr, float saturation)
{
ptr->setSaturation(saturation);
}
extern "C" float TonemapDrago_getBias(struct TonemapDragoPtr ptr)
{
return ptr->getBias();
}
extern "C" void TonemapDrago_setBias(struct TonemapDragoPtr ptr, float bias)
{
ptr->setBias(bias);
}
// TonemapDurand
extern "C" struct TonemapDurandPtr TonemapDurand_ctor(float gamma, float contrast, float saturation, float sigma_space, float sigma_color)
{
return rescueObjectFromPtr(cv::createTonemapDurand(gamma, contrast, saturation, sigma_space, sigma_color));
}
extern "C" float TonemapDurand_getSaturation(struct TonemapDurandPtr ptr)
{
return ptr->getSaturation();
}
extern "C" void TonemapDurand_setSaturation(struct TonemapDurandPtr ptr, float saturation)
{
ptr->setSaturation(saturation);
}
extern "C" float TonemapDurand_getContrast(struct TonemapDurandPtr ptr)
{
return ptr->getContrast();
}
extern "C" void TonemapDurand_setContrast(struct TonemapDurandPtr ptr, float contrast)
{
ptr->setContrast(contrast);
}
extern "C" float TonemapDurand_getSigma_space(struct TonemapDurandPtr ptr)
{
return ptr->getSigmaSpace();
}
extern "C" void TonemapDurand_setSigmaSpace(struct TonemapDurandPtr ptr, float sigma_space)
{
ptr->setSigmaSpace(sigma_space);
}
extern "C" float TonemapDurand_getSigmaColor(struct TonemapDurandPtr ptr)
{
return ptr->getSigmaColor();
}
extern "C" void TonemapDurand_setSigmaColor(struct TonemapDurandPtr ptr, float sigma_color)
{
ptr->setSigmaColor(sigma_color);
}
// TonemapReinhard
extern "C" struct TonemapReinhardPtr TonemapReinhard_ctor(float gamma, float intensity, float light_adapt, float color_adapt)
{
return rescueObjectFromPtr(cv::createTonemapReinhard(gamma, intensity, light_adapt, color_adapt));
}
extern "C" float TonemapReinhard_getIntensity(struct TonemapReinhardPtr ptr)
{
return ptr->getIntensity();
}
extern "C" void TonemapReinhard_setIntensity(struct TonemapReinhardPtr ptr, float intensity)
{
ptr->setIntensity(intensity);
}
extern "C" float TonemapReinhard_getLightAdaptation(struct TonemapReinhardPtr ptr)
{
return ptr->getLightAdaptation();
}
extern "C" void TonemapReinhard_setLightAdaptation(struct TonemapReinhardPtr ptr, float light_adapt)
{
ptr->setLightAdaptation(light_adapt);
}
extern "C" float TonemapReinhard_getColorAdaptation(struct TonemapReinhardPtr ptr)
{
return ptr->getColorAdaptation();
}
extern "C" void TonemapReinhard_setColorAdaptation(struct TonemapReinhardPtr ptr, float color_adapt)
{
ptr->setColorAdaptation(color_adapt);
}
// TonemapMantiuk
extern "C" struct TonemapMantiukPtr TonemapMantiuk_ctor(float gamma, float scale, float saturation)
{
return rescueObjectFromPtr(cv::createTonemapMantiuk(gamma, scale, saturation));
}
extern "C" float TonemapMantiuk_getScale(struct TonemapMantiukPtr ptr)
{
return ptr->getScale();
}
extern "C" void TonemapMantiuk_setScale(struct TonemapMantiukPtr ptr, float scale)
{
ptr->setScale(scale);
}
extern "C" float TonemapMantiuk_getSaturation(struct TonemapMantiukPtr ptr)
{
return ptr->getSaturation();
}
extern "C" void TonemapMantiuk_setSaturation(struct TonemapMantiukPtr ptr, float saturation)
{
ptr->setSaturation(saturation);
}
// AlignExposures
struct TensorArray AlignExposures_process(struct AlignExposuresPtr ptr, struct TensorArray src, struct TensorArray dst,
struct TensorWrapper times, struct TensorWrapper response)
{
std::vector<cv::Mat> dst_vec;
if(dst.isNull()) {
ptr->process(src.toMatList(), dst_vec, times.toMat(), response.toMat());
std::vector<MatT> result = get_vec_MatT(dst_vec);
return TensorArray(result);
} else {
dst_vec = dst.toMatList();
ptr->process(src.toMatList(), dst_vec, times.toMat(), response.toMat());
}
return dst_vec;
}
// AlignMTB
extern "C" struct AlignMTBPtr AlignMTB_ctor(int max_bits, int exclude_range, bool cut)
{
return rescueObjectFromPtr(cv::createAlignMTB(max_bits, exclude_range, cut));
}
extern "C" struct TensorArray AlignMTB_process1(struct AlignMTBPtr ptr, struct TensorArray src, struct TensorArray dst,
struct TensorWrapper times, struct TensorWrapper response)
{
std::vector<cv::Mat> dst_vec;
if (dst.isNull()) {
ptr->process(src.toMatList(), dst_vec, times.toMat(), response.toMat());
std::vector<MatT> result = get_vec_MatT(dst_vec);
return TensorArray(result);
} else {
dst_vec = dst.toMatList();
ptr->process(src.toMatList(), dst_vec, times.toMat(), response.toMat());
}
return dst;
}
extern "C" struct TensorArray AlignMTB_process2(struct AlignMTBPtr ptr, struct TensorArray src, struct TensorArray dst)
{
std::vector<cv::Mat> dst_vec;
if (dst.isNull()) {
ptr->process(src.toMatList(), dst_vec);
std::vector<MatT> result = get_vec_MatT(dst_vec);
return TensorArray(result);
} else {
dst_vec = dst.toMatList();
ptr->process(src.toMatList(), dst_vec);
}
return dst;
}
extern "C" struct PointWrapper AlignMTB_calculateShift(struct AlignMTBPtr ptr, struct TensorWrapper img0, struct TensorWrapper img1)
{
return ptr->calculateShift(img0.toMat(), img1.toMat());
}
extern "C" struct TensorWrapper AlignMTB_shiftMat(struct AlignMTBPtr ptr, struct TensorWrapper src,
struct TensorWrapper dst, struct PointWrapper shift)
{
MatT dst_mat = dst.toMatT();
ptr->shiftMat(src.toMat(), dst_mat, shift);
return TensorWrapper(dst_mat);
}
extern "C" void AlignMTB_computeBitmaps(struct AlignMTBPtr ptr, struct TensorWrapper img,
struct TensorWrapper tb, struct TensorWrapper eb)
{
ptr->computeBitmaps(img.toMat(), tb.toMat(), eb.toMat());
}
extern "C" int AlignMTB_getMaxBits(struct AlignMTBPtr ptr)
{
return ptr->getMaxBits();
}
extern "C" void AlignMTB_setMaxBits(struct AlignMTBPtr ptr, int max_bits)
{
ptr->setMaxBits(max_bits);
}
extern "C" int AlignMTB_getExcludeRange(struct AlignMTBPtr ptr)
{
return ptr->getExcludeRange();
}
extern "C" void AlignMTB_setExcludeRange(struct AlignMTBPtr ptr, int exclude_range)
{
ptr->setExcludeRange(exclude_range);
}
extern "C" bool AlignMTB_getCut(struct AlignMTBPtr ptr)
{
return ptr->getCut();
}
extern "C" void AlignMTB_setCut(struct AlignMTBPtr ptr, bool cut)
{
ptr->setCut(cut);
}
// CalibreCRF
extern "C" struct TensorWrapper CalibrateCRF_process(struct CalibrateCRFPtr ptr, struct TensorArray src, struct TensorWrapper dst,
struct TensorWrapper times)
{
MatT dst_mat = dst.toMatT();
ptr->process(src.toMatList(), dst_mat, times.toMat());
return TensorWrapper(dst_mat);
}
// CalibrateDebevec
extern "C" struct CalibrateDebevecPtr CalibrateDebevec_ctor(int samples, float lambda, bool random)
{
return rescueObjectFromPtr(cv::createCalibrateDebevec(samples, lambda, random));
}
extern "C" float CalibrateDebevec_getLambda(struct CalibrateDebevecPtr ptr)
{
return ptr->getLambda();
}
extern "C" void CalibrateDebevec_setLambda(struct CalibrateDebevecPtr ptr, float lambda)
{
ptr->setLambda(lambda);
}
extern "C" int CalibrateDebevec_getSamples(struct CalibrateDebevecPtr ptr)
{
return ptr->getSamples();
}
extern "C" void CalibrateDebevec_setSamples(struct CalibrateDebevecPtr ptr, int samples)
{
ptr->setSamples(samples);
}
extern "C" bool CalibrateDebevec_getRandom(struct CalibrateDebevecPtr ptr)
{
return ptr->getRandom();
}
extern "C" void CalibrateDebevec_setRandom(struct CalibrateDebevecPtr ptr, bool random)
{
ptr->setRandom(random);
}
// CalibrateRobertson
extern "C" struct CalibrateRobertsonPtr CalibrateRobertson_ctor(int max_iter, float threshold)
{
return rescueObjectFromPtr(cv::createCalibrateRobertson(max_iter, threshold));
}
extern "C" int CalibrateRobertson_getMaxIter(struct CalibrateRobertsonPtr ptr)
{
return ptr->getMaxIter();
}
extern "C" void CalibrateRobertson_setMaxIter(struct CalibrateRobertsonPtr ptr, int max_iter)
{
ptr->setMaxIter(max_iter);
}
extern "C" float CalibrateRobertson_getThreshold(struct CalibrateRobertsonPtr ptr)
{
return ptr->getThreshold();
}
extern "C" void CalibrateRobertson_setThreshold(struct CalibrateRobertsonPtr ptr, float threshold)
{
ptr->setThreshold(threshold);
}
extern "C" struct TensorWrapper CalibrateRobertson_getRadiance(struct CalibrateRobertsonPtr ptr)
{
return TensorWrapper(MatT(ptr->getRadiance()));
}
// MergeExposures
extern "C" struct TensorWrapper MergeExposures_process(struct MergeExposuresPtr ptr, struct TensorArray src, struct TensorWrapper dst,
struct TensorWrapper times, struct TensorWrapper response)
{
MatT dst_mat = dst.toMatT();
ptr->process(src.toMatList(), dst_mat, times.toMat(), response.toMat());
return TensorWrapper(dst_mat);
}
// MergeDebevec
extern "C" struct MergeDebevecPtr MergeDebevec_ctor()
{
return rescueObjectFromPtr(cv::createMergeDebevec());
}
extern "C" struct TensorWrapper MergeDebevec_process1(struct MergeDebevecPtr ptr, struct TensorArray src, struct TensorWrapper dst,
struct TensorWrapper times, TensorWrapper response)
{
MatT dst_mat = dst.toMatT();
ptr->process(src.toMatList(), dst_mat, times.toMat(), response.toMat());
return TensorWrapper(dst_mat);
}
extern "C" struct TensorWrapper MergeDebevec_process2(struct MergeDebevecPtr ptr, struct TensorArray src, struct TensorWrapper dst,
struct TensorWrapper times)
{
MatT dst_mat = dst.toMatT();
ptr->process(src.toMatList(), dst_mat, times.toMat());
return TensorWrapper(dst_mat);
}
// MergeMertens
extern "C" struct MergeMertensPtr MergeMertens_ctor(float contrast_weight, float saturation_weight, float exposure_weight)
{
return rescueObjectFromPtr(cv::createMergeMertens(contrast_weight, saturation_weight, exposure_weight));
}
extern "C" struct TensorWrapper MergeMertens_process1(struct MergeMertensPtr ptr, struct TensorArray src, struct TensorWrapper dst,
struct TensorWrapper times, struct TensorWrapper response)
{
MatT dst_mat = dst.toMatT();
ptr->process(src.toMatList(), dst_mat, times.toMat(), response.toMat());
return TensorWrapper(dst_mat);
}
extern "C" struct TensorWrapper MergeMertens_process2(struct MergeMertensPtr ptr, struct TensorArray src, struct TensorWrapper dst)
{
MatT dst_mat = dst.toMatT();
ptr->process(src.toMatList(), dst_mat);
return TensorWrapper(dst_mat);
}
extern "C" float MergeMertens_getContrastWeight(struct MergeMertensPtr ptr)
{
return ptr->getContrastWeight();
}
extern "C" void MergeMertens_setContrastWeight(struct MergeMertensPtr ptr, float contrast_weight)
{
ptr->setContrastWeight(contrast_weight);
}
extern "C" float MergeMertens_getSaturationWeight(struct MergeMertensPtr ptr)
{
return ptr->getSaturationWeight();
}
extern "C" void MergeMertens_setSaturationWeight(struct MergeMertensPtr ptr, float saturation_weight)
{
ptr->setSaturationWeight(saturation_weight);
}
extern "C" float MergeMertens_getExposureWeight(struct MergeMertensPtr ptr)
{
return ptr->getExposureWeight();
}
extern "C" void MergeMertens_setExposureWeight(struct MergeMertensPtr ptr, float exposure_weight)
{
ptr->setExposureWeight(exposure_weight);
}
// MergeRobertson
extern "C" struct MergeRobertsonPtr MergeRobertson_ctor()
{
return rescueObjectFromPtr(cv::createMergeRobertson());
}
extern "C" struct TensorWrapper MergeRobertson_process1(struct MergeRobertsonPtr ptr, struct TensorArray src, struct TensorWrapper dst,
struct TensorWrapper times, struct TensorWrapper response)
{
MatT dst_mat = dst.toMatT();
ptr->process(src.toMatList(), dst_mat, times.toMat(), response.toMat());
return TensorWrapper(dst_mat);
}
extern "C" struct TensorWrapper MergeRobertson_process2(struct MergeRobertsonPtr ptr, struct TensorArray src,
struct TensorWrapper dst, struct TensorWrapper times)
{
MatT dst_mat = dst.toMatT();
ptr->process(src.toMatList(), dst_mat, times.toMat());
return TensorWrapper(dst_mat);
}