⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 iplimage.cpp

📁 一个语言识别引擎
💻 CPP
📖 第 1 页 / 共 4 页
字号:
                            tmp = 0;
                        if (tmp > 255)
                            tmp = 255;
                        *dst++ = char(tmp);
                    }
            }
            break;

        case IPL_DEPTH_8S:
            {
                const int size = srcImageA->imageSize;
                char * src1 = srcImageA->imageData;
                char * src2 = srcImageB->imageData;
                char * dst = dstImage->imageData;
			
                short tmp;

                for (int i = 0; i < size; i++)
                    {
                        tmp = *src1++ - *src2++;
                        if (tmp < -128) 
                            tmp = -128;
                        else
                            if (tmp > 127)
                                tmp = 127;
                        *dst++ = char(tmp);
                    }
            }
            break;

        case IPL_DEPTH_32F:
            {
                const int size = srcImageA->imageSize / sizeof(float);
                float * src1 = (float *)srcImageA->imageData;
                float * src2 = (float *)srcImageB->imageData;
                float * dst = (float *)dstImage->imageData;
			
                for (int i = 0; i < size; i++)
                    {
                        *dst++ = *src1++ - *src2++;
                    }
            }
            break;

        default:
            assert (1 == 0);
            // NOT IMPLEMENTED.
            break;
        }
}

IPLAPIIMPL(void, iplSubtractS,(IplImage* srcImage, IplImage* dstImage, int value,
                               bool flip))
{
	// assume images have the same size and 8 bits/pixel/planes.
	switch (srcImage->depth)
        {
        case IPL_DEPTH_8U:
            {
                const int size = srcImage->imageSize;
                unsigned char * src = (unsigned char *)srcImage->imageData;
                unsigned char * dst = (unsigned char *)dstImage->imageData;
			
                short tmp;

                for (int i = 0; i < size; i++)
                    {
                        if (flip)
                            tmp = value - *src++;
                        else
                            tmp = *src++ - value;

                        if (tmp < 0) 
                            tmp = 0;
                        else
                            if (tmp > 255)
                                tmp = 255;
                        *dst++ = char(tmp);
                    }
            }
            break;

        case IPL_DEPTH_8S:
            {
                const int size = srcImage->imageSize;
                char * src = srcImage->imageData;
                char * dst = dstImage->imageData;
			
                short tmp;

                for (int i = 0; i < size; i++)
                    {
                        if (flip)
                            tmp = value - *src++;
                        else
                            tmp = *src++ - value;

                        if (tmp < -128) 
                            tmp = -128;
                        else
                            if (tmp > 127)
                                tmp = 127;
                        *dst++ = char(tmp);
                    }
            }
            break;

        default:
            assert (1 == 0);
            // NOT IMPLEMENTED.
            break;
        }
}

IPLAPIIMPL(void, iplMultiplySFP,(IplImage* srcImage, IplImage* dstImage,
                                 float value))
{
	assert (compareHeader (srcImage, dstImage));
	assert (srcImage->depth == IPL_DEPTH_32F);

	const int size = srcImage->imageSize / sizeof(float);
	float * src1 = (float *)srcImage->imageData;
	float * dst = (float *)dstImage->imageData;
	
	for (int i = 0; i < size; i++)
        {
            *dst++ = *src1++ * value;
        }
}

IPLAPIIMPL(void, iplAbs,(IplImage* srcImage, IplImage* dstImage))
{
	switch (srcImage->depth)
        {
        case IPL_DEPTH_8U:
            {
                memcpy (dstImage->imageData, srcImage->imageData, dstImage->imageSize);
            }
            break;

        case IPL_DEPTH_8S:
            {
                const int size = srcImage->imageSize;
                char * src = srcImage->imageData;
                char * dst = dstImage->imageData;
			
                for (int i = 0; i < size; i++)
                    {
                        if (*src < 0)
                            *dst++ = -*src++;
                        else
                            *dst++ = *src++;
                    }
            }
            break;

        default:
            assert (1 == 0);
            // NOT IMPLEMENTED.
            break;
        }
}

IPLAPIIMPL(void, iplThreshold, (IplImage* srcImage, IplImage* dstImage, int threshold))
{
	switch (srcImage->depth)
        {
        case IPL_DEPTH_8U:
            {
                const int size = srcImage->imageSize;
                unsigned char * src = (unsigned char *)srcImage->imageData;
                unsigned char * dst = (unsigned char *)dstImage->imageData;

                for (int i = 0; i < size; i++)
                    {
                        if (*src++ < threshold)
                            *dst++ = 0;
                        else
                            *dst++ = 255;
                    }
            }
            break;

        case IPL_DEPTH_8S:
            {
                const int size = srcImage->imageSize;
                char * src = srcImage->imageData;
                char * dst = dstImage->imageData;
			
                for (int i = 0; i < size; i++)
                    {
                        if (*src++ < threshold)
                            *dst++ = -128;
                        else
                            *dst++ = 127;
                    }
            }
            break;

        default:
            assert (1 == 0);
            // NOT IMPLEMENTED.
            break;
        }
}

// TODO: HSV to Gray!
IPLAPIIMPL(void, iplColorToGray,(IplImage* srcImage, IplImage* dstImage))
{
	assert (srcImage->width == dstImage->width);
	assert (srcImage->height == dstImage->height);
	assert (srcImage->depth == dstImage->depth);
	assert (srcImage->depth != IPL_DEPTH_32F);

	char *sdata = srcImage->imageData;	// color
	char *dst = dstImage->imageData;	// BW

	const int h = dstImage->height;
	const int w = dstImage->width;
	const int size = w * h;
	for (int i = 0; i < size; i++)
        {
            short tmp = *sdata++;
            tmp += *sdata++;
            tmp += *sdata++;
            tmp /= 3;

            *dst++ = char(tmp);
        }
}

IPLAPIIMPL(IplROI *,iplCreateROI,(int coi,    int xOffset, int   yOffset,
                                  int width, int height ))
{
	// NOT IMPLEMENTED YET.
	assert (implemented_yet == 0);
	return NULL;
}

IPLAPIIMPL(void, iplSetROI,(IplROI*   roi,      int coi,
                            int       xOffset,  int yOffset,
                            int width,          int height))
{
	assert (implemented_yet == 0);
}

// LATER: image types are not checked.
// It should be RGB not signed.
IPLAPIIMPL(void, iplRGB2HSV,(IplImage* rgbImage, IplImage* hsvImage))
{
	// Image types should be checked.
	//const int planesize = rgbImage->widthStep * rgbImage->height;
	unsigned char *sdata = (unsigned char *)rgbImage->imageData; // bgr
	unsigned char *ddata0 = (unsigned char *)hsvImage->imageData;		// Hue.
	unsigned char *ddata1 = ddata0 + 1;		// Saturation.
	unsigned char *ddata2 = ddata1 + 1;		// Value.

	double max,min;
	double red,green,blue;
	double hue,sat;

	const int width = rgbImage->width;
	const int height = rgbImage->height;
	const int size = width * height; // # of pixels.

	for (int i = 0; i < size; i++)
        {
            blue = *sdata++ / 255.0;
            green = *sdata++ / 255.0;
            red = *sdata++ / 255.0;

            if (red > green && red > blue) 
                {
                    max = red;
                    if (green > blue)
                        min = blue;
                    else
                        min = green;
                }
            else
                if (green > red && green > blue)
                    {
                        max = green;
                        if (red > blue)
                            min = blue;
                        else
                            min = red;
                    }
                else
                    {
                        max = blue;
                        if (red > green)
                            min = green;
                        else
                            min = red;
                    }

            // value
            *ddata2 = (unsigned char)(255.0 * max);
            ddata2 += 3;

            // saturation
            if (max != 0.0)
                {
                    sat = *ddata1 = (unsigned char)(255 * (max - min) / max);
                }
            else
                sat = *ddata1 = 0;
            ddata1 += 3;

            // hue
            if (sat == 0)
                *ddata0 = 0;
            else
                {
                    double rc = (max - red) / (max - min);
                    double gc = (max - green) / (max - min);
                    double bc = (max - blue) / (max - min);
                    if (red == max)
                        hue = bc - gc;
                    else
                        if (green == max)
                            hue = 2 + rc - bc;
                        else
                            if (blue == max)
                                hue = 4 + gc - rc;

                    hue *= 60.0;
                    if (hue < 0.0)
                        hue += 360.0;
		
                    assert (hue >= 0.0 && hue < 360.0);
                    // IPL 2.5 compatibility. Scaling to 0-255
                    // there's a little chance that the value rounds to 256.0!
                    // need clipping rather than truncation.
                    hue = (hue / 360.0 * 256.0);
                    if (hue == 256.0)
                        hue = 255.0;

                    *ddata0 = (unsigned char)(hue);
                }

            ddata0 += 3;
        }
}

IPLAPIIMPL(void, iplHSV2RGB,(IplImage* hsvImage, IplImage* rgbImage))
{
	// NOT IMPLEMENTED YET.
	assert (implemented_yet == 0);
}

IPLAPIIMPL(void, iplXorS,(IplImage* srcImage, IplImage* dstImage,
                          unsigned int value))
{
	// NOT IMPLEMENTED YET.s
	assert (1 == 0);
}

// computes the number of pad bytes (end of line) give the line len and 
// the requested alignment in byte 
inline int _iplCalcPadding (int lineSize, int align)
{
	return PAD_BYTES (lineSize, align);
}

// not used outside this file.
#undef IPLAPIIMPL

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -