28 const int rem = len % pad;
29 return (rem != 0) ? (pad - rem) : 0;
40 char *p = ((
char *)ptr) + addbytes;
42 return reinterpret_cast<T*
>(p);
52 const char addbytes = *(((
char *)ptr) - 1);
53 delete[]
reinterpret_cast<T*
>(((
char *)ptr) - addbytes);
80 int anchorX,
int anchorY,
int* values,
int nShiftR))
85 ret->anchorX = anchorX;
86 ret->anchorY = anchorY;
89 ret->nShiftR = nShiftR;
90 ret->values =
new int[nCols * nRows];
92 memcpy (
ret->values, values,
sizeof(
int) * nCols * nRows);
108 int anchorX,
int anchorY,
float* values))
113 ret->anchorX = anchorX;
114 ret->anchorY = anchorY;
117 ret->values =
new float[nCols * nRows];
119 memcpy (
ret->values, values,
sizeof(
float) * nCols * nRows);
125 int* anchorX,
int* anchorY,
int** values,
int *nShiftR))
130 *nCols = kernel->
nCols;
131 *nRows = kernel->
nRows;
134 memcpy (*values, kernel->
values,
sizeof(
int) * *nCols * *nRows);
139 int* anchorX,
int* anchorY,
float** values))
144 *nCols = kernel->
nCols;
145 *nRows = kernel->
nRows;
148 memcpy (*values, kernel->
values,
sizeof(
float) * *nCols * *nRows);
153 if (kernel ==
nullptr) {
163 if (kernel ==
nullptr) {
176 static char *__tmp_res =
nullptr;
177 static int __tmp_size = -1;
186 int *values = ktmp->
values;
192 const int krows = ktmp->
nRows;
193 const int kcols = ktmp->
nCols;
194 const int borderx = kcols / 2;
195 const int bordery = krows / 2;
196 const int w = srcImage->
width;
197 const int h = srcImage->
height;
202 if (__tmp_res ==
nullptr)
206 __tmp_res = AllocAligned<char> (dstImage->
imageSize);
211 if (__tmp_size < dstImage->imageSize)
214 FreeAligned<char> (__tmp_res);
218 __tmp_res = AllocAligned<char> (dstImage->
imageSize);
223 switch (srcImage->
depth)
228 for (
int i = bordery; i < h - bordery; i++)
230 for (
int j = borderx; j < w - borderx; j++)
233 for (
int k = 0; k < krows; k++) {
234 for (
int l = 0; l < kcols; l++)
236 tmp += srcImage->
imageData[(i + k - bordery) * w + j + l - borderx]
237 * values[ksize - k * kcols - l - 1];
243 }
else if (tmp < 0) {
246 __tmp_res[i * w + j] = char(tmp);
257 for (
int i = bordery; i < h - bordery; i++)
259 for (
int j = borderx; j < w - borderx; j++)
262 for (
int k = 0; k < krows; k++) {
263 for (
int l = 0; l < kcols; l++)
265 tmp += srcImage->
imageData[(i + k - bordery) * w + j + l - borderx]
266 * values[ksize - k * kcols - l - 1];
272 }
else if (tmp < -128) {
275 __tmp_res[i * w + j] = char(tmp);
296 static float *__tmp_res =
nullptr;
297 static int __tmp_size = -1;
306 float *values = ktmp->
values;
312 const int kcols = ktmp->
nCols;
313 const int krows = ktmp->
nRows;
314 const int borderx = kcols / 2;
315 const int bordery = krows / 2;
316 const int w = srcImage->
width;
317 const int h = srcImage->
height;
323 if (__tmp_res ==
nullptr)
325 __tmp_size = dstImage->
imageSize /
sizeof(float);
327 __tmp_res = AllocAligned<float> (dstImage->
imageSize /
sizeof(
float));
332 if (__tmp_size < (
int)(dstImage->
imageSize /
sizeof(
float)))
336 FreeAligned<float> (__tmp_res);
337 __tmp_size = dstImage->
imageSize /
sizeof(float);
339 __tmp_res = AllocAligned<float> (dstImage->
imageSize /
sizeof(
float));
344 if (srcImage != dstImage)
347 auto* source =
reinterpret_cast<float*
>(srcImage->
imageData);
348 auto* dest =
reinterpret_cast<float*
>(dstImage->
imageData);
349 for (
int i = bordery; i < h - bordery; i++)
351 for (
int j = borderx; j < w - borderx; j++)
354 for (
int k = 0; k < krows; k++) {
355 for (
int l = 0; l < kcols; l++)
357 tmp += source[(i + k - bordery) * w + j + l - borderx]
358 * values[ksize - k * kcols - l - 1];
361 dest[i * w + j] = tmp;
369 auto* source =
reinterpret_cast<float*
>(srcImage->
imageData);
371 for (
int i = bordery; i < h - bordery; i++)
373 for (
int j = borderx; j < w - borderx; j++)
376 for (
int k = 0; k < krows; k++) {
377 for (
int l = 0; l < kcols; l++)
379 tmp += source[(i + k - bordery) * w + j + l - borderx]
380 * values[ksize - k * kcols - l - 1];
383 __tmp_res[i * w + j] = tmp;
398 static float *__tmp_res =
nullptr;
399 static int __tmp_size = -1;
401 if (xKernel !=
nullptr)
406 if (yKernel !=
nullptr)
414 float *xvalues = (xKernel !=
nullptr) ? xKernel->
values :
nullptr;
415 const int xksize = (xKernel !=
nullptr) ? xKernel->
nCols : 0;
416 float *yvalues = (yKernel !=
nullptr) ? yKernel->
values :
nullptr;
417 const int yksize = (yKernel !=
nullptr) ? yKernel->
nRows : 0;
419 const int borderx = (xKernel !=
nullptr) ? xKernel->
nCols / 2 : 0;
420 const int bordery = (yKernel !=
nullptr) ? yKernel->
nRows / 2 : 0;
421 const int w = srcImage->
width;
422 const int h = srcImage->
height;
428 if (__tmp_res ==
nullptr)
430 __tmp_size = dstImage->
imageSize /
sizeof(float);
432 __tmp_res = AllocAligned<float> (dstImage->
imageSize /
sizeof(
float));
437 if (__tmp_size <
int(dstImage->
imageSize /
sizeof(
float)))
441 FreeAligned<float> (__tmp_res);
442 __tmp_size = dstImage->
imageSize /
sizeof(float);
444 __tmp_res = AllocAligned<float> (dstImage->
imageSize /
sizeof(
float));
450 auto* src =
reinterpret_cast<float*
>(srcImage->
imageData);
451 auto* dst =
reinterpret_cast<float*
>(dstImage->
imageData);
452 if (xKernel !=
nullptr)
456 for (
int i = 0; i < h; i++)
458 for (
int j = borderx; j < w - borderx; j++)
461 for (
int k = 0; k < xksize; k++)
463 tmp += src[i * w + j + k - borderx]
464 * xvalues[xksize - k - 1];
466 __tmp_res[i * w + j] = tmp;
471 if (yKernel !=
nullptr)
475 for (
int i = bordery; i < h - bordery; i++)
478 for (
int j = borderx; j < w - borderx; j++)
481 for (
int k = 0; k < yksize; k++)
483 tmp += __tmp_res[(i + k - bordery) * w + j]
484 * yvalues[yksize - k - 1];
486 dst[i * w + j] = tmp;
506 static char *__tmp_res =
nullptr;
507 static int __tmp_size = -1;
509 if (xKernel !=
nullptr)
514 if (yKernel !=
nullptr)
522 int *xvalues = (xKernel !=
nullptr) ? xKernel->
values :
nullptr;
523 const int xksize = (xKernel !=
nullptr) ? xKernel->
nCols : 0;
524 int *yvalues = (yKernel !=
nullptr) ? yKernel->
values :
nullptr;
525 const int yksize = (yKernel !=
nullptr) ? yKernel->
nRows : 0;
527 const int borderx = (xKernel !=
nullptr) ? xKernel->
nCols / 2 : 0;
528 const int bordery = (yKernel !=
nullptr) ? yKernel->
nRows / 2 : 0;
529 const int w = srcImage->
width;
530 const int h = srcImage->
height;
535 if (__tmp_res ==
nullptr)
539 __tmp_res = AllocAligned<char> (dstImage->
imageSize);
544 if (__tmp_size < dstImage->imageSize)
547 FreeAligned<char> (__tmp_res);
551 __tmp_res = AllocAligned<char> (dstImage->
imageSize);
556 switch (srcImage->
depth)
560 if (xKernel !=
nullptr)
564 for (
int i = 0; i < h; i++)
566 for (
int j = borderx; j < w - borderx; j++)
569 for (
int k = 0; k < xksize; k++)
571 tmp += srcImage->
imageData[i * w + j + k - borderx]
572 * xvalues[xksize - k - 1];
577 }
else if (tmp < 0) {
580 __tmp_res[i * w + j] = char(tmp);
585 if (yKernel !=
nullptr)
589 for (
int i = bordery; i < h - bordery; i++)
592 for (
int j = borderx; j < w - borderx; j++)
595 for (
int k = 0; k < yksize; k++)
597 tmp += __tmp_res[(i + k - bordery) * w + j]
598 * yvalues[yksize - k - 1];
603 }
else if (tmp < 0) {
606 dstImage->
imageData[i * w + j] = char(tmp);
615 if (xKernel !=
nullptr)
618 for (
int i = 0; i < h; i++)
620 for (
int j = borderx; j < w - borderx; j++)
623 for (
int k = 0; k < xksize; k++)
625 tmp += srcImage->
imageData[i * w + j + k - borderx]
626 * xvalues[xksize - k - 1];
631 }
else if (tmp < -128) {
634 __tmp_res[i * w + j] = char(tmp);
639 if (yKernel !=
nullptr)
642 for (
int i = bordery; i < h - bordery; i++)
644 for (
int j = borderx; j < w - borderx; j++)
647 for (
int k = 0; k < yksize; k++)
649 tmp += __tmp_res[(i + k - bordery) * w + j]
650 * yvalues[yksize - k - 1];
655 }
else if (tmp < -128) {
658 dstImage->
imageData[i * w + j] = char(tmp);
687 switch (image->
depth)
729 auto* tmp =
reinterpret_cast<float*
>(image->
imageData);
730 const int limit = image->
imageSize /
sizeof(float);
731 for (
int i = 0; i < limit; i++)
733 *tmp++ = float(fillValue);
747 image->
roi =
nullptr;
791 (
int nChannels,
int alphaChannel,
int depth,
792 char* colorModel,
char* channelSeq,
int dataOrder,
793 int origin,
int align,
843 const int linew = width * (depth &
IPL_DEPTH_MASK) / 8 * nChannels;
896 if (image ==
nullptr) {
934 for (
int i = 0; i < 4; i++) {
935 if ((border >> i) & 0x1)
956 const int size = image->
imageSize /
sizeof(float);
957 auto* tmp =
reinterpret_cast<float*
>(image->
imageData);
958 for (
int i = 0; i < size; i++) {
970 switch (srcImage->
depth)
975 auto* src = (
unsigned char *)srcImage->
imageData;
976 auto* dst = (
unsigned char *)dstImage->
imageData;
980 for (
int i = 0; i < size; i++)
982 tmp = *src++ + value;
985 }
else if (tmp > 255) {
1001 for (
int i = 0; i < size; i++)
1003 tmp = *src++ + value;
1006 }
else if (tmp > 127) {
1031 switch (srcImageA->
depth)
1036 auto* src1 = (
unsigned char *)srcImageA->
imageData;
1037 auto* src2 = (
unsigned char *)srcImageB->
imageData;
1038 auto* dst = (
unsigned char *)dstImage->
imageData;
1042 for (
int i = 0; i < size; i++)
1044 tmp = *src1++ + *src2++;
1062 for (
int i = 0; i < size; i++)
1064 tmp = *src1++ + *src2++;
1067 }
else if (tmp > 127) {
1077 const int size = srcImageA->
imageSize /
sizeof(float);
1078 auto* src1 =
reinterpret_cast<float*
>(srcImageA->
imageData);
1079 auto* src2 =
reinterpret_cast<float*
>(srcImageB->
imageData);
1080 auto* dst =
reinterpret_cast<float*
>(dstImage->
imageData);
1082 for (
int i = 0; i < size; i++)
1084 *dst++ = *src1++ + *src2++;
1103 switch (srcImageA->
depth)
1108 auto* src1 = (
unsigned char *)srcImageA->
imageData;
1109 auto* src2 = (
unsigned char *)srcImageB->
imageData;
1110 auto* dst = (
unsigned char *)dstImage->
imageData;
1114 for (
int i = 0; i < size; i++)
1116 tmp = *src1++ - *src2++;
1137 for (
int i = 0; i < size; i++)
1139 tmp = *src1++ - *src2++;
1142 }
else if (tmp > 127) {
1152 const int size = srcImageA->
imageSize /
sizeof(float);
1153 auto* src1 =
reinterpret_cast<float*
>(srcImageA->
imageData);
1154 auto* src2 =
reinterpret_cast<float*
>(srcImageB->
imageData);
1155 auto* dst =
reinterpret_cast<float*
>(dstImage->
imageData);
1157 for (
int i = 0; i < size; i++)
1159 *dst++ = *src1++ - *src2++;
1175 switch (srcImage->
depth)
1180 auto* src = (
unsigned char *)srcImage->
imageData;
1181 auto* dst = (
unsigned char *)dstImage->
imageData;
1185 for (
int i = 0; i < size; i++)
1188 tmp = value - *src++;
1190 tmp = *src++ - value;
1195 }
else if (tmp > 255) {
1211 for (
int i = 0; i < size; i++)
1214 tmp = value - *src++;
1216 tmp = *src++ - value;
1221 }
else if (tmp > 127) {
1242 const int size = srcImage->
imageSize /
sizeof(float);
1243 auto* src1 =
reinterpret_cast<float*
>(srcImage->
imageData);
1244 auto* dst =
reinterpret_cast<float*
>(dstImage->
imageData);
1246 for (
int i = 0; i < size; i++)
1248 *dst++ = *src1++ * value;
1254 switch (srcImage->
depth)
1268 for (
int i = 0; i < size; i++)
1288 switch (srcImage->
depth)
1293 auto* src = (
unsigned char *)srcImage->
imageData;
1294 auto* dst = (
unsigned char *)dstImage->
imageData;
1296 for (
int i = 0; i < size; i++)
1298 if (*src++ < threshold) {
1313 for (
int i = 0; i < size; i++)
1315 if (*src++ < threshold) {
1342 const int h = dstImage->
height;
1343 const int w = dstImage->
width;
1344 const int size = w * h;
1345 for (
int i = 0; i < size; i++)
1347 short tmp = *sdata++;
1357 int width,
int height ))
1365 int xOffset,
int yOffset,
1366 int width,
int height))
1377 auto* sdata = (
unsigned char *)rgbImage->
imageData;
1378 auto* ddata0 = (
unsigned char *)hsvImage->
imageData;
1379 unsigned char *ddata1 = ddata0 + 1;
1380 unsigned char *ddata2 = ddata1 + 1;
1383 double red,green,blue;
1386 const int width = rgbImage->
width;
1387 const int height = rgbImage->
height;
1388 const int size = width * height;
1390 for (
int i = 0; i < size; i++)
1392 blue = *sdata++ / 255.0;
1393 green = *sdata++ / 255.0;
1394 red = *sdata++ / 255.0;
1396 if (red > green && red > blue)
1406 if (green > red && green > blue)
1426 *ddata2 = (
unsigned char)(255.0 * max);
1432 sat = *ddata1 = (
unsigned char)(255 * (max - min) / max);
1442 double rc = (max - red) / (max - min);
1443 double gc = (max - green) / (max - min);
1444 double bc = (max - blue) / (max - min);
1447 }
else if (green == max) {
1449 }
else if (blue == max) {
1458 yAssert(hue >= 0.0 && hue < 360.0);
1462 hue = (hue / 360.0 * 256.0);
1467 *ddata0 = (
unsigned char)(hue);
1481 unsigned int value))
void iplSubtract(IplImage *srcImageA, IplImage *srcImageB, IplImage *dstImage)
void iplDeleteConvKernelFP(IplConvKernelFP *kernel)
int PAD_BYTES(int len, int pad)
this might turn out to be useful.
int _iplCalcPadding(int lineSize, int align)
Computes the ipl image padding.
void iplCopy(IplImage *srcImage, IplImage *dstImage)
bool compareHeader(IplImage *A, IplImage *B)
IplImage * iplCreateImageHeader(int nChannels, int alphaChannel, int depth, char *colorModel, char *channelSeq, int dataOrder, int origin, int align, int width, int height, IplROI *roi, IplImage *maskROI, void *imageId, IplTileInfo *tileInfo)
void iplHSV2RGB(IplImage *hsvImage, IplImage *rgbImage)
void iplDeleteConvKernel(IplConvKernel *kernel)
void iplDeallocateImage(IplImage *image)
void iplGetConvKernelFP(IplConvKernelFP *kernel, int *nCols, int *nRows, int *anchorX, int *anchorY, float **values)
void iplGetConvKernel(IplConvKernel *kernel, int *nCols, int *nRows, int *anchorX, int *anchorY, int **values, int *nShiftR)
void iplDeallocateHeader(IplImage *image)
void iplSet(IplImage *image, int fillValue)
IplConvKernel * iplCreateConvKernel(int nCols, int nRows, int anchorX, int anchorY, int *values, int nShiftR)
WARNING: most of this is implemented for PAD_BYTES == 0.
void iplConvolveSep2DFP(IplImage *srcImage, IplImage *dstImage, IplConvKernelFP *xKernel, IplConvKernelFP *yKernel)
void iplColorToGray(IplImage *srcImage, IplImage *dstImage)
IplROI * iplCreateROI(int coi, int xOffset, int yOffset, int width, int height)
void iplSubtractS(IplImage *srcImage, IplImage *dstImage, int value, bool flip)
void iplThreshold(IplImage *srcImage, IplImage *dstImage, int threshold)
IplImage * iplCloneImage(const IplImage *img)
void iplAbs(IplImage *srcImage, IplImage *dstImage)
void iplAllocateImageFP(IplImage *image, int doFill, float fillValue)
void iplConvolve2DFP(IplImage *srcImage, IplImage *dstImage, IplConvKernelFP **kernel, int nKernels, int combineMethod)
void iplSetBorderMode(IplImage *src, int mode, int border, int constVal)
void iplDeallocate(IplImage *image, int flag)
void iplConvolveSep2D(IplImage *srcImage, IplImage *dstImage, IplConvKernel *xKernel, IplConvKernel *yKernel)
void iplRGB2HSV(IplImage *rgbImage, IplImage *hsvImage)
void iplAddS(IplImage *srcImage, IplImage *dstImage, int value)
void iplAllocateImage(IplImage *image, int doFill, int fillValue)
void iplXorS(IplImage *srcImage, IplImage *dstImage, unsigned int value)
void iplMultiplySFP(IplImage *srcImage, IplImage *dstImage, float value)
void iplAdd(IplImage *srcImageA, IplImage *srcImageB, IplImage *dstImage)
IplConvKernelFP * iplCreateConvKernelFP(int nCols, int nRows, int anchorX, int anchorY, float *values)
void iplSetROI(IplROI *roi, int coi, int xOffset, int yOffset, int width, int height)
T * AllocAligned(int size)
void iplSetFP(IplImage *image, float fillValue)
void iplConvolve2D(IplImage *srcImage, IplImage *dstImage, IplConvKernel **kernel, int nKernels, int combineMethod)
#define IPLAPIIMPL(type, name, arg)
Definition for functions implemented within YARP_sig.
struct _IplConvKernel IplConvKernel
#define IPL_IMAGE_ALL_WITHOUT_MASK
struct _IplTileInfo IplTileInfo
struct _IplImage IplImage
struct _IplConvKernelFP IplConvKernelFP
#define IPL_DATA_ORDER_PIXEL
int dataOrder
0 - interleaved color channels, 1 - separate color channels.
int BorderMode[4]
ignored by OpenCV
char * imageDataOrigin
pointer to very origin of image data (not necessarily aligned) - needed for correct deallocation
struct _IplTileInfo * tileInfo
must be null
struct _IplImage * maskROI
must be NULL
int nChannels
Most of OpenCV functions support 1,2,3 or 4 channels.
int BorderConst[4]
ignored by OpenCV
struct _IplROI * roi
image ROI.
int height
image height in pixels
int alphaChannel
ignored by OpenCV
int align
Alignment of image rows (4 or 8).
char * imageData
pointer to aligned image data
int imageSize
image data size in bytes (==image->height*image->widthStep in case of interleaved data)
char colorModel[4]
ignored by OpenCV
void * imageId
must be NULL
int nSize
sizeof(IplImage)
int origin
0 - top-left origin, 1 - bottom-left origin (Windows bitmaps style)
int widthStep
size of aligned image row in bytes
int depth
pixel depth in bits: IPL_DEPTH_8U, IPL_DEPTH_8S, IPL_DEPTH_16S, IPL_DEPTH_32S, IPL_DEPTH_32F and IPL_...
char channelSeq[4]
ignored by OpenCV
int width
image width in pixels