mirror of
https://github.com/opencv/opencv.git
synced 2026-07-30 15:53:03 +04:00
Merge branch 4.x
This commit is contained in:
@@ -532,149 +532,153 @@ enum HistCompMethods {
|
||||
|
||||
/** the color conversion codes
|
||||
@see @ref imgproc_color_conversions
|
||||
@note The source image (src) must be of an appropriate type for the desired color conversion.
|
||||
- `[8U]` means to support `CV_8U` src type.
|
||||
- `[16U]` means to support `CV_16U` src type.
|
||||
- `[32F]` means to support `CV_32F` src type.
|
||||
@ingroup imgproc_color_conversions
|
||||
*/
|
||||
enum ColorConversionCodes {
|
||||
COLOR_BGR2BGRA = 0, //!< add alpha channel to RGB or BGR image
|
||||
COLOR_RGB2RGBA = COLOR_BGR2BGRA,
|
||||
COLOR_BGR2BGRA = 0, //!< [8U/16U/32F] add alpha channel to RGB or BGR image
|
||||
COLOR_RGB2RGBA = COLOR_BGR2BGRA, //!< [8U/16U/32F]
|
||||
|
||||
COLOR_BGRA2BGR = 1, //!< remove alpha channel from RGB or BGR image
|
||||
COLOR_RGBA2RGB = COLOR_BGRA2BGR,
|
||||
COLOR_BGRA2BGR = 1, //!< [8U/16U/32F] remove alpha channel from RGB or BGR image
|
||||
COLOR_RGBA2RGB = COLOR_BGRA2BGR, //!< [8U/16U/32F]
|
||||
|
||||
COLOR_BGR2RGBA = 2, //!< convert between RGB and BGR color spaces (with or without alpha channel)
|
||||
COLOR_RGB2BGRA = COLOR_BGR2RGBA,
|
||||
COLOR_BGR2RGBA = 2, //!< [8U/16U/32F] convert between RGB and BGR color spaces (with or without alpha channel)
|
||||
COLOR_RGB2BGRA = COLOR_BGR2RGBA, //!< [8U/16U/32F]
|
||||
|
||||
COLOR_RGBA2BGR = 3,
|
||||
COLOR_BGRA2RGB = COLOR_RGBA2BGR,
|
||||
COLOR_RGBA2BGR = 3, //!< [8U/16U/32F]
|
||||
COLOR_BGRA2RGB = COLOR_RGBA2BGR, //!< [8U/16U/32F]
|
||||
|
||||
COLOR_BGR2RGB = 4,
|
||||
COLOR_RGB2BGR = COLOR_BGR2RGB,
|
||||
COLOR_BGR2RGB = 4, //!< [8U/16U/32F]
|
||||
COLOR_RGB2BGR = COLOR_BGR2RGB, //!< [8U/16U/32F]
|
||||
|
||||
COLOR_BGRA2RGBA = 5,
|
||||
COLOR_RGBA2BGRA = COLOR_BGRA2RGBA,
|
||||
COLOR_BGRA2RGBA = 5, //!< [8U/16U/32F]
|
||||
COLOR_RGBA2BGRA = COLOR_BGRA2RGBA, //!< [8U/16U/32F]
|
||||
|
||||
COLOR_BGR2GRAY = 6, //!< convert between RGB/BGR and grayscale, @ref color_convert_rgb_gray "color conversions"
|
||||
COLOR_RGB2GRAY = 7,
|
||||
COLOR_GRAY2BGR = 8,
|
||||
COLOR_GRAY2RGB = COLOR_GRAY2BGR,
|
||||
COLOR_GRAY2BGRA = 9,
|
||||
COLOR_GRAY2RGBA = COLOR_GRAY2BGRA,
|
||||
COLOR_BGRA2GRAY = 10,
|
||||
COLOR_RGBA2GRAY = 11,
|
||||
COLOR_BGR2GRAY = 6, //!< [8U/16U/32F] convert between RGB/BGR and grayscale, @ref color_convert_rgb_gray "color conversions"
|
||||
COLOR_RGB2GRAY = 7, //!< [8U/16U/32F]
|
||||
COLOR_GRAY2BGR = 8, //!< [8U/16U/32F]
|
||||
COLOR_GRAY2RGB = COLOR_GRAY2BGR, //!< [8U/16U/32F]
|
||||
COLOR_GRAY2BGRA = 9, //!< [8U/16U/32F]
|
||||
COLOR_GRAY2RGBA = COLOR_GRAY2BGRA, //!< [8U/16U/32F]
|
||||
COLOR_BGRA2GRAY = 10, //!< [8U/16U/32F]
|
||||
COLOR_RGBA2GRAY = 11, //!< [8U/16U/32F]
|
||||
|
||||
COLOR_BGR2BGR565 = 12, //!< convert between RGB/BGR and BGR565 (16-bit images)
|
||||
COLOR_RGB2BGR565 = 13,
|
||||
COLOR_BGR5652BGR = 14,
|
||||
COLOR_BGR5652RGB = 15,
|
||||
COLOR_BGRA2BGR565 = 16,
|
||||
COLOR_RGBA2BGR565 = 17,
|
||||
COLOR_BGR5652BGRA = 18,
|
||||
COLOR_BGR5652RGBA = 19,
|
||||
COLOR_BGR2BGR565 = 12, //!< [8U] convert between RGB/BGR and BGR565 (16-bit images)
|
||||
COLOR_RGB2BGR565 = 13, //!< [8U]
|
||||
COLOR_BGR5652BGR = 14, //!< [8U]
|
||||
COLOR_BGR5652RGB = 15, //!< [8U]
|
||||
COLOR_BGRA2BGR565 = 16, //!< [8U]
|
||||
COLOR_RGBA2BGR565 = 17, //!< [8U]
|
||||
COLOR_BGR5652BGRA = 18, //!< [8U]
|
||||
COLOR_BGR5652RGBA = 19, //!< [8U]
|
||||
|
||||
COLOR_GRAY2BGR565 = 20, //!< convert between grayscale to BGR565 (16-bit images)
|
||||
COLOR_BGR5652GRAY = 21,
|
||||
COLOR_GRAY2BGR565 = 20, //!< [8U] convert between grayscale to BGR565 (16-bit images)
|
||||
COLOR_BGR5652GRAY = 21, //!< [8U]
|
||||
|
||||
COLOR_BGR2BGR555 = 22, //!< convert between RGB/BGR and BGR555 (16-bit images)
|
||||
COLOR_RGB2BGR555 = 23,
|
||||
COLOR_BGR5552BGR = 24,
|
||||
COLOR_BGR5552RGB = 25,
|
||||
COLOR_BGRA2BGR555 = 26,
|
||||
COLOR_RGBA2BGR555 = 27,
|
||||
COLOR_BGR5552BGRA = 28,
|
||||
COLOR_BGR5552RGBA = 29,
|
||||
COLOR_BGR2BGR555 = 22, //!< [8U] convert between RGB/BGR and BGR555 (16-bit images)
|
||||
COLOR_RGB2BGR555 = 23, //!< [8U]
|
||||
COLOR_BGR5552BGR = 24, //!< [8U]
|
||||
COLOR_BGR5552RGB = 25, //!< [8U]
|
||||
COLOR_BGRA2BGR555 = 26, //!< [8U]
|
||||
COLOR_RGBA2BGR555 = 27, //!< [8U]
|
||||
COLOR_BGR5552BGRA = 28, //!< [8U]
|
||||
COLOR_BGR5552RGBA = 29, //!< [8U]
|
||||
|
||||
COLOR_GRAY2BGR555 = 30, //!< convert between grayscale and BGR555 (16-bit images)
|
||||
COLOR_BGR5552GRAY = 31,
|
||||
COLOR_GRAY2BGR555 = 30, //!< [8U] convert between grayscale and BGR555 (16-bit images)
|
||||
COLOR_BGR5552GRAY = 31, //!< [8U]
|
||||
|
||||
COLOR_BGR2XYZ = 32, //!< convert RGB/BGR to CIE XYZ, @ref color_convert_rgb_xyz "color conversions"
|
||||
COLOR_RGB2XYZ = 33,
|
||||
COLOR_XYZ2BGR = 34,
|
||||
COLOR_XYZ2RGB = 35,
|
||||
COLOR_BGR2XYZ = 32, //!< [8U/16U/32F] convert RGB/BGR to CIE XYZ, @ref color_convert_rgb_xyz "color conversions"
|
||||
COLOR_RGB2XYZ = 33, //!< [8U/16U/32F]
|
||||
COLOR_XYZ2BGR = 34, //!< [8U/16U/32F]
|
||||
COLOR_XYZ2RGB = 35, //!< [8U/16U/32F]
|
||||
|
||||
COLOR_BGR2YCrCb = 36, //!< convert RGB/BGR to luma-chroma (aka YCC), @ref color_convert_rgb_ycrcb "color conversions"
|
||||
COLOR_RGB2YCrCb = 37,
|
||||
COLOR_YCrCb2BGR = 38,
|
||||
COLOR_YCrCb2RGB = 39,
|
||||
COLOR_BGR2YCrCb = 36, //!< [8U/16U/32F] convert RGB/BGR to luma-chroma (aka YCC), @ref color_convert_rgb_ycrcb "color conversions"
|
||||
COLOR_RGB2YCrCb = 37, //!< [8U/16U/32F]
|
||||
COLOR_YCrCb2BGR = 38, //!< [8U/16U/32F]
|
||||
COLOR_YCrCb2RGB = 39, //!< [8U/16U/32F]
|
||||
|
||||
COLOR_BGR2HSV = 40, //!< convert RGB/BGR to HSV (hue saturation value) with H range 0..180 if 8 bit image, @ref color_convert_rgb_hsv "color conversions"
|
||||
COLOR_RGB2HSV = 41,
|
||||
COLOR_BGR2HSV = 40, //!< [8U/32F] convert RGB/BGR to HSV (hue saturation value) with H range 0..180 if 8 bit image, @ref color_convert_rgb_hsv "color conversions"
|
||||
COLOR_RGB2HSV = 41, //!< [8U/32F]
|
||||
|
||||
COLOR_BGR2Lab = 44, //!< convert RGB/BGR to CIE Lab, @ref color_convert_rgb_lab "color conversions"
|
||||
COLOR_RGB2Lab = 45,
|
||||
COLOR_BGR2Lab = 44, //!< [8U/32F] convert RGB/BGR to CIE Lab, @ref color_convert_rgb_lab "color conversions"
|
||||
COLOR_RGB2Lab = 45, //!< [8U/32F]
|
||||
|
||||
COLOR_BGR2Luv = 50, //!< convert RGB/BGR to CIE Luv, @ref color_convert_rgb_luv "color conversions"
|
||||
COLOR_RGB2Luv = 51,
|
||||
COLOR_BGR2HLS = 52, //!< convert RGB/BGR to HLS (hue lightness saturation) with H range 0..180 if 8 bit image, @ref color_convert_rgb_hls "color conversions"
|
||||
COLOR_RGB2HLS = 53,
|
||||
COLOR_BGR2Luv = 50, //!< [8U/32F] convert RGB/BGR to CIE Luv, @ref color_convert_rgb_luv "color conversions"
|
||||
COLOR_RGB2Luv = 51, //!< [8U/32F]
|
||||
COLOR_BGR2HLS = 52, //!< [8U/32F] convert RGB/BGR to HLS (hue lightness saturation) with H range 0..180 if 8 bit image, @ref color_convert_rgb_hls "color conversions"
|
||||
COLOR_RGB2HLS = 53, //!< [8U/32F]
|
||||
|
||||
COLOR_HSV2BGR = 54, //!< backward conversions HSV to RGB/BGR with H range 0..180 if 8 bit image
|
||||
COLOR_HSV2RGB = 55,
|
||||
COLOR_HSV2BGR = 54, //!< [8U/32F] backward conversions HSV to RGB/BGR with H range 0..180 if 8 bit image
|
||||
COLOR_HSV2RGB = 55, //!< [8U/32F]
|
||||
|
||||
COLOR_Lab2BGR = 56,
|
||||
COLOR_Lab2RGB = 57,
|
||||
COLOR_Luv2BGR = 58,
|
||||
COLOR_Luv2RGB = 59,
|
||||
COLOR_HLS2BGR = 60, //!< backward conversions HLS to RGB/BGR with H range 0..180 if 8 bit image
|
||||
COLOR_HLS2RGB = 61,
|
||||
COLOR_Lab2BGR = 56, //!< [8U/32F]
|
||||
COLOR_Lab2RGB = 57, //!< [8U/32F]
|
||||
COLOR_Luv2BGR = 58, //!< [8U/32F]
|
||||
COLOR_Luv2RGB = 59, //!< [8U/32F]
|
||||
COLOR_HLS2BGR = 60, //!< [8U/32F] backward conversions HLS to RGB/BGR with H range 0..180 if 8 bit image
|
||||
COLOR_HLS2RGB = 61, //!< [8U/32F]
|
||||
|
||||
COLOR_BGR2HSV_FULL = 66, //!< convert RGB/BGR to HSV (hue saturation value) with H range 0..255 if 8 bit image, @ref color_convert_rgb_hsv "color conversions"
|
||||
COLOR_RGB2HSV_FULL = 67,
|
||||
COLOR_BGR2HLS_FULL = 68, //!< convert RGB/BGR to HLS (hue lightness saturation) with H range 0..255 if 8 bit image, @ref color_convert_rgb_hls "color conversions"
|
||||
COLOR_RGB2HLS_FULL = 69,
|
||||
COLOR_BGR2HSV_FULL = 66, //!< [8U/32F] convert RGB/BGR to HSV (hue saturation value) with H range 0..255 if 8 bit image, @ref color_convert_rgb_hsv "color conversions"
|
||||
COLOR_RGB2HSV_FULL = 67, //!< [8U/32F]
|
||||
COLOR_BGR2HLS_FULL = 68, //!< [8U/32F] convert RGB/BGR to HLS (hue lightness saturation) with H range 0..255 if 8 bit image, @ref color_convert_rgb_hls "color conversions"
|
||||
COLOR_RGB2HLS_FULL = 69, //!< [8U/32F]
|
||||
|
||||
COLOR_HSV2BGR_FULL = 70, //!< backward conversions HSV to RGB/BGR with H range 0..255 if 8 bit image
|
||||
COLOR_HSV2RGB_FULL = 71,
|
||||
COLOR_HLS2BGR_FULL = 72, //!< backward conversions HLS to RGB/BGR with H range 0..255 if 8 bit image
|
||||
COLOR_HLS2RGB_FULL = 73,
|
||||
COLOR_HSV2BGR_FULL = 70, //!< [8U/32F] backward conversions HSV to RGB/BGR with H range 0..255 if 8 bit image
|
||||
COLOR_HSV2RGB_FULL = 71, //!< [8U/32F]
|
||||
COLOR_HLS2BGR_FULL = 72, //!< [8U/32F] backward conversions HLS to RGB/BGR with H range 0..255 if 8 bit image
|
||||
COLOR_HLS2RGB_FULL = 73, //!< [8U/32F]
|
||||
|
||||
COLOR_LBGR2Lab = 74,
|
||||
COLOR_LRGB2Lab = 75,
|
||||
COLOR_LBGR2Luv = 76,
|
||||
COLOR_LRGB2Luv = 77,
|
||||
COLOR_LBGR2Lab = 74, //!< [8U/32F]
|
||||
COLOR_LRGB2Lab = 75, //!< [8U/32F]
|
||||
COLOR_LBGR2Luv = 76, //!< [8U/32F]
|
||||
COLOR_LRGB2Luv = 77, //!< [8U/32F]
|
||||
|
||||
COLOR_Lab2LBGR = 78,
|
||||
COLOR_Lab2LRGB = 79,
|
||||
COLOR_Luv2LBGR = 80,
|
||||
COLOR_Luv2LRGB = 81,
|
||||
COLOR_Lab2LBGR = 78, //!< [8U/32F]
|
||||
COLOR_Lab2LRGB = 79, //!< [8U/32F]
|
||||
COLOR_Luv2LBGR = 80, //!< [8U/32F]
|
||||
COLOR_Luv2LRGB = 81, //!< [8U/32F]
|
||||
|
||||
COLOR_BGR2YUV = 82, //!< convert between RGB/BGR and YUV
|
||||
COLOR_RGB2YUV = 83,
|
||||
COLOR_YUV2BGR = 84,
|
||||
COLOR_YUV2RGB = 85,
|
||||
COLOR_BGR2YUV = 82, //!< [8U/16U/32F] convert between RGB/BGR and YUV
|
||||
COLOR_RGB2YUV = 83, //!< [8U/16U/32F]
|
||||
COLOR_YUV2BGR = 84, //!< [8U/16U/32F]
|
||||
COLOR_YUV2RGB = 85, //!< [8U/16U/32F]
|
||||
|
||||
COLOR_YUV2RGB_NV12 = 90, //!< convert between 4:2:0-subsampled YUV NV12 and RGB, two planes (in one or separate arrays): Y and U/V interleaved, see @ref color_convert_rgb_yuv_42x
|
||||
COLOR_YUV2BGR_NV12 = 91, //!< convert between 4:2:0-subsampled YUV NV12 and BGR, two planes (in one or separate arrays): Y and U/V interleaved, see @ref color_convert_rgb_yuv_42x
|
||||
COLOR_YUV2RGB_NV21 = 92, //!< convert between 4:2:0-subsampled YUV NV21 and RGB, two planes (in one or separate arrays): Y and V/U interleaved, see @ref color_convert_rgb_yuv_42x
|
||||
COLOR_YUV2BGR_NV21 = 93, //!< convert between 4:2:0-subsampled YUV NV21 and BGR, two planes (in one or separate arrays): Y and V/U interleaved, see @ref color_convert_rgb_yuv_42x
|
||||
COLOR_YUV2RGB_NV12 = 90, //!< [8U] convert between 4:2:0-subsampled YUV NV12 and RGB, two planes (in one or separate arrays): Y and U/V interleaved, see @ref color_convert_rgb_yuv_42x
|
||||
COLOR_YUV2BGR_NV12 = 91, //!< [8U] convert between 4:2:0-subsampled YUV NV12 and BGR, two planes (in one or separate arrays): Y and U/V interleaved, see @ref color_convert_rgb_yuv_42x
|
||||
COLOR_YUV2RGB_NV21 = 92, //!< [8U] convert between 4:2:0-subsampled YUV NV21 and RGB, two planes (in one or separate arrays): Y and V/U interleaved, see @ref color_convert_rgb_yuv_42x
|
||||
COLOR_YUV2BGR_NV21 = 93, //!< [8U] convert between 4:2:0-subsampled YUV NV21 and BGR, two planes (in one or separate arrays): Y and V/U interleaved, see @ref color_convert_rgb_yuv_42x
|
||||
COLOR_YUV420sp2RGB = COLOR_YUV2RGB_NV21, //!< synonym to NV21
|
||||
COLOR_YUV420sp2BGR = COLOR_YUV2BGR_NV21, //!< synonym to NV21
|
||||
|
||||
COLOR_YUV2RGBA_NV12 = 94, //!< convert between 4:2:0-subsampled YUV NV12 and RGBA, two planes (in one or separate arrays): Y and U/V interleaved, see @ref color_convert_rgb_yuv_42x
|
||||
COLOR_YUV2BGRA_NV12 = 95, //!< convert between 4:2:0-subsampled YUV NV12 and BGRA, two planes (in one or separate arrays): Y and U/V interleaved, see @ref color_convert_rgb_yuv_42x
|
||||
COLOR_YUV2RGBA_NV21 = 96, //!< convert between 4:2:0-subsampled YUV NV21 and RGBA, two planes (in one or separate arrays): Y and V/U interleaved, see @ref color_convert_rgb_yuv_42x
|
||||
COLOR_YUV2BGRA_NV21 = 97, //!< convert between 4:2:0-subsampled YUV NV21 and BGRA, two planes (in one or separate arrays): Y and V/U interleaved, see @ref color_convert_rgb_yuv_42x
|
||||
COLOR_YUV2RGBA_NV12 = 94, //!< [8U] convert between 4:2:0-subsampled YUV NV12 and RGBA, two planes (in one or separate arrays): Y and U/V interleaved, see @ref color_convert_rgb_yuv_42x
|
||||
COLOR_YUV2BGRA_NV12 = 95, //!< [8U] convert between 4:2:0-subsampled YUV NV12 and BGRA, two planes (in one or separate arrays): Y and U/V interleaved, see @ref color_convert_rgb_yuv_42x
|
||||
COLOR_YUV2RGBA_NV21 = 96, //!< [8U] convert between 4:2:0-subsampled YUV NV21 and RGBA, two planes (in one or separate arrays): Y and V/U interleaved, see @ref color_convert_rgb_yuv_42x
|
||||
COLOR_YUV2BGRA_NV21 = 97, //!< [8U] convert between 4:2:0-subsampled YUV NV21 and BGRA, two planes (in one or separate arrays): Y and V/U interleaved, see @ref color_convert_rgb_yuv_42x
|
||||
COLOR_YUV420sp2RGBA = COLOR_YUV2RGBA_NV21, //!< synonym to NV21
|
||||
COLOR_YUV420sp2BGRA = COLOR_YUV2BGRA_NV21, //!< synonym to NV21
|
||||
|
||||
COLOR_YUV2RGB_YV12 = 98, //!< convert between 4:2:0-subsampled YUV YV12 and RGB, three planes in one array: Y, V and U, see @ref color_convert_rgb_yuv_42x
|
||||
COLOR_YUV2BGR_YV12 = 99, //!< convert between 4:2:0-subsampled YUV YV12 and BGR, three planes in one array: Y, V and U, see @ref color_convert_rgb_yuv_42x
|
||||
COLOR_YUV2RGB_IYUV = 100, //!< convert between 4:2:0-subsampled YUV IYUV and RGB, three planes in one array: Y, U and V, see @ref color_convert_rgb_yuv_42x
|
||||
COLOR_YUV2BGR_IYUV = 101, //!< convert between 4:2:0-subsampled YUV IYUV and BGR, three planes in one array: Y, U and V, see @ref color_convert_rgb_yuv_42x
|
||||
COLOR_YUV2RGB_YV12 = 98, //!< [8U] convert between 4:2:0-subsampled YUV YV12 and RGB, three planes in one array: Y, V and U, see @ref color_convert_rgb_yuv_42x
|
||||
COLOR_YUV2BGR_YV12 = 99, //!< [8U] convert between 4:2:0-subsampled YUV YV12 and BGR, three planes in one array: Y, V and U, see @ref color_convert_rgb_yuv_42x
|
||||
COLOR_YUV2RGB_IYUV = 100, //!< [8U] convert between 4:2:0-subsampled YUV IYUV and RGB, three planes in one array: Y, U and V, see @ref color_convert_rgb_yuv_42x
|
||||
COLOR_YUV2BGR_IYUV = 101, //!< [8U] convert between 4:2:0-subsampled YUV IYUV and BGR, three planes in one array: Y, U and V, see @ref color_convert_rgb_yuv_42x
|
||||
COLOR_YUV2RGB_I420 = COLOR_YUV2RGB_IYUV, //!< synonym to IYUV
|
||||
COLOR_YUV2BGR_I420 = COLOR_YUV2BGR_IYUV, //!< synonym to IYUV
|
||||
COLOR_YUV420p2RGB = COLOR_YUV2RGB_YV12, //!< synonym to YV12
|
||||
COLOR_YUV420p2BGR = COLOR_YUV2BGR_YV12, //!< synonym to YV12
|
||||
|
||||
COLOR_YUV2RGBA_YV12 = 102, //!< convert between 4:2:0-subsampled YUV YV12 and RGBA, three planes in one array: Y, V and U, see @ref color_convert_rgb_yuv_42x
|
||||
COLOR_YUV2BGRA_YV12 = 103, //!< convert between 4:2:0-subsampled YUV YV12 and BGRA, three planes in one array: Y, V and U, see @ref color_convert_rgb_yuv_42x
|
||||
COLOR_YUV2RGBA_IYUV = 104, //!< convert between 4:2:0-subsampled YUV YV12 and RGBA, three planes in one array: Y, U and V, see @ref color_convert_rgb_yuv_42x
|
||||
COLOR_YUV2BGRA_IYUV = 105, //!< convert between 4:2:0-subsampled YUV YV12 and BGRA, three planes in one array: Y, U and V, see @ref color_convert_rgb_yuv_42x
|
||||
COLOR_YUV2RGBA_YV12 = 102, //!< [8U] convert between 4:2:0-subsampled YUV YV12 and RGBA, three planes in one array: Y, V and U, see @ref color_convert_rgb_yuv_42x
|
||||
COLOR_YUV2BGRA_YV12 = 103, //!< [8U] convert between 4:2:0-subsampled YUV YV12 and BGRA, three planes in one array: Y, V and U, see @ref color_convert_rgb_yuv_42x
|
||||
COLOR_YUV2RGBA_IYUV = 104, //!< [8U] convert between 4:2:0-subsampled YUV YV12 and RGBA, three planes in one array: Y, U and V, see @ref color_convert_rgb_yuv_42x
|
||||
COLOR_YUV2BGRA_IYUV = 105, //!< [8U] convert between 4:2:0-subsampled YUV YV12 and BGRA, three planes in one array: Y, U and V, see @ref color_convert_rgb_yuv_42x
|
||||
COLOR_YUV2RGBA_I420 = COLOR_YUV2RGBA_IYUV, //!< synonym to IYUV
|
||||
COLOR_YUV2BGRA_I420 = COLOR_YUV2BGRA_IYUV, //!< synonym to IYUV
|
||||
COLOR_YUV420p2RGBA = COLOR_YUV2RGBA_YV12, //!< synonym to YV12
|
||||
COLOR_YUV420p2BGRA = COLOR_YUV2BGRA_YV12, //!< synonym to YV12
|
||||
|
||||
COLOR_YUV2GRAY_420 = 106, //!< extract Y channel from YUV 4:2:0 image
|
||||
COLOR_YUV2GRAY_420 = 106, //!< [8U] extract Y channel from YUV 4:2:0 image
|
||||
COLOR_YUV2GRAY_NV21 = COLOR_YUV2GRAY_420, //!< synonym to COLOR_YUV2GRAY_420
|
||||
COLOR_YUV2GRAY_NV12 = COLOR_YUV2GRAY_420, //!< synonym to COLOR_YUV2GRAY_420
|
||||
COLOR_YUV2GRAY_YV12 = COLOR_YUV2GRAY_420, //!< synonym to COLOR_YUV2GRAY_420
|
||||
@@ -683,8 +687,8 @@ enum ColorConversionCodes {
|
||||
COLOR_YUV420sp2GRAY = COLOR_YUV2GRAY_420, //!< synonym to COLOR_YUV2GRAY_420
|
||||
COLOR_YUV420p2GRAY = COLOR_YUV2GRAY_420, //!< synonym to COLOR_YUV2GRAY_420
|
||||
|
||||
COLOR_YUV2RGB_UYVY = 107, //!< convert between YUV UYVY and RGB, YUV is 4:2:2-subsampled and interleaved as U/Y1/V/Y2, see @ref color_convert_rgb_yuv_42x
|
||||
COLOR_YUV2BGR_UYVY = 108, //!< convert between YUV UYVY and BGR, YUV is 4:2:2-subsampled and interleaved as U/Y1/V/Y2, see @ref color_convert_rgb_yuv_42x
|
||||
COLOR_YUV2RGB_UYVY = 107, //!< [8U] convert between YUV UYVY and RGB, YUV is 4:2:2-subsampled and interleaved as U/Y1/V/Y2, see @ref color_convert_rgb_yuv_42x
|
||||
COLOR_YUV2BGR_UYVY = 108, //!< [8U] convert between YUV UYVY and BGR, YUV is 4:2:2-subsampled and interleaved as U/Y1/V/Y2, see @ref color_convert_rgb_yuv_42x
|
||||
//COLOR_YUV2RGB_VYUY = 109, //!< convert between YUV VYUY and RGB, YUV is 4:2:2-subsampled and interleaved as V/Y1/U/Y2, see @ref color_convert_rgb_yuv_42x
|
||||
//COLOR_YUV2BGR_VYUY = 110, //!< convert between YUV VYUY and BGR, YUV is 4:2:2-subsampled and interleaved as V/Y1/U/Y2, see @ref color_convert_rgb_yuv_42x
|
||||
COLOR_YUV2RGB_Y422 = COLOR_YUV2RGB_UYVY, //!< synonym to UYVY
|
||||
@@ -692,180 +696,181 @@ enum ColorConversionCodes {
|
||||
COLOR_YUV2RGB_UYNV = COLOR_YUV2RGB_UYVY, //!< synonym to UYVY
|
||||
COLOR_YUV2BGR_UYNV = COLOR_YUV2BGR_UYVY, //!< synonym to UYVY
|
||||
|
||||
COLOR_YUV2RGBA_UYVY = 111, //!< convert between YUV UYVY and RGBA, YUV is 4:2:2-subsampled and interleaved as U/Y1/V/Y2, see @ref color_convert_rgb_yuv_42x
|
||||
COLOR_YUV2BGRA_UYVY = 112, //!< convert between YUV UYVY and BGRA, YUV is 4:2:2-subsampled and interleaved as U/Y1/V/Y2, see @ref color_convert_rgb_yuv_42x
|
||||
//COLOR_YUV2RGBA_VYUY = 113, //!< convert between YUV VYUY and RGBA, YUV is 4:2:2-subsampled and interleaved as V/Y1/U/Y2, see @ref color_convert_rgb_yuv_42x
|
||||
//COLOR_YUV2BGRA_VYUY = 114, //!< convert between YUV VYUY and BGRA, YUV is 4:2:2-subsampled and interleaved as V/Y1/U/Y2, see @ref color_convert_rgb_yuv_42x
|
||||
COLOR_YUV2RGBA_UYVY = 111, //!< [8U] convert between YUV UYVY and RGBA, YUV is 4:2:2-subsampled and interleaved as U/Y1/V/Y2, see @ref color_convert_rgb_yuv_42x
|
||||
COLOR_YUV2BGRA_UYVY = 112, //!< [8U] convert between YUV UYVY and BGRA, YUV is 4:2:2-subsampled and interleaved as U/Y1/V/Y2, see @ref color_convert_rgb_yuv_42x
|
||||
//COLOR_YUV2RGBA_VYUY = 113, //!< [8U] convert between YUV VYUY and RGBA, YUV is 4:2:2-subsampled and interleaved as V/Y1/U/Y2, see @ref color_convert_rgb_yuv_42x
|
||||
//COLOR_YUV2BGRA_VYUY = 114, //!< [8U] convert between YUV VYUY and BGRA, YUV is 4:2:2-subsampled and interleaved as V/Y1/U/Y2, see @ref color_convert_rgb_yuv_42x
|
||||
COLOR_YUV2RGBA_Y422 = COLOR_YUV2RGBA_UYVY, //!< synonym to UYVY
|
||||
COLOR_YUV2BGRA_Y422 = COLOR_YUV2BGRA_UYVY, //!< synonym to UYVY
|
||||
COLOR_YUV2RGBA_UYNV = COLOR_YUV2RGBA_UYVY, //!< synonym to UYVY
|
||||
COLOR_YUV2BGRA_UYNV = COLOR_YUV2BGRA_UYVY, //!< synonym to UYVY
|
||||
|
||||
COLOR_YUV2RGB_YUY2 = 115, //!< convert between YUV YUY2 and RGB, YUV is 4:2:2-subsampled and interleaved as Y1/U/Y2/V, see @ref color_convert_rgb_yuv_42x
|
||||
COLOR_YUV2BGR_YUY2 = 116, //!< convert between YUV YUY2 and BGR, YUV is 4:2:2-subsampled and interleaved as Y1/U/Y2/V, see @ref color_convert_rgb_yuv_42x
|
||||
COLOR_YUV2RGB_YVYU = 117, //!< convert between YUV YVYU and RGB, YUV is 4:2:2-subsampled and interleaved as Y1/V/Y2/U, see @ref color_convert_rgb_yuv_42x
|
||||
COLOR_YUV2BGR_YVYU = 118, //!< convert between YUV YVYU and BGR, YUV is 4:2:2-subsampled and interleaved as Y1/V/Y2/U, see @ref color_convert_rgb_yuv_42x
|
||||
COLOR_YUV2RGB_YUY2 = 115, //!< [8U] convert between YUV YUY2 and RGB, YUV is 4:2:2-subsampled and interleaved as Y1/U/Y2/V, see @ref color_convert_rgb_yuv_42x
|
||||
COLOR_YUV2BGR_YUY2 = 116, //!< [8U] convert between YUV YUY2 and BGR, YUV is 4:2:2-subsampled and interleaved as Y1/U/Y2/V, see @ref color_convert_rgb_yuv_42x
|
||||
COLOR_YUV2RGB_YVYU = 117, //!< [8U] convert between YUV YVYU and RGB, YUV is 4:2:2-subsampled and interleaved as Y1/V/Y2/U, see @ref color_convert_rgb_yuv_42x
|
||||
COLOR_YUV2BGR_YVYU = 118, //!< [8U] convert between YUV YVYU and BGR, YUV is 4:2:2-subsampled and interleaved as Y1/V/Y2/U, see @ref color_convert_rgb_yuv_42x
|
||||
COLOR_YUV2RGB_YUYV = COLOR_YUV2RGB_YUY2, //!< synonym to YUY2
|
||||
COLOR_YUV2BGR_YUYV = COLOR_YUV2BGR_YUY2, //!< synonym to YUY2
|
||||
COLOR_YUV2RGB_YUNV = COLOR_YUV2RGB_YUY2, //!< synonym to YUY2
|
||||
COLOR_YUV2BGR_YUNV = COLOR_YUV2BGR_YUY2, //!< synonym to YUY2
|
||||
|
||||
COLOR_YUV2RGBA_YUY2 = 119, //!< convert between YUV YUY2 and RGBA, YUV is 4:2:2-subsampled and interleaved as Y1/U/Y2/V, see @ref color_convert_rgb_yuv_42x
|
||||
COLOR_YUV2BGRA_YUY2 = 120, //!< convert between YUV YUY2 and BGRA, YUV is 4:2:2-subsampled and interleaved as Y1/U/Y2/V, see @ref color_convert_rgb_yuv_42x
|
||||
COLOR_YUV2RGBA_YVYU = 121, //!< convert between YUV YVYU and RGBA, YUV is 4:2:2-subsampled and interleaved as Y1/V/Y2/U, see @ref color_convert_rgb_yuv_42x
|
||||
COLOR_YUV2BGRA_YVYU = 122, //!< convert between YUV YVYU and BGRA, YUV is 4:2:2-subsampled and interleaved as Y1/V/Y2/U, see @ref color_convert_rgb_yuv_42x
|
||||
COLOR_YUV2RGBA_YUY2 = 119, //!< [8U] convert between YUV YUY2 and RGBA, YUV is 4:2:2-subsampled and interleaved as Y1/U/Y2/V, see @ref color_convert_rgb_yuv_42x
|
||||
COLOR_YUV2BGRA_YUY2 = 120, //!< [8U] convert between YUV YUY2 and BGRA, YUV is 4:2:2-subsampled and interleaved as Y1/U/Y2/V, see @ref color_convert_rgb_yuv_42x
|
||||
COLOR_YUV2RGBA_YVYU = 121, //!< [8U] convert between YUV YVYU and RGBA, YUV is 4:2:2-subsampled and interleaved as Y1/V/Y2/U, see @ref color_convert_rgb_yuv_42x
|
||||
COLOR_YUV2BGRA_YVYU = 122, //!< [8U] convert between YUV YVYU and BGRA, YUV is 4:2:2-subsampled and interleaved as Y1/V/Y2/U, see @ref color_convert_rgb_yuv_42x
|
||||
COLOR_YUV2RGBA_YUYV = COLOR_YUV2RGBA_YUY2, //!< synonym to YUY2
|
||||
COLOR_YUV2BGRA_YUYV = COLOR_YUV2BGRA_YUY2, //!< synonym to YUY2
|
||||
COLOR_YUV2RGBA_YUNV = COLOR_YUV2RGBA_YUY2, //!< synonym to YUY2
|
||||
COLOR_YUV2BGRA_YUNV = COLOR_YUV2BGRA_YUY2, //!< synonym to YUY2
|
||||
|
||||
COLOR_YUV2GRAY_UYVY = 123, //!< extract Y channel from YUV 4:2:2 image
|
||||
COLOR_YUV2GRAY_YUY2 = 124, //!< extract Y channel from YUV 4:2:2 image
|
||||
//COLOR_YUV2GRAY_VYUY = COLOR_YUV2GRAY_UYVY,
|
||||
COLOR_YUV2GRAY_UYVY = 123, //!< [8U] extract Y channel from YUV 4:2:2 image
|
||||
COLOR_YUV2GRAY_YUY2 = 124, //!< [8U] extract Y channel from YUV 4:2:2 image
|
||||
//CV_YUV2GRAY_VYUY = CV_YUV2GRAY_UYVY, //!< synonym to COLOR_YUV2GRAY_UYVY
|
||||
COLOR_YUV2GRAY_Y422 = COLOR_YUV2GRAY_UYVY, //!< synonym to COLOR_YUV2GRAY_UYVY
|
||||
COLOR_YUV2GRAY_UYNV = COLOR_YUV2GRAY_UYVY, //!< synonym to COLOR_YUV2GRAY_UYVY
|
||||
COLOR_YUV2GRAY_YVYU = COLOR_YUV2GRAY_YUY2, //!< synonym to COLOR_YUV2GRAY_YUY2
|
||||
COLOR_YUV2GRAY_YUYV = COLOR_YUV2GRAY_YUY2, //!< synonym to COLOR_YUV2GRAY_YUY2
|
||||
COLOR_YUV2GRAY_YUNV = COLOR_YUV2GRAY_YUY2, //!< synonym to COLOR_YUV2GRAY_YUY2
|
||||
|
||||
//! alpha premultiplication
|
||||
COLOR_RGBA2mRGBA = 125,
|
||||
COLOR_mRGBA2RGBA = 126,
|
||||
COLOR_RGBA2mRGBA = 125, //!< [8U]
|
||||
COLOR_mRGBA2RGBA = 126, //!< [8U]
|
||||
|
||||
COLOR_RGB2YUV_I420 = 127, //!< convert between RGB and 4:2:0-subsampled YUV I420, three planes in one array: Y, U and V, see @ref color_convert_rgb_yuv_42x
|
||||
COLOR_BGR2YUV_I420 = 128, //!< convert between BGR and 4:2:0-subsampled YUV I420, three planes in one array: Y, U and V, see @ref color_convert_rgb_yuv_42x
|
||||
COLOR_RGB2YUV_I420 = 127, //!< [8U] convert between RGB and 4:2:0-subsampled YUV I420, three planes in one array: Y, U and V, see @ref color_convert_rgb_yuv_42x
|
||||
COLOR_BGR2YUV_I420 = 128, //!< [8U] convert between BGR and 4:2:0-subsampled YUV I420, three planes in one array: Y, U and V, see @ref color_convert_rgb_yuv_42x
|
||||
COLOR_RGB2YUV_IYUV = COLOR_RGB2YUV_I420, //!< synonym to I420
|
||||
COLOR_BGR2YUV_IYUV = COLOR_BGR2YUV_I420, //!< synonym to I420
|
||||
|
||||
COLOR_RGBA2YUV_I420 = 129, //!< convert between RGBA and 4:2:0-subsampled YUV I420, three planes in one array: Y, U and V, see @ref color_convert_rgb_yuv_42x
|
||||
COLOR_BGRA2YUV_I420 = 130, //!< convert between BGRA and 4:2:0-subsampled YUV I420, three planes in one array: Y, U and V, see @ref color_convert_rgb_yuv_42x
|
||||
COLOR_RGBA2YUV_I420 = 129, //!< [8U] convert between RGBA and 4:2:0-subsampled YUV I420, three planes in one array: Y, U and V, see @ref color_convert_rgb_yuv_42x
|
||||
COLOR_BGRA2YUV_I420 = 130, //!< [8U] convert between BGRA and 4:2:0-subsampled YUV I420, three planes in one array: Y, U and V, see @ref color_convert_rgb_yuv_42x
|
||||
COLOR_RGBA2YUV_IYUV = COLOR_RGBA2YUV_I420, //!< synonym to I420
|
||||
COLOR_BGRA2YUV_IYUV = COLOR_BGRA2YUV_I420, //!< synonym to I420
|
||||
COLOR_RGB2YUV_YV12 = 131, //!< convert between RGB and 4:2:0-subsampled YUV YV12, three planes in one array: Y, V and U, see @ref color_convert_rgb_yuv_42x
|
||||
COLOR_BGR2YUV_YV12 = 132, //!< convert between BGR and 4:2:0-subsampled YUV YV12, three planes in one array: Y, V and U, see @ref color_convert_rgb_yuv_42x
|
||||
COLOR_RGBA2YUV_YV12 = 133, //!< convert between RGBA and 4:2:0-subsampled YUV YV12, three planes in one array: Y, V and U, see @ref color_convert_rgb_yuv_42x
|
||||
COLOR_BGRA2YUV_YV12 = 134, //!< convert between BGRA and 4:2:0-subsampled YUV YV12, three planes in one array: Y, V and U, see @ref color_convert_rgb_yuv_42x
|
||||
COLOR_RGB2YUV_YV12 = 131, //!< [8U] convert between RGB and 4:2:0-subsampled YUV YV12, three planes in one array: Y, V and U, see @ref color_convert_rgb_yuv_42x
|
||||
COLOR_BGR2YUV_YV12 = 132, //!< [8U] convert between BGR and 4:2:0-subsampled YUV YV12, three planes in one array: Y, V and U, see @ref color_convert_rgb_yuv_42x
|
||||
COLOR_RGBA2YUV_YV12 = 133, //!< [8U] convert between RGBA and 4:2:0-subsampled YUV YV12, three planes in one array: Y, V and U, see @ref color_convert_rgb_yuv_42x
|
||||
COLOR_BGRA2YUV_YV12 = 134, //!< [8U] convert between BGRA and 4:2:0-subsampled YUV YV12, three planes in one array: Y, V and U, see @ref color_convert_rgb_yuv_42x
|
||||
|
||||
//! Demosaicing, see @ref color_convert_bayer "color conversions" for additional information
|
||||
COLOR_BayerBG2BGR = 46, //!< equivalent to RGGB Bayer pattern
|
||||
COLOR_BayerGB2BGR = 47, //!< equivalent to GRBG Bayer pattern
|
||||
COLOR_BayerRG2BGR = 48, //!< equivalent to BGGR Bayer pattern
|
||||
COLOR_BayerGR2BGR = 49, //!< equivalent to GBRG Bayer pattern
|
||||
COLOR_BayerBG2BGR = 46, //!< [8U/16U] equivalent to RGGB Bayer pattern
|
||||
COLOR_BayerGB2BGR = 47, //!< [8U/16U] equivalent to GRBG Bayer pattern
|
||||
COLOR_BayerRG2BGR = 48, //!< [8U/16U] equivalent to BGGR Bayer pattern
|
||||
COLOR_BayerGR2BGR = 49, //!< [8U/16U] equivalent to GBRG Bayer pattern
|
||||
|
||||
COLOR_BayerRGGB2BGR = COLOR_BayerBG2BGR,
|
||||
COLOR_BayerGRBG2BGR = COLOR_BayerGB2BGR,
|
||||
COLOR_BayerBGGR2BGR = COLOR_BayerRG2BGR,
|
||||
COLOR_BayerGBRG2BGR = COLOR_BayerGR2BGR,
|
||||
COLOR_BayerRGGB2BGR = COLOR_BayerBG2BGR, //!< [8U/16U]
|
||||
COLOR_BayerGRBG2BGR = COLOR_BayerGB2BGR, //!< [8U/16U]
|
||||
COLOR_BayerBGGR2BGR = COLOR_BayerRG2BGR, //!< [8U/16U]
|
||||
COLOR_BayerGBRG2BGR = COLOR_BayerGR2BGR, //!< [8U/16U]
|
||||
|
||||
COLOR_BayerRGGB2RGB = COLOR_BayerBGGR2BGR,
|
||||
COLOR_BayerGRBG2RGB = COLOR_BayerGBRG2BGR,
|
||||
COLOR_BayerBGGR2RGB = COLOR_BayerRGGB2BGR,
|
||||
COLOR_BayerGBRG2RGB = COLOR_BayerGRBG2BGR,
|
||||
COLOR_BayerRGGB2RGB = COLOR_BayerBGGR2BGR, //!< [8U/16U]
|
||||
COLOR_BayerGRBG2RGB = COLOR_BayerGBRG2BGR, //!< [8U/16U]
|
||||
COLOR_BayerBGGR2RGB = COLOR_BayerRGGB2BGR, //!< [8U/16U]
|
||||
COLOR_BayerGBRG2RGB = COLOR_BayerGRBG2BGR, //!< [8U/16U]
|
||||
|
||||
COLOR_BayerBG2RGB = COLOR_BayerRG2BGR, //!< equivalent to RGGB Bayer pattern
|
||||
COLOR_BayerGB2RGB = COLOR_BayerGR2BGR, //!< equivalent to GRBG Bayer pattern
|
||||
COLOR_BayerRG2RGB = COLOR_BayerBG2BGR, //!< equivalent to BGGR Bayer pattern
|
||||
COLOR_BayerGR2RGB = COLOR_BayerGB2BGR, //!< equivalent to GBRG Bayer pattern
|
||||
COLOR_BayerBG2RGB = COLOR_BayerRG2BGR, //!< [8U/16U] equivalent to RGGB Bayer pattern
|
||||
COLOR_BayerGB2RGB = COLOR_BayerGR2BGR, //!< [8U/16U] equivalent to GRBG Bayer pattern
|
||||
COLOR_BayerRG2RGB = COLOR_BayerBG2BGR, //!< [8U/16U] equivalent to BGGR Bayer pattern
|
||||
COLOR_BayerGR2RGB = COLOR_BayerGB2BGR, //!< [8U/16U] equivalent to GBRG Bayer pattern
|
||||
|
||||
COLOR_BayerBG2GRAY = 86, //!< equivalent to RGGB Bayer pattern
|
||||
COLOR_BayerGB2GRAY = 87, //!< equivalent to GRBG Bayer pattern
|
||||
COLOR_BayerRG2GRAY = 88, //!< equivalent to BGGR Bayer pattern
|
||||
COLOR_BayerGR2GRAY = 89, //!< equivalent to GBRG Bayer pattern
|
||||
COLOR_BayerBG2GRAY = 86, //!< [8U/16U] equivalent to RGGB Bayer pattern
|
||||
COLOR_BayerGB2GRAY = 87, //!< [8U/16U] equivalent to GRBG Bayer pattern
|
||||
COLOR_BayerRG2GRAY = 88, //!< [8U/16U] equivalent to BGGR Bayer pattern
|
||||
COLOR_BayerGR2GRAY = 89, //!< [8U/16U] equivalent to GBRG Bayer pattern
|
||||
|
||||
COLOR_BayerRGGB2GRAY = COLOR_BayerBG2GRAY,
|
||||
COLOR_BayerGRBG2GRAY = COLOR_BayerGB2GRAY,
|
||||
COLOR_BayerBGGR2GRAY = COLOR_BayerRG2GRAY,
|
||||
COLOR_BayerGBRG2GRAY = COLOR_BayerGR2GRAY,
|
||||
COLOR_BayerRGGB2GRAY = COLOR_BayerBG2GRAY, //!< [8U/16U]
|
||||
COLOR_BayerGRBG2GRAY = COLOR_BayerGB2GRAY, //!< [8U/16U]
|
||||
COLOR_BayerBGGR2GRAY = COLOR_BayerRG2GRAY, //!< [8U/16U]
|
||||
COLOR_BayerGBRG2GRAY = COLOR_BayerGR2GRAY, //!< [8U/16U]
|
||||
|
||||
//! Demosaicing using Variable Number of Gradients
|
||||
COLOR_BayerBG2BGR_VNG = 62, //!< equivalent to RGGB Bayer pattern
|
||||
COLOR_BayerGB2BGR_VNG = 63, //!< equivalent to GRBG Bayer pattern
|
||||
COLOR_BayerRG2BGR_VNG = 64, //!< equivalent to BGGR Bayer pattern
|
||||
COLOR_BayerGR2BGR_VNG = 65, //!< equivalent to GBRG Bayer pattern
|
||||
COLOR_BayerBG2BGR_VNG = 62, //!< [8U] equivalent to RGGB Bayer pattern
|
||||
COLOR_BayerGB2BGR_VNG = 63, //!< [8U] equivalent to GRBG Bayer pattern
|
||||
COLOR_BayerRG2BGR_VNG = 64, //!< [8U] equivalent to BGGR Bayer pattern
|
||||
COLOR_BayerGR2BGR_VNG = 65, //!< [8U] equivalent to GBRG Bayer pattern
|
||||
|
||||
COLOR_BayerRGGB2BGR_VNG = COLOR_BayerBG2BGR_VNG,
|
||||
COLOR_BayerGRBG2BGR_VNG = COLOR_BayerGB2BGR_VNG,
|
||||
COLOR_BayerBGGR2BGR_VNG = COLOR_BayerRG2BGR_VNG,
|
||||
COLOR_BayerGBRG2BGR_VNG = COLOR_BayerGR2BGR_VNG,
|
||||
COLOR_BayerRGGB2BGR_VNG = COLOR_BayerBG2BGR_VNG, //!< [8U]
|
||||
COLOR_BayerGRBG2BGR_VNG = COLOR_BayerGB2BGR_VNG, //!< [8U]
|
||||
COLOR_BayerBGGR2BGR_VNG = COLOR_BayerRG2BGR_VNG, //!< [8U]
|
||||
COLOR_BayerGBRG2BGR_VNG = COLOR_BayerGR2BGR_VNG, //!< [8U]
|
||||
|
||||
COLOR_BayerRGGB2RGB_VNG = COLOR_BayerBGGR2BGR_VNG,
|
||||
COLOR_BayerGRBG2RGB_VNG = COLOR_BayerGBRG2BGR_VNG,
|
||||
COLOR_BayerBGGR2RGB_VNG = COLOR_BayerRGGB2BGR_VNG,
|
||||
COLOR_BayerGBRG2RGB_VNG = COLOR_BayerGRBG2BGR_VNG,
|
||||
COLOR_BayerRGGB2RGB_VNG = COLOR_BayerBGGR2BGR_VNG, //!< [8U]
|
||||
COLOR_BayerGRBG2RGB_VNG = COLOR_BayerGBRG2BGR_VNG, //!< [8U]
|
||||
COLOR_BayerBGGR2RGB_VNG = COLOR_BayerRGGB2BGR_VNG, //!< [8U]
|
||||
COLOR_BayerGBRG2RGB_VNG = COLOR_BayerGRBG2BGR_VNG, //!< [8U]
|
||||
|
||||
COLOR_BayerBG2RGB_VNG = COLOR_BayerRG2BGR_VNG, //!< equivalent to RGGB Bayer pattern
|
||||
COLOR_BayerGB2RGB_VNG = COLOR_BayerGR2BGR_VNG, //!< equivalent to GRBG Bayer pattern
|
||||
COLOR_BayerRG2RGB_VNG = COLOR_BayerBG2BGR_VNG, //!< equivalent to BGGR Bayer pattern
|
||||
COLOR_BayerGR2RGB_VNG = COLOR_BayerGB2BGR_VNG, //!< equivalent to GBRG Bayer pattern
|
||||
COLOR_BayerBG2RGB_VNG = COLOR_BayerRG2BGR_VNG, //!< [8U] equivalent to RGGB Bayer pattern
|
||||
COLOR_BayerGB2RGB_VNG = COLOR_BayerGR2BGR_VNG, //!< [8U] equivalent to GRBG Bayer pattern
|
||||
COLOR_BayerRG2RGB_VNG = COLOR_BayerBG2BGR_VNG, //!< [8U] equivalent to BGGR Bayer pattern
|
||||
COLOR_BayerGR2RGB_VNG = COLOR_BayerGB2BGR_VNG, //!< [8U] equivalent to GBRG Bayer pattern
|
||||
|
||||
//! Edge-Aware Demosaicing
|
||||
COLOR_BayerBG2BGR_EA = 135, //!< equivalent to RGGB Bayer pattern
|
||||
COLOR_BayerGB2BGR_EA = 136, //!< equivalent to GRBG Bayer pattern
|
||||
COLOR_BayerRG2BGR_EA = 137, //!< equivalent to BGGR Bayer pattern
|
||||
COLOR_BayerGR2BGR_EA = 138, //!< equivalent to GBRG Bayer pattern
|
||||
COLOR_BayerBG2BGR_EA = 135, //!< [8U/16U] equivalent to RGGB Bayer pattern
|
||||
COLOR_BayerGB2BGR_EA = 136, //!< [8U/16U] equivalent to GRBG Bayer pattern
|
||||
COLOR_BayerRG2BGR_EA = 137, //!< [8U/16U] equivalent to BGGR Bayer pattern
|
||||
COLOR_BayerGR2BGR_EA = 138, //!< [8U/16U] equivalent to GBRG Bayer pattern
|
||||
|
||||
COLOR_BayerRGGB2BGR_EA = COLOR_BayerBG2BGR_EA,
|
||||
COLOR_BayerGRBG2BGR_EA = COLOR_BayerGB2BGR_EA,
|
||||
COLOR_BayerBGGR2BGR_EA = COLOR_BayerRG2BGR_EA,
|
||||
COLOR_BayerGBRG2BGR_EA = COLOR_BayerGR2BGR_EA,
|
||||
COLOR_BayerRGGB2BGR_EA = COLOR_BayerBG2BGR_EA, //!< [8U/16U]
|
||||
COLOR_BayerGRBG2BGR_EA = COLOR_BayerGB2BGR_EA, //!< [8U/16U]
|
||||
COLOR_BayerBGGR2BGR_EA = COLOR_BayerRG2BGR_EA, //!< [8U/16U]
|
||||
COLOR_BayerGBRG2BGR_EA = COLOR_BayerGR2BGR_EA, //!< [8U/16U]
|
||||
|
||||
COLOR_BayerRGGB2RGB_EA = COLOR_BayerBGGR2BGR_EA,
|
||||
COLOR_BayerGRBG2RGB_EA = COLOR_BayerGBRG2BGR_EA,
|
||||
COLOR_BayerBGGR2RGB_EA = COLOR_BayerRGGB2BGR_EA,
|
||||
COLOR_BayerGBRG2RGB_EA = COLOR_BayerGRBG2BGR_EA,
|
||||
COLOR_BayerRGGB2RGB_EA = COLOR_BayerBGGR2BGR_EA, //!< [8U/16U]
|
||||
COLOR_BayerGRBG2RGB_EA = COLOR_BayerGBRG2BGR_EA, //!< [8U/16U]
|
||||
COLOR_BayerBGGR2RGB_EA = COLOR_BayerRGGB2BGR_EA, //!< [8U/16U]
|
||||
COLOR_BayerGBRG2RGB_EA = COLOR_BayerGRBG2BGR_EA, //!< [8U/16U]
|
||||
|
||||
COLOR_BayerBG2RGB_EA = COLOR_BayerRG2BGR_EA, //!< equivalent to RGGB Bayer pattern
|
||||
COLOR_BayerGB2RGB_EA = COLOR_BayerGR2BGR_EA, //!< equivalent to GRBG Bayer pattern
|
||||
COLOR_BayerRG2RGB_EA = COLOR_BayerBG2BGR_EA, //!< equivalent to BGGR Bayer pattern
|
||||
COLOR_BayerGR2RGB_EA = COLOR_BayerGB2BGR_EA, //!< equivalent to GBRG Bayer pattern
|
||||
COLOR_BayerBG2RGB_EA = COLOR_BayerRG2BGR_EA, //!< [8U/16U] equivalent to RGGB Bayer pattern
|
||||
COLOR_BayerGB2RGB_EA = COLOR_BayerGR2BGR_EA, //!< [8U/16U] equivalent to GRBG Bayer pattern
|
||||
COLOR_BayerRG2RGB_EA = COLOR_BayerBG2BGR_EA, //!< [8U/16U] equivalent to BGGR Bayer pattern
|
||||
COLOR_BayerGR2RGB_EA = COLOR_BayerGB2BGR_EA, //!< [8U/16U] equivalent to GBRG Bayer pattern
|
||||
|
||||
//! Demosaicing with alpha channel
|
||||
COLOR_BayerBG2BGRA = 139, //!< equivalent to RGGB Bayer pattern
|
||||
COLOR_BayerGB2BGRA = 140, //!< equivalent to GRBG Bayer pattern
|
||||
COLOR_BayerRG2BGRA = 141, //!< equivalent to BGGR Bayer pattern
|
||||
COLOR_BayerGR2BGRA = 142, //!< equivalent to GBRG Bayer pattern
|
||||
COLOR_BayerBG2BGRA = 139, //!< [8U/16U] equivalent to RGGB Bayer pattern
|
||||
COLOR_BayerGB2BGRA = 140, //!< [8U/16U] equivalent to GRBG Bayer pattern
|
||||
COLOR_BayerRG2BGRA = 141, //!< [8U/16U] equivalent to BGGR Bayer pattern
|
||||
COLOR_BayerGR2BGRA = 142, //!< [8U/16U] equivalent to GBRG Bayer pattern
|
||||
|
||||
COLOR_BayerRGGB2BGRA = COLOR_BayerBG2BGRA,
|
||||
COLOR_BayerGRBG2BGRA = COLOR_BayerGB2BGRA,
|
||||
COLOR_BayerBGGR2BGRA = COLOR_BayerRG2BGRA,
|
||||
COLOR_BayerGBRG2BGRA = COLOR_BayerGR2BGRA,
|
||||
COLOR_BayerRGGB2BGRA = COLOR_BayerBG2BGRA, //!< [8U/16U]
|
||||
COLOR_BayerGRBG2BGRA = COLOR_BayerGB2BGRA, //!< [8U/16U]
|
||||
COLOR_BayerBGGR2BGRA = COLOR_BayerRG2BGRA, //!< [8U/16U]
|
||||
COLOR_BayerGBRG2BGRA = COLOR_BayerGR2BGRA, //!< [8U/16U]
|
||||
|
||||
COLOR_BayerRGGB2RGBA = COLOR_BayerBGGR2BGRA,
|
||||
COLOR_BayerGRBG2RGBA = COLOR_BayerGBRG2BGRA,
|
||||
COLOR_BayerBGGR2RGBA = COLOR_BayerRGGB2BGRA,
|
||||
COLOR_BayerGBRG2RGBA = COLOR_BayerGRBG2BGRA,
|
||||
COLOR_BayerRGGB2RGBA = COLOR_BayerBGGR2BGRA, //!< [8U/16U]
|
||||
COLOR_BayerGRBG2RGBA = COLOR_BayerGBRG2BGRA, //!< [8U/16U]
|
||||
COLOR_BayerBGGR2RGBA = COLOR_BayerRGGB2BGRA, //!< [8U/16U]
|
||||
COLOR_BayerGBRG2RGBA = COLOR_BayerGRBG2BGRA, //!< [8U/16U]
|
||||
|
||||
COLOR_BayerBG2RGBA = COLOR_BayerRG2BGRA, //!< equivalent to RGGB Bayer pattern
|
||||
COLOR_BayerGB2RGBA = COLOR_BayerGR2BGRA, //!< equivalent to GRBG Bayer pattern
|
||||
COLOR_BayerRG2RGBA = COLOR_BayerBG2BGRA, //!< equivalent to BGGR Bayer pattern
|
||||
COLOR_BayerGR2RGBA = COLOR_BayerGB2BGRA, //!< equivalent to GBRG Bayer pattern
|
||||
COLOR_BayerBG2RGBA = COLOR_BayerRG2BGRA, //!< [8U/16U] equivalent to RGGB Bayer pattern
|
||||
COLOR_BayerGB2RGBA = COLOR_BayerGR2BGRA, //!< [8U/16U] equivalent to GRBG Bayer pattern
|
||||
COLOR_BayerRG2RGBA = COLOR_BayerBG2BGRA, //!< [8U/16U] equivalent to BGGR Bayer pattern
|
||||
COLOR_BayerGR2RGBA = COLOR_BayerGB2BGRA, //!< [8U/16U] equivalent to GBRG Bayer pattern
|
||||
|
||||
COLOR_RGB2YUV_UYVY = 143, //!< convert between RGB and YUV UYVU, YUV is 4:2:2 and interleaved as U/Y1/V/Y2, see @ref color_convert_rgb_yuv_42x
|
||||
COLOR_BGR2YUV_UYVY = 144, //!< convert between BGR and YUV UYVU, YUV is 4:2:2 and interleaved as U/Y1/V/Y2, see @ref color_convert_rgb_yuv_42x
|
||||
COLOR_RGB2YUV_UYVY = 143, //!< [8U] convert between RGB and YUV UYVU, YUV is 4:2:2 and interleaved as U/Y1/V/Y2, see @ref color_convert_rgb_yuv_42x
|
||||
COLOR_BGR2YUV_UYVY = 144, //!< [8U] convert between BGR and YUV UYVU, YUV is 4:2:2 and interleaved as U/Y1/V/Y2, see @ref color_convert_rgb_yuv_42x
|
||||
COLOR_RGB2YUV_Y422 = COLOR_RGB2YUV_UYVY, //!< synonym to UYVY
|
||||
COLOR_BGR2YUV_Y422 = COLOR_BGR2YUV_UYVY, //!< synonym to UYVY
|
||||
COLOR_RGB2YUV_UYNV = COLOR_RGB2YUV_UYVY, //!< synonym to UYVY
|
||||
COLOR_BGR2YUV_UYNV = COLOR_BGR2YUV_UYVY, //!< synonym to UYVY
|
||||
|
||||
COLOR_RGBA2YUV_UYVY = 145, //!< convert between RGBA and YUV UYVU, YUV is 4:2:2 and interleaved as U/Y1/V/Y2, see @ref color_convert_rgb_yuv_42x
|
||||
COLOR_BGRA2YUV_UYVY = 146, //!< convert between BGRA and YUV UYVU, YUV is 4:2:2 and interleaved as U/Y1/V/Y2, see @ref color_convert_rgb_yuv_42x
|
||||
COLOR_RGBA2YUV_UYVY = 145, //!< [8U] convert between RGBA and YUV UYVU, YUV is 4:2:2 and interleaved as U/Y1/V/Y2, see @ref color_convert_rgb_yuv_42x
|
||||
COLOR_BGRA2YUV_UYVY = 146, //!< [8U] convert between BGRA and YUV UYVU, YUV is 4:2:2 and interleaved as U/Y1/V/Y2, see @ref color_convert_rgb_yuv_42x
|
||||
COLOR_RGBA2YUV_Y422 = COLOR_RGBA2YUV_UYVY, //!< synonym to UYVY
|
||||
COLOR_BGRA2YUV_Y422 = COLOR_BGRA2YUV_UYVY, //!< synonym to UYVY
|
||||
COLOR_RGBA2YUV_UYNV = COLOR_RGBA2YUV_UYVY, //!< synonym to UYVY
|
||||
COLOR_BGRA2YUV_UYNV = COLOR_BGRA2YUV_UYVY, //!< synonym to UYVY
|
||||
|
||||
COLOR_RGB2YUV_YUY2 = 147, //!< convert between RGB and YUV YUY2, YUV is 4:2:2 and interleaved as Y1/U/Y2/V, see @ref color_convert_rgb_yuv_42x
|
||||
COLOR_BGR2YUV_YUY2 = 148, //!< convert between BGR and YUV YUY2, YUV is 4:2:2 and interleaved as Y1/U/Y2/V, see @ref color_convert_rgb_yuv_42x
|
||||
COLOR_RGB2YUV_YVYU = 149, //!< convert between RGB and YUV YVYU, YUV is 4:2:2 and interleaved as Y1/V/Y2/U, see @ref color_convert_rgb_yuv_42x
|
||||
COLOR_BGR2YUV_YVYU = 150, //!< convert between BGR and YUV YVYU, YUV is 4:2:2 and interleaved as Y1/V/Y2/U, see @ref color_convert_rgb_yuv_42x
|
||||
COLOR_RGB2YUV_YUY2 = 147, //!< [8U] convert between RGB and YUV YUY2, YUV is 4:2:2 and interleaved as Y1/U/Y2/V, see @ref color_convert_rgb_yuv_42x
|
||||
COLOR_BGR2YUV_YUY2 = 148, //!< [8U] convert between BGR and YUV YUY2, YUV is 4:2:2 and interleaved as Y1/U/Y2/V, see @ref color_convert_rgb_yuv_42x
|
||||
COLOR_RGB2YUV_YVYU = 149, //!< [8U] convert between RGB and YUV YVYU, YUV is 4:2:2 and interleaved as Y1/V/Y2/U, see @ref color_convert_rgb_yuv_42x
|
||||
COLOR_BGR2YUV_YVYU = 150, //!< [8U] convert between BGR and YUV YVYU, YUV is 4:2:2 and interleaved as Y1/V/Y2/U, see @ref color_convert_rgb_yuv_42x
|
||||
COLOR_RGB2YUV_YUYV = COLOR_RGB2YUV_YUY2, //!< synonym to YUY2
|
||||
COLOR_BGR2YUV_YUYV = COLOR_BGR2YUV_YUY2, //!< synonym to YUY2
|
||||
COLOR_RGB2YUV_YUNV = COLOR_RGB2YUV_YUY2, //!< synonym to YUY2
|
||||
COLOR_BGR2YUV_YUNV = COLOR_BGR2YUV_YUY2, //!< synonym to YUY2
|
||||
|
||||
COLOR_RGBA2YUV_YUY2 = 151, //!< convert between RGBA and YUV YUY2, YUV is 4:2:2 and interleaved as Y1/U/Y2/V, see @ref color_convert_rgb_yuv_42x
|
||||
COLOR_BGRA2YUV_YUY2 = 152, //!< convert between BGRA and YUV YUY2, YUV is 4:2:2 and interleaved as Y1/U/Y2/V, see @ref color_convert_rgb_yuv_42x
|
||||
COLOR_RGBA2YUV_YVYU = 153, //!< convert between RGBA and YUV YVYU, YUV is 4:2:2 and interleaved as Y1/V/Y2/U, see @ref color_convert_rgb_yuv_42x
|
||||
COLOR_BGRA2YUV_YVYU = 154, //!< convert between BGRA and YUV YVYU, YUV is 4:2:2 and interleaved as Y1/V/Y2/U, see @ref color_convert_rgb_yuv_42x
|
||||
COLOR_RGBA2YUV_YUY2 = 151, //!< [8U] convert between RGBA and YUV YUY2, YUV is 4:2:2 and interleaved as Y1/U/Y2/V, see @ref color_convert_rgb_yuv_42x
|
||||
COLOR_BGRA2YUV_YUY2 = 152, //!< [8U] convert between BGRA and YUV YUY2, YUV is 4:2:2 and interleaved as Y1/U/Y2/V, see @ref color_convert_rgb_yuv_42x
|
||||
COLOR_RGBA2YUV_YVYU = 153, //!< [8U] convert between RGBA and YUV YVYU, YUV is 4:2:2 and interleaved as Y1/V/Y2/U, see @ref color_convert_rgb_yuv_42x
|
||||
COLOR_BGRA2YUV_YVYU = 154, //!< [8U] convert between BGRA and YUV YVYU, YUV is 4:2:2 and interleaved as Y1/V/Y2/U, see @ref color_convert_rgb_yuv_42x
|
||||
COLOR_RGBA2YUV_YUYV = COLOR_RGBA2YUV_YUY2, //!< synonym to YUY2
|
||||
COLOR_BGRA2YUV_YUYV = COLOR_BGRA2YUV_YUY2, //!< synonym to YUY2
|
||||
COLOR_RGBA2YUV_YUNV = COLOR_RGBA2YUV_YUY2, //!< synonym to YUY2
|
||||
@@ -2999,6 +3004,22 @@ peak) and will be smaller when there are multiple peaks.
|
||||
CV_EXPORTS_W Point2d phaseCorrelate(InputArray src1, InputArray src2,
|
||||
InputArray window = noArray(), CV_OUT double* response = 0);
|
||||
|
||||
/** @brief Detects translational shifts between two images.
|
||||
|
||||
This function extends the standard @ref phaseCorrelate method by improving sub-pixel accuracy
|
||||
through iterative shift refinement in the phase-correlation space, as described in
|
||||
@cite hrazdira2020iterative.
|
||||
|
||||
@param src1 Source floating point array (CV_32FC1 or CV_64FC1)
|
||||
@param src2 Source floating point array (CV_32FC1 or CV_64FC1)
|
||||
@param L2size The size of the correlation neighborhood used by the iterative shift refinement algorithm.
|
||||
@param maxIters The maximum number of iterations the iterative refinement algorithm will run.
|
||||
@returns detected sub-pixel shift between the two arrays.
|
||||
|
||||
@sa phaseCorrelate, dft, idft, createHanningWindow
|
||||
*/
|
||||
CV_EXPORTS_W Point2d phaseCorrelateIterative(InputArray src1, InputArray src2, int L2size = 7, int maxIters = 10);
|
||||
|
||||
/** @brief This function computes a Hanning window coefficients in two dimensions.
|
||||
|
||||
See (https://en.wikipedia.org/wiki/Hann_function) and (https://en.wikipedia.org/wiki/Window_function)
|
||||
@@ -3736,6 +3757,7 @@ floating-point.
|
||||
channels is derived automatically from src and code.
|
||||
@param hint Implementation modification flags. See #AlgorithmHint
|
||||
|
||||
@note The source image (src) must be of an appropriate type for the desired color conversion. see ColorConversionCodes
|
||||
@see @ref imgproc_color_conversions
|
||||
*/
|
||||
CV_EXPORTS_W void cvtColor( InputArray src, OutputArray dst, int code, int dstCn = 0, AlgorithmHint hint = cv::ALGO_HINT_DEFAULT );
|
||||
@@ -3789,6 +3811,7 @@ The function can do the following transformations:
|
||||
|
||||
#COLOR_BayerBG2BGRA , #COLOR_BayerGB2BGRA , #COLOR_BayerRG2BGRA , #COLOR_BayerGR2BGRA
|
||||
|
||||
@note The source image (src) must be of an appropriate type for the desired color conversion. see ColorConversionCodes
|
||||
@sa cvtColor
|
||||
*/
|
||||
CV_EXPORTS_W void demosaicing(InputArray src, OutputArray dst, int code, int dstCn = 0);
|
||||
@@ -3812,6 +3835,18 @@ used for images only.
|
||||
@note Only applicable to contour moments calculations from Python bindings: Note that the numpy
|
||||
type for the input array should be either np.int32 or np.float32.
|
||||
|
||||
@note For contour-based moments, the zeroth-order moment \c m00 represents
|
||||
the contour area.
|
||||
|
||||
If the input contour is degenerate (for example, a single point or all points
|
||||
are collinear), the area is zero and therefore \c m00 == 0.
|
||||
|
||||
In this case, the centroid coordinates (\c m10/m00, \c m01/m00) are undefined
|
||||
and must be handled explicitly by the caller.
|
||||
|
||||
A common workaround is to compute the center using cv::boundingRect() or by
|
||||
averaging the input points.
|
||||
|
||||
@sa contourArea, arcLength
|
||||
*/
|
||||
CV_EXPORTS_W Moments moments( InputArray array, bool binaryImage = false );
|
||||
@@ -4219,7 +4254,7 @@ area. It takes the set of points and the parameter k as input and returns the ar
|
||||
enclosing polygon.
|
||||
|
||||
The Implementation is based on a paper by Aggarwal, Chang and Yap @cite Aggarwal1985. They
|
||||
provide a \f$\theta(n²log(n)log(k))\f$ algorighm for finding the minimal convex polygon with k
|
||||
provide a \f$\theta(n²log(n)log(k))\f$ algorithm for finding the minimal convex polygon with k
|
||||
vertices enclosing a 2D convex polygon with n vertices (k < n). Since the #minEnclosingConvexPolygon
|
||||
function takes a 2D point set as input, an additional preprocessing step of computing the convex hull
|
||||
of the 2D point set is required. The complexity of the #convexHull function is \f$O(n log(n))\f$ which
|
||||
|
||||
@@ -162,26 +162,40 @@ approxPolyDP_( const Point_<T>* src_contour, int count0, Point_<T>* dst_contour,
|
||||
|
||||
if( pos != slice.end )
|
||||
{
|
||||
double dx, dy, dist, max_dist = 0;
|
||||
double dx, dy, max_dist_2_mul_segment_len_2 = 0;
|
||||
|
||||
dx = end_pt.x - start_pt.x;
|
||||
dy = end_pt.y - start_pt.y;
|
||||
double segment_len_2 = dx * dx + dy * dy;
|
||||
|
||||
CV_Assert( dx != 0 || dy != 0 );
|
||||
|
||||
while( pos != slice.end )
|
||||
{
|
||||
READ_PT(pt, pos);
|
||||
dist = fabs((pt.y - start_pt.y) * dx - (pt.x - start_pt.x) * dy);
|
||||
double projection = ((pt.x - start_pt.x) * dx + (pt.y - start_pt.y) * dy);
|
||||
|
||||
if( dist > max_dist )
|
||||
double dist_2_mul_segment_len_2;
|
||||
if ( projection < 0 )
|
||||
{
|
||||
max_dist = dist;
|
||||
dist_2_mul_segment_len_2 = ((pt.x - start_pt.x) * (pt.x - start_pt.x) + (pt.y - start_pt.y) * (pt.y - start_pt.y)) * segment_len_2;
|
||||
} else if ( projection > segment_len_2 )
|
||||
{
|
||||
dist_2_mul_segment_len_2 = ((pt.x - end_pt.x) * (pt.x - end_pt.x) + (pt.y - end_pt.y) * (pt.y - end_pt.y)) * segment_len_2;
|
||||
} else
|
||||
{
|
||||
double dist = ((pt.y - start_pt.y) * dx - (pt.x - start_pt.x) * dy);
|
||||
dist_2_mul_segment_len_2 = dist * dist;
|
||||
}
|
||||
|
||||
if( dist_2_mul_segment_len_2 > max_dist_2_mul_segment_len_2 )
|
||||
{
|
||||
max_dist_2_mul_segment_len_2 = dist_2_mul_segment_len_2;
|
||||
right_slice.start = (pos+count-1)%count;
|
||||
}
|
||||
}
|
||||
|
||||
le_eps = max_dist * max_dist <= eps * (dx * dx + dy * dy);
|
||||
le_eps = max_dist_2_mul_segment_len_2 <= eps * segment_len_2;
|
||||
}
|
||||
else
|
||||
{
|
||||
|
||||
@@ -321,7 +321,7 @@ bilateralFilter_32f( const Mat& src, Mat& dst, int d,
|
||||
}
|
||||
|
||||
// parallel_for usage
|
||||
CV_CPU_DISPATCH(bilateralFilterInvoker_32f, (cn, radius, maxk, space_ofs, temp, dst, scale_index, space_weight, expLUT),
|
||||
CV_CPU_DISPATCH(bilateralFilterInvoker_32f, (cn, radius, maxk, space_ofs, temp, dst, scale_index, space_weight, expLUT, kExpNumBins),
|
||||
CV_CPU_DISPATCH_MODES_ALL);
|
||||
}
|
||||
|
||||
|
||||
@@ -58,7 +58,7 @@ void bilateralFilterInvoker_8u(
|
||||
int* space_ofs, float *space_weight, float *color_weight);
|
||||
void bilateralFilterInvoker_32f(
|
||||
int cn, int radius, int maxk, int *space_ofs,
|
||||
const Mat& temp, Mat& dst, float scale_index, float *space_weight, float *expLUT);
|
||||
const Mat& temp, Mat& dst, float scale_index, float *space_weight, float *expLUT, int kExpNumBins);
|
||||
|
||||
#ifndef CV_CPU_OPTIMIZATION_DECLARATIONS_ONLY
|
||||
|
||||
@@ -495,9 +495,9 @@ class BilateralFilter_32f_Invoker :
|
||||
public:
|
||||
|
||||
BilateralFilter_32f_Invoker(int _cn, int _radius, int _maxk, int *_space_ofs,
|
||||
const Mat& _temp, Mat& _dest, float _scale_index, float *_space_weight, float *_expLUT) :
|
||||
const Mat& _temp, Mat& _dest, float _scale_index, float *_space_weight, float *_expLUT, int _kExpNumBins) :
|
||||
cn(_cn), radius(_radius), maxk(_maxk), space_ofs(_space_ofs),
|
||||
temp(&_temp), dest(&_dest), scale_index(_scale_index), space_weight(_space_weight), expLUT(_expLUT)
|
||||
temp(&_temp), dest(&_dest), scale_index(_scale_index), space_weight(_space_weight), expLUT(_expLUT), kExpNumBins(_kExpNumBins)
|
||||
{
|
||||
}
|
||||
|
||||
@@ -550,7 +550,7 @@ public:
|
||||
v_float32 val0 = vx_load(ksptr);
|
||||
v_float32 knan0 = v_not_nan(val0);
|
||||
v_float32 alpha0 = v_and(v_and(v_mul(v_absdiff(val0, rval0), sindex), v_not_nan(rval0)), knan0);
|
||||
v_int32 idx0 = v_trunc(alpha0);
|
||||
v_int32 idx0 = v_min(v_trunc(alpha0), vx_setall_s32(kExpNumBins));
|
||||
alpha0 = v_sub(alpha0, v_cvt_f32(idx0));
|
||||
v_float32 w0 = v_and(v_mul(kweight, v_muladd(v_lut(this->expLUT + 1, idx0), alpha0, v_mul(v_lut(this->expLUT, idx0), v_sub(v_one, alpha0)))), knan0);
|
||||
v_wsum0 = v_add(v_wsum0, w0);
|
||||
@@ -560,7 +560,7 @@ public:
|
||||
v_float32 val1 = vx_load(ksptr + nlanes);
|
||||
v_float32 knan1 = v_not_nan(val1);
|
||||
v_float32 alpha1 = v_and(v_and(v_mul(v_absdiff(val1, rval1), sindex), v_not_nan(rval1)), knan1);
|
||||
v_int32 idx1 = v_trunc(alpha1);
|
||||
v_int32 idx1 = v_min(v_trunc(alpha1), vx_setall_s32(kExpNumBins));
|
||||
alpha1 = v_sub(alpha1, v_cvt_f32(idx1));
|
||||
v_float32 w1 = v_and(v_mul(kweight, v_muladd(v_lut(this->expLUT + 1, idx1), alpha1, v_mul(v_lut(this->expLUT, idx1), v_sub(v_one, alpha1)))), knan1);
|
||||
v_wsum1 = v_add(v_wsum1, w1);
|
||||
@@ -570,7 +570,7 @@ public:
|
||||
v_float32 val2 = vx_load(ksptr + nlanes_2);
|
||||
v_float32 knan2 = v_not_nan(val2);
|
||||
v_float32 alpha2 = v_and(v_and(v_mul(v_absdiff(val2, rval2), sindex), v_not_nan(rval2)), knan2);
|
||||
v_int32 idx2 = v_trunc(alpha2);
|
||||
v_int32 idx2 = v_min(v_trunc(alpha2), vx_setall_s32(kExpNumBins));
|
||||
alpha2 = v_sub(alpha2, v_cvt_f32(idx2));
|
||||
v_float32 w2 = v_and(v_mul(kweight, v_muladd(v_lut(this->expLUT + 1, idx2), alpha2, v_mul(v_lut(this->expLUT, idx2), v_sub(v_one, alpha2)))), knan2);
|
||||
v_wsum2 = v_add(v_wsum2, w2);
|
||||
@@ -580,7 +580,7 @@ public:
|
||||
v_float32 val3 = vx_load(ksptr + nlanes_3);
|
||||
v_float32 knan3 = v_not_nan(val3);
|
||||
v_float32 alpha3 = v_and(v_and(v_mul(v_absdiff(val3, rval3), sindex), v_not_nan(rval3)), knan3);
|
||||
v_int32 idx3 = v_trunc(alpha3);
|
||||
v_int32 idx3 = v_min(v_trunc(alpha3), vx_setall_s32(kExpNumBins));
|
||||
alpha3 = v_sub(alpha3, v_cvt_f32(idx3));
|
||||
v_float32 w3 = v_and(v_mul(kweight, v_muladd(v_lut(this->expLUT + 1, idx3), alpha3, v_mul(v_lut(this->expLUT, idx3), v_sub(v_one, alpha3)))), knan3);
|
||||
v_wsum3 = v_add(v_wsum3, w3);
|
||||
@@ -611,7 +611,7 @@ public:
|
||||
v_float32 val0 = vx_load(ksptr);
|
||||
v_float32 knan0 = v_not_nan(val0);
|
||||
v_float32 alpha0 = v_and(v_and(v_mul(v_absdiff(val0, rval0), sindex), rval0_not_nan), knan0);
|
||||
v_int32 idx0 = v_trunc(alpha0);
|
||||
v_int32 idx0 = v_min(v_trunc(alpha0), vx_setall_s32(kExpNumBins));
|
||||
alpha0 = v_sub(alpha0, v_cvt_f32(idx0));
|
||||
v_float32 w0 = v_and(v_mul(kweight, v_muladd(v_lut(this->expLUT + 1, idx0), alpha0, v_mul(v_lut(this->expLUT, idx0), v_sub(v_one, alpha0)))), knan0);
|
||||
v_wsum0 = v_add(v_wsum0, w0);
|
||||
@@ -621,7 +621,7 @@ public:
|
||||
v_float32 val1 = vx_load(ksptr + nlanes);
|
||||
v_float32 knan1 = v_not_nan(val1);
|
||||
v_float32 alpha1 = v_and(v_and(v_mul(v_absdiff(val1, rval1), sindex), rval1_not_nan), knan1);
|
||||
v_int32 idx1 = v_trunc(alpha1);
|
||||
v_int32 idx1 = v_min(v_trunc(alpha1), vx_setall_s32(kExpNumBins));
|
||||
alpha1 = v_sub(alpha1, v_cvt_f32(idx1));
|
||||
v_float32 w1 = v_and(v_mul(kweight, v_muladd(v_lut(this->expLUT + 1, idx1), alpha1, v_mul(v_lut(this->expLUT, idx1), v_sub(v_one, alpha1)))), knan1);
|
||||
v_wsum1 = v_add(v_wsum1, w1);
|
||||
@@ -640,7 +640,7 @@ public:
|
||||
{
|
||||
const float* ksptr = sptr_j + space_ofs[k];
|
||||
float val = *ksptr;
|
||||
float alpha = std::abs(val - rval) * scale_index;
|
||||
float alpha = std::min(std::abs(val - rval) * scale_index, (float)kExpNumBins);
|
||||
int idx = cvFloor(alpha);
|
||||
alpha -= idx;
|
||||
if (!cvIsNaN(val))
|
||||
@@ -681,7 +681,7 @@ public:
|
||||
|
||||
v_float32 knan = v_and(v_and(v_not_nan(kb), v_not_nan(kg)), v_not_nan(kr));
|
||||
v_float32 alpha = v_and(v_and(v_and(v_and(v_mul(v_add(v_add(v_absdiff(kb, rb), v_absdiff(kg, rg)), v_absdiff(kr, rr)), sindex), v_not_nan(rb)), v_not_nan(rg)), v_not_nan(rr)), knan);
|
||||
v_int32 idx = v_trunc(alpha);
|
||||
v_int32 idx = v_min(v_trunc(alpha), vx_setall_s32(kExpNumBins));
|
||||
alpha = v_sub(alpha, v_cvt_f32(idx));
|
||||
|
||||
v_float32 w = v_and(v_mul(kweight, v_muladd(v_lut(this->expLUT + 1, idx), alpha, v_mul(v_lut(this->expLUT, idx), v_sub(v_one, alpha)))), knan);
|
||||
@@ -709,7 +709,7 @@ public:
|
||||
bool v_NAN = cvIsNaN(b) || cvIsNaN(g) || cvIsNaN(r);
|
||||
float rb = rsptr[0], rg = rsptr[1], rr = rsptr[2];
|
||||
bool r_NAN = cvIsNaN(rb) || cvIsNaN(rg) || cvIsNaN(rr);
|
||||
float alpha = (std::abs(b - rb) + std::abs(g - rg) + std::abs(r - rr)) * scale_index;
|
||||
float alpha = std::min((std::abs(b - rb) + std::abs(g - rg) + std::abs(r - rr)) * scale_index, (float)kExpNumBins);
|
||||
int idx = cvFloor(alpha);
|
||||
alpha -= idx;
|
||||
if (!v_NAN)
|
||||
@@ -753,17 +753,18 @@ private:
|
||||
const Mat* temp;
|
||||
Mat *dest;
|
||||
float scale_index, *space_weight, *expLUT;
|
||||
int kExpNumBins;
|
||||
};
|
||||
|
||||
} // namespace anon
|
||||
|
||||
void bilateralFilterInvoker_32f(
|
||||
int cn, int radius, int maxk, int *space_ofs,
|
||||
const Mat& temp, Mat& dst, float scale_index, float *space_weight, float *expLUT)
|
||||
const Mat& temp, Mat& dst, float scale_index, float *space_weight, float *expLUT, int kExpNumBins)
|
||||
{
|
||||
CV_INSTRUMENT_REGION();
|
||||
|
||||
BilateralFilter_32f_Invoker body(cn, radius, maxk, space_ofs, temp, dst, scale_index, space_weight, expLUT);
|
||||
BilateralFilter_32f_Invoker body(cn, radius, maxk, space_ofs, temp, dst, scale_index, space_weight, expLUT, kExpNumBins);
|
||||
parallel_for_(Range(0, dst.rows), body, dst.total()/(double)(1<<16));
|
||||
}
|
||||
|
||||
|
||||
@@ -219,9 +219,9 @@ void convexHull( InputArray _points, OutputArray _hull, bool clockwise, bool ret
|
||||
}
|
||||
|
||||
for( i = 0; i < tl_count-1; i++ )
|
||||
hullbuf[nout++] = int(pointer[tl_stack[i]] - data0);
|
||||
hullbuf[nout++] = tl_stack[i];
|
||||
for( i = tr_count - 1; i > 0; i-- )
|
||||
hullbuf[nout++] = int(pointer[tr_stack[i]] - data0);
|
||||
hullbuf[nout++] = tr_stack[i];
|
||||
int stop_idx = tr_count > 2 ? tr_stack[1] : tl_count > 2 ? tl_stack[tl_count - 2] : -1;
|
||||
|
||||
// lower half
|
||||
@@ -257,9 +257,43 @@ void convexHull( InputArray _points, OutputArray _hull, bool clockwise, bool ret
|
||||
}
|
||||
|
||||
for( i = 0; i < bl_count-1; i++ )
|
||||
hullbuf[nout++] = int(pointer[bl_stack[i]] - data0);
|
||||
hullbuf[nout++] = bl_stack[i];
|
||||
for( i = br_count-1; i > 0; i-- )
|
||||
hullbuf[nout++] = int(pointer[br_stack[i]] - data0);
|
||||
hullbuf[nout++] = br_stack[i];
|
||||
|
||||
if (!returnPoints)
|
||||
{
|
||||
// Try keep monotonous indices in case of self-intersection.
|
||||
for (i = 0; i < nout; ++i)
|
||||
{
|
||||
auto prev = pointer[hullbuf[(i == 0 ? nout : i) - 1]];
|
||||
auto next = pointer[hullbuf[(i + 1) % nout]];
|
||||
auto cur = pointer[hullbuf[i]];
|
||||
if ((prev < cur && cur < next) || (prev > cur && cur > next))
|
||||
{
|
||||
continue;
|
||||
}
|
||||
for (int j = hullbuf[i] + 1; j < total; ++j)
|
||||
{
|
||||
cur = pointer[j];
|
||||
if (*pointer[hullbuf[i]] == *cur)
|
||||
{
|
||||
if ((prev < cur && cur < next) || (prev > cur && cur > next))
|
||||
{
|
||||
hullbuf[i] = j;
|
||||
break;
|
||||
}
|
||||
}
|
||||
else
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
for (i = 0; i < nout; ++i)
|
||||
{
|
||||
hullbuf[i] = int(pointer[hullbuf[i]] - data0);
|
||||
}
|
||||
|
||||
// try to make the convex hull indices form
|
||||
// an ascending or descending sequence by the cyclic
|
||||
|
||||
@@ -1668,7 +1668,7 @@ ThickLine( Mat& img, Point2l p0, Point2l p1, const void* color,
|
||||
{
|
||||
if( line_type < cv::LINE_AA )
|
||||
{
|
||||
if( line_type == 1 || line_type == 4 || shift == 0 )
|
||||
if( line_type == 1 || line_type == 8 || shift == 0 )
|
||||
{
|
||||
p0.x = (p0.x + (XY_ONE>>1)) >> XY_SHIFT;
|
||||
p0.y = (p0.y + (XY_ONE>>1)) >> XY_SHIFT;
|
||||
|
||||
@@ -1171,8 +1171,24 @@ static bool replacementFilter2D(int stype, int dtype, int kernel_type,
|
||||
int anchor_x, int anchor_y,
|
||||
double delta, int borderType, bool isSubmatrix)
|
||||
{
|
||||
// Prioritize stateless implementation
|
||||
int res = cv_hal_filter_stateless(src_data, src_step, stype,
|
||||
dst_data, dst_step, dtype, width, height,
|
||||
full_width, full_height, offset_x, offset_y,
|
||||
kernel_data, kernel_step, kernel_type,
|
||||
kernel_width, kernel_height, anchor_x, anchor_y,
|
||||
delta, borderType, isSubmatrix, src_data == dst_data);
|
||||
if (res == CV_HAL_ERROR_OK)
|
||||
{
|
||||
return true;
|
||||
} else if (res != CV_HAL_ERROR_NOT_IMPLEMENTED)
|
||||
{
|
||||
CV_Error_(cv::Error::StsInternal,
|
||||
("HAL implementation filter_stateless ==> " CVAUX_STR(cv_hal_filter_stateless) " returned %d (0x%08x)", res, res));
|
||||
}
|
||||
|
||||
cvhalFilter2D* ctx;
|
||||
int res = cv_hal_filterInit(&ctx, kernel_data, kernel_step, kernel_type, kernel_width, kernel_height, width, height,
|
||||
res = cv_hal_filterInit(&ctx, kernel_data, kernel_step, kernel_type, kernel_width, kernel_height, width, height,
|
||||
stype, dtype, borderType, delta, anchor_x, anchor_y, isSubmatrix, src_data == dst_data);
|
||||
if (res == CV_HAL_ERROR_NOT_IMPLEMENTED)
|
||||
{
|
||||
@@ -1385,8 +1401,23 @@ static bool replacementSepFilter(int stype, int dtype, int ktype,
|
||||
uchar * kernely_data, int kernely_len,
|
||||
int anchor_x, int anchor_y, double delta, int borderType)
|
||||
{
|
||||
// Prioritize stateless implementation
|
||||
int res = cv_hal_sepFilter_stateless(src_data, src_step, stype,
|
||||
dst_data, dst_step, dtype,
|
||||
width, height, full_width, full_height, offset_x, offset_y,
|
||||
kernelx_data, kernelx_len, kernely_data, kernely_len, ktype,
|
||||
anchor_x, anchor_y, delta, borderType);
|
||||
if (res == CV_HAL_ERROR_OK)
|
||||
{
|
||||
return true;
|
||||
} else if (res != CV_HAL_ERROR_NOT_IMPLEMENTED)
|
||||
{
|
||||
CV_Error_(cv::Error::StsInternal,
|
||||
("HAL implementation sepFilter_stateless ==> " CVAUX_STR(cv_hal_sepFilter_stateless) " returned %d (0x%08x)", res, res));
|
||||
}
|
||||
|
||||
cvhalFilter2D *ctx;
|
||||
int res = cv_hal_sepFilterInit(&ctx, stype, dtype, ktype,
|
||||
res = cv_hal_sepFilterInit(&ctx, stype, dtype, ktype,
|
||||
kernelx_data, kernelx_len,
|
||||
kernely_data, kernely_len,
|
||||
anchor_x, anchor_y, delta, borderType);
|
||||
|
||||
@@ -86,6 +86,40 @@ int my_hal_filterFree(cvhalFilter2D *context) {
|
||||
*/
|
||||
struct cvhalFilter2D {};
|
||||
|
||||
/**
|
||||
@brief 2D filtering in a stateless manner
|
||||
@param src_data source image data
|
||||
@param src_step source image step
|
||||
@param src_type source image type
|
||||
@param dst_data destination image data
|
||||
@param dst_step destination image step
|
||||
@param dst_type destination image type
|
||||
@param width images width
|
||||
@param height images height
|
||||
@param full_width full width of source image (outside the ROI)
|
||||
@param full_height full height of source image (outside the ROI)
|
||||
@param offset_x source image ROI offset X
|
||||
@param offset_y source image ROI offset Y
|
||||
@param kernel_data pointer to kernel data
|
||||
@param kernel_step kernel step
|
||||
@param kernel_type kernel type (CV_8U, ...)
|
||||
@param kernel_width kernel width
|
||||
@param kernel_height kernel height
|
||||
@param anchor_x relative X position of center point within the kernel
|
||||
@param anchor_y relative Y position of center point within the kernel
|
||||
@param delta added to pixel values
|
||||
@param borderType border processing mode (CV_HAL_BORDER_REFLECT, ...)
|
||||
@param isSubmatrix indicates whether the submatrices will be allowed as source image
|
||||
@param allowInplace indicates whether the inplace operation will be possible
|
||||
@sa cv::filter2D, cv::hal::Filter2D
|
||||
*/
|
||||
inline int hal_ni_filter_stateless(const uchar * src_data, size_t src_step, int src_type,
|
||||
uchar * dst_data, size_t dst_step, int dst_type,
|
||||
int width, int height, int full_width, int full_height, int offset_x, int offset_y,
|
||||
const uchar * kernel_data, size_t kernel_step, int kernel_type, int kernel_width, int kernel_height,
|
||||
int anchor_x, int anchor_y, double delta, int borderType, bool isSubmatrix, bool allowInplace)
|
||||
{ return CV_HAL_ERROR_NOT_IMPLEMENTED; }
|
||||
|
||||
/**
|
||||
@brief hal_filterInit
|
||||
@param context double pointer to user-defined context
|
||||
@@ -131,11 +165,45 @@ inline int hal_ni_filter(cvhalFilter2D *context, uchar *src_data, size_t src_ste
|
||||
inline int hal_ni_filterFree(cvhalFilter2D *context) { return CV_HAL_ERROR_NOT_IMPLEMENTED; }
|
||||
|
||||
//! @cond IGNORED
|
||||
#define cv_hal_filter_stateless hal_ni_filter_stateless
|
||||
#define cv_hal_filterInit hal_ni_filterInit
|
||||
#define cv_hal_filter hal_ni_filter
|
||||
#define cv_hal_filterFree hal_ni_filterFree
|
||||
//! @endcond
|
||||
|
||||
/**
|
||||
@brief separable filtering in a stateless manner
|
||||
@param src_data source image data
|
||||
@param src_step source image step
|
||||
@param src_type source image type
|
||||
@param dst_data destination image data
|
||||
@param dst_step destination image step
|
||||
@param dst_type destination image type
|
||||
@param width images width
|
||||
@param height images height
|
||||
@param full_width full width of source image (outside the ROI)
|
||||
@param full_height full height of source image (outside the ROI)
|
||||
@param offset_x source image ROI offset X
|
||||
@param offset_y source image ROI offset Y
|
||||
@param kernelx_data pointer to x-kernel data
|
||||
@param kernelx_len x-kernel vector length
|
||||
@param kernely_data pointer to y-kernel data
|
||||
@param kernely_len y-kernel vector length
|
||||
@param kernel_type kernel type (CV_8U, ...)
|
||||
@param anchor_x relative X position of center point within the kernel
|
||||
@param anchor_y relative Y position of center point within the kernel
|
||||
@param delta added to pixel values
|
||||
@param borderType border processing mode (CV_HAL_BORDER_REFLECT, ...)
|
||||
@sa cv::sepFilter2D, cv::hal::SepFilter2D
|
||||
*/
|
||||
inline int hal_ni_sepFilter_stateless(const uchar * src_data, size_t src_step, int src_type,
|
||||
uchar * dst_data, size_t dst_step, int dst_type,
|
||||
int width, int height, int full_width, int full_height, int offset_x, int offset_y,
|
||||
const uchar * kernelx_data, int kernelx_len,
|
||||
const uchar * kernely_data, int kernely_len,
|
||||
int kernel_type, int anchor_x, int anchor_y, double delta, int borderType)
|
||||
{ return CV_HAL_ERROR_NOT_IMPLEMENTED; }
|
||||
|
||||
/**
|
||||
@brief hal_sepFilterInit
|
||||
@param context double pointer to user-defined context
|
||||
@@ -177,11 +245,54 @@ inline int hal_ni_sepFilter(cvhalFilter2D *context, uchar *src_data, size_t src_
|
||||
inline int hal_ni_sepFilterFree(cvhalFilter2D *context) { return CV_HAL_ERROR_NOT_IMPLEMENTED; }
|
||||
|
||||
//! @cond IGNORED
|
||||
#define cv_hal_sepFilter_stateless hal_ni_sepFilter_stateless
|
||||
#define cv_hal_sepFilterInit hal_ni_sepFilterInit
|
||||
#define cv_hal_sepFilter hal_ni_sepFilter
|
||||
#define cv_hal_sepFilterFree hal_ni_sepFilterFree
|
||||
//! @endcond
|
||||
|
||||
/**
|
||||
@brief morphology in a stateless manner
|
||||
@param operation morphology operation CV_HAL_MORPH_ERODE or CV_HAL_MORPH_DILATE
|
||||
@param src_data source image data
|
||||
@param src_step source image step
|
||||
@param src_type source image type
|
||||
@param dst_data destination image data
|
||||
@param dst_step destination image step
|
||||
@param dst_type destination image type
|
||||
@param width images width
|
||||
@param height images height
|
||||
@param src_full_width full width of source image (outside the ROI)
|
||||
@param src_full_height full height of source image (outside the ROI)
|
||||
@param src_roi_x source image ROI X offset
|
||||
@param src_roi_y source image ROI Y offset
|
||||
@param dst_full_width full width of destination image
|
||||
@param dst_full_height full height of destination image
|
||||
@param dst_roi_x destination image ROI X offset
|
||||
@param dst_roi_y destination image ROI Y offset
|
||||
@param kernel_data pointer to kernel data
|
||||
@param kernel_step kernel step
|
||||
@param kernel_type kernel type (CV_8U, ...)
|
||||
@param kernel_width kernel width
|
||||
@param kernel_height kernel height
|
||||
@param anchor_x relative X position of center point within the kernel
|
||||
@param anchor_y relative Y position of center point within the kernel
|
||||
@param borderType border processing mode (CV_HAL_BORDER_REFLECT, ...)
|
||||
@param borderValue values to use for CV_HAL_BORDER_CONSTANT mode
|
||||
@param iterations number of iterations
|
||||
@param allowSubmatrix indicates whether the submatrices will be allowed as source image
|
||||
@param allowInplace indicates whether the inplace operation will be possible
|
||||
@sa cv::erode, cv::dilate, cv::morphologyEx, cv::hal::Morph
|
||||
*/
|
||||
inline int hal_ni_morph_stateless(int operation, const uchar * src_data, size_t src_step, int src_type,
|
||||
uchar * dst_data, size_t dst_step, int dst_type,
|
||||
int width, int height, int src_full_width, int src_full_height, int src_roi_x, int src_roi_y,
|
||||
int dst_full_width, int dst_full_height, int dst_roi_x, int dst_roi_y,
|
||||
const uchar * kernel_data, size_t kernel_step, int kernel_type, int kernel_width, int kernel_height,
|
||||
int anchor_x, int anchor_y, int borderType, const double borderValue[4],
|
||||
int iterations, bool allowSubmatrix, bool allowInplace)
|
||||
{ return CV_HAL_ERROR_NOT_IMPLEMENTED; }
|
||||
|
||||
/**
|
||||
@brief hal_morphInit
|
||||
@param context double pointer to user-defined context
|
||||
@@ -233,6 +344,7 @@ inline int hal_ni_morph(cvhalFilter2D *context, uchar *src_data, size_t src_step
|
||||
inline int hal_ni_morphFree(cvhalFilter2D *context) { return CV_HAL_ERROR_NOT_IMPLEMENTED; }
|
||||
|
||||
//! @cond IGNORED
|
||||
#define cv_hal_morph_stateless hal_ni_morph_stateless
|
||||
#define cv_hal_morphInit hal_ni_morphInit
|
||||
#define cv_hal_morph hal_ni_morph
|
||||
#define cv_hal_morphFree hal_ni_morphFree
|
||||
|
||||
@@ -1024,7 +1024,7 @@ void HoughLinesPointSet( InputArray _point, OutputArray _lines, int lines_max, i
|
||||
int r = idx - (n+1)*(numrho+2) - 1;
|
||||
line.rho = static_cast<float>(min_rho) + r * (float)rho_step;
|
||||
line.angle = static_cast<float>(min_theta) + n * (float)theta_step;
|
||||
lines.push_back(Vec3d((double)accum[idx], (double)line.rho, (double)line.angle));
|
||||
lines.emplace_back((double)accum[idx], (double)line.rho, (double)line.angle);
|
||||
}
|
||||
|
||||
Mat(lines).copyTo(_lines);
|
||||
@@ -1125,7 +1125,7 @@ public:
|
||||
{
|
||||
if (ptr[x])
|
||||
{
|
||||
list.push_back(Point(x, y));
|
||||
list.emplace_back(x, y);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1489,7 +1489,7 @@ protected:
|
||||
// Check if the circle has enough support
|
||||
if(maxCount > accThreshold)
|
||||
{
|
||||
circlesLocal.push_back(EstimatedCircle(Vec3f(curCenter.x, curCenter.y, rBest), maxCount));
|
||||
circlesLocal.emplace_back(Vec3f(curCenter.x, curCenter.y, rBest), maxCount);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1847,7 +1847,7 @@ static void HoughCirclesAlt( const Mat& img, std::vector<EstimatedCircle>& circl
|
||||
continue;
|
||||
|
||||
mdata[y*mstep + x] = (uchar)1;
|
||||
stack.push_back(Point(x, y));
|
||||
stack.emplace_back(x, y);
|
||||
bool backtrace_mode = false;
|
||||
|
||||
do
|
||||
@@ -1858,7 +1858,7 @@ static void HoughCirclesAlt( const Mat& img, std::vector<EstimatedCircle>& circl
|
||||
int vy = dyData[p.y*dxystep + p.x];
|
||||
|
||||
float mag = std::sqrt((float)vx*vx+(float)vy*vy);
|
||||
nz.push_back(Vec4f((float)p.x, (float)p.y, (float)vx, (float)vy));
|
||||
nz.emplace_back((float)p.x, (float)p.y, (float)vx, (float)vy);
|
||||
CV_Assert(mdata[p.y*mstep + p.x] == 1);
|
||||
|
||||
int sx = cvRound(vx * RAY_FP_SCALE / mag);
|
||||
@@ -1903,7 +1903,7 @@ static void HoughCirclesAlt( const Mat& img, std::vector<EstimatedCircle>& circl
|
||||
if( mdata[y_*mstep + x_] || !edgeData[y_*estep + x_])
|
||||
continue;
|
||||
mdata[y_*mstep + x_] = (uchar)1;
|
||||
stack.push_back(Point(x_, y_));
|
||||
stack.emplace_back(x_, y_);
|
||||
neighbors++;
|
||||
}
|
||||
|
||||
@@ -1919,7 +1919,7 @@ static void HoughCirclesAlt( const Mat& img, std::vector<EstimatedCircle>& circl
|
||||
// insert a special "stop marker" in the end of each
|
||||
// connected component to make sure we
|
||||
// finalize and analyze the arc segment
|
||||
nz.push_back(Vec4f(0.f, 0.f, 0.f, 0.f));
|
||||
nz.emplace_back(0.f, 0.f, 0.f, 0.f);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1951,7 +1951,7 @@ static void HoughCirclesAlt( const Mat& img, std::vector<EstimatedCircle>& circl
|
||||
{
|
||||
float cx = (float)((left + x - 1)*dp*0.5f);
|
||||
float cy = (float)(y*dp);
|
||||
centers.push_back(Point2f(cx, cy));
|
||||
centers.emplace_back(cx, cy);
|
||||
left = -1;
|
||||
}
|
||||
}
|
||||
@@ -2223,7 +2223,7 @@ static void HoughCirclesAlt( const Mat& img, std::vector<EstimatedCircle>& circl
|
||||
// (accepted ? '+' : '-'), cx, cy, rk, cjk.weight, count, max_runlen, cjk.mask);
|
||||
|
||||
if( accepted )
|
||||
local_circles.push_back(EstimatedCircle(Vec3f(cx, cy, (float)rk), cjk.weight));
|
||||
local_circles.emplace_back(Vec3f(cx, cy, (float)rk), cjk.weight);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -212,8 +212,22 @@ static bool halMorph(int op, int src_type, int dst_type,
|
||||
int kernel_width, int kernel_height, int anchor_x, int anchor_y,
|
||||
int borderType, const double borderValue[4], int iterations, bool isSubmatrix)
|
||||
{
|
||||
// Prioritize stateless implementation
|
||||
int res = cv_hal_morph_stateless(op, src_data, src_step, src_type, dst_data, dst_step, dst_type, width, height,
|
||||
roi_width, roi_height, roi_x, roi_y, roi_width2, roi_height2, roi_x2, roi_y2,
|
||||
kernel_data, kernel_step, kernel_type, kernel_width, kernel_height, anchor_x, anchor_y,
|
||||
borderType, borderValue, iterations, isSubmatrix, src_data == dst_data);
|
||||
if (res == CV_HAL_ERROR_OK)
|
||||
{
|
||||
return true;
|
||||
} else if (res != CV_HAL_ERROR_NOT_IMPLEMENTED)
|
||||
{
|
||||
CV_Error_(cv::Error::StsInternal,
|
||||
("HAL implementation morph_stateless ==> " CVAUX_STR(cv_hal_morph_stateless) " returned %d (0x%08x)", res, res));
|
||||
}
|
||||
|
||||
cvhalFilter2D * ctx;
|
||||
int res = cv_hal_morphInit(&ctx, op, src_type, dst_type, width, height,
|
||||
res = cv_hal_morphInit(&ctx, op, src_type, dst_type, width, height,
|
||||
kernel_type, kernel_data, kernel_step, kernel_width, kernel_height,
|
||||
anchor_x, anchor_y,
|
||||
borderType, borderValue,
|
||||
|
||||
@@ -0,0 +1,191 @@
|
||||
#include "precomp.hpp"
|
||||
#include <cmath>
|
||||
|
||||
namespace {
|
||||
|
||||
template <typename T>
|
||||
void calculateCrossPowerSpectrum(const cv::Mat& dft1, const cv::Mat& dft2, cv::Mat& cps)
|
||||
{
|
||||
for (int row = 0; row < dft1.rows; ++row)
|
||||
{
|
||||
auto* cpsp = cps.ptr<cv::Vec<T, 2>>(row);
|
||||
const auto* dft1p = dft1.ptr<cv::Vec<T, 2>>(row);
|
||||
const auto* dft2p = dft2.ptr<cv::Vec<T, 2>>(row);
|
||||
for (int col = 0; col < dft1.cols; ++col)
|
||||
{
|
||||
const T re = dft1p[col][0] * dft2p[col][0] + dft1p[col][1] * dft2p[col][1];
|
||||
const T im = dft1p[col][0] * dft2p[col][1] - dft1p[col][1] * dft2p[col][0];
|
||||
const T mag = std::sqrt(re * re + im * im);
|
||||
cpsp[col][0] = re / mag;
|
||||
cpsp[col][1] = im / mag;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
cv::Mat calculateCrossPowerSpectrum(const cv::Mat& dft1, const cv::Mat& dft2)
|
||||
{
|
||||
cv::Mat cps(dft1.rows, dft1.cols, dft1.type());
|
||||
if (dft1.type() == CV_32FC2)
|
||||
calculateCrossPowerSpectrum<float>(dft1, dft2, cps);
|
||||
else if (dft1.type() == CV_64FC2)
|
||||
calculateCrossPowerSpectrum<double>(dft1, dft2, cps);
|
||||
else
|
||||
CV_Error(cv::Error::StsNotImplemented, "Only CV_32FC2 and CV_64FC2 types are supported");
|
||||
return cps;
|
||||
}
|
||||
|
||||
void fftshift(cv::Mat& out)
|
||||
{
|
||||
int cx = out.cols / 2;
|
||||
int cy = out.rows / 2;
|
||||
cv::Mat q0(out, cv::Rect(0, 0, cx, cy));
|
||||
cv::Mat q1(out, cv::Rect(cx, 0, cx, cy));
|
||||
cv::Mat q2(out, cv::Rect(0, cy, cx, cy));
|
||||
cv::Mat q3(out, cv::Rect(cx, cy, cx, cy));
|
||||
|
||||
cv::Mat tmp;
|
||||
q0.copyTo(tmp);
|
||||
q3.copyTo(q0);
|
||||
tmp.copyTo(q3);
|
||||
q1.copyTo(tmp);
|
||||
q2.copyTo(q1);
|
||||
tmp.copyTo(q2);
|
||||
}
|
||||
|
||||
bool isOutOfBounds(const cv::Point2i& peak, const cv::Mat& mat, int size)
|
||||
{
|
||||
return peak.x - size / 2 < 0 || peak.y - size / 2 < 0 || peak.x + size / 2 >= mat.cols ||
|
||||
peak.y + size / 2 >= mat.rows;
|
||||
}
|
||||
|
||||
bool reduceL2size(int& L2size)
|
||||
{
|
||||
L2size -= 2;
|
||||
return L2size >= 3;
|
||||
}
|
||||
|
||||
int getL1size(int L2Usize, double L1ratio)
|
||||
{
|
||||
int L1size = static_cast<int>(std::floor(L1ratio * L2Usize));
|
||||
return (L1size % 2) ? L1size : L1size + 1;
|
||||
}
|
||||
|
||||
cv::Point2d getPeakSubpixel(const cv::Mat& mat)
|
||||
{
|
||||
const auto m = moments(mat);
|
||||
return cv::Point2d(m.m10 / m.m00, m.m01 / m.m00);
|
||||
}
|
||||
|
||||
bool accuracyReached(const cv::Point2d& L1peak, const cv::Point2d& L1mid)
|
||||
{
|
||||
return std::abs(L1peak.x - L1mid.x) < 0.5 && std::abs(L1peak.y - L1mid.y) < 0.5;
|
||||
}
|
||||
|
||||
cv::Point2d getSubpixelShift(const cv::Mat& L3,
|
||||
const cv::Point2d& L3peak,
|
||||
const cv::Point2d& L3mid,
|
||||
int L2size)
|
||||
{
|
||||
while (isOutOfBounds(L3peak, L3, L2size))
|
||||
if (!reduceL2size(L2size))
|
||||
return L3peak - L3mid;
|
||||
|
||||
cv::Mat L2 = L3(cv::Rect(static_cast<int>(L3peak.x - L2size / 2),
|
||||
static_cast<int>(L3peak.y - L2size / 2),
|
||||
L2size,
|
||||
L2size));
|
||||
cv::Point2d L2peak = getPeakSubpixel(L2);
|
||||
cv::Point2d L2mid(L2.cols / 2, L2.rows / 2);
|
||||
return L3peak - L3mid + L2peak - L2mid;
|
||||
}
|
||||
|
||||
} // namespace
|
||||
|
||||
cv::Point2d
|
||||
cv::phaseCorrelateIterative(InputArray _src1, InputArray _src2, int L2size, int maxIters)
|
||||
{
|
||||
CV_INSTRUMENT_REGION();
|
||||
|
||||
Mat src1 = _src1.getMat();
|
||||
Mat src2 = _src2.getMat();
|
||||
|
||||
CV_Assert(src1.type() == src2.type());
|
||||
CV_Assert(src1.size() == src2.size());
|
||||
CV_Assert(src1.type() == CV_32FC1 || src1.type() == CV_64FC1);
|
||||
|
||||
// apply DFT window to input images
|
||||
Mat window;
|
||||
createHanningWindow(window, src1.size(), _src1.type());
|
||||
Mat image1, image2;
|
||||
multiply(_src1, window, image1);
|
||||
multiply(_src2, window, image2);
|
||||
|
||||
// compute the DFTs of input images
|
||||
dft(image1, image1, DFT_COMPLEX_OUTPUT);
|
||||
dft(image2, image2, DFT_COMPLEX_OUTPUT);
|
||||
|
||||
// compute the phase correlation landscape L3
|
||||
Mat L3 = calculateCrossPowerSpectrum(image1, image2);
|
||||
dft(L3, L3, DFT_INVERSE | DFT_SCALE | DFT_REAL_OUTPUT);
|
||||
fftshift(L3);
|
||||
Point2d L3mid(L3.cols / 2, L3.rows / 2);
|
||||
|
||||
// calculate the maximum correlation location
|
||||
Point2i L3peak;
|
||||
minMaxLoc(L3, nullptr, nullptr, nullptr, &L3peak);
|
||||
|
||||
// reduce the L2size as long as L2 is out of bounds of L3
|
||||
while (isOutOfBounds(L3peak, L3, L2size))
|
||||
if (!reduceL2size(L2size))
|
||||
return Point2d(L3peak) - L3mid;
|
||||
|
||||
// extract the L2 maximum correlation neighborhood from L3
|
||||
Mat L2 = L3(Rect(L3peak.x - L2size / 2, L3peak.y - L2size / 2, L2size, L2size));
|
||||
|
||||
// upsample L2 maximum correlation neighborhood to get L2U
|
||||
Mat L2U;
|
||||
const int L2Usize = 223; // empirically determined optimal constant
|
||||
resize(L2, L2U, {L2Usize, L2Usize}, 0, 0, INTER_LINEAR);
|
||||
const Point2d L2Umid(L2U.cols / 2, L2U.rows / 2);
|
||||
|
||||
// run the iterative refinement algorithm using the specified L1 ratio
|
||||
// gradually decrease L1 ratio if convergence is not achieved
|
||||
const double L1ratioBase = 0.45; // empirically determined optimal constant
|
||||
const double L1ratioStep = 0.025;
|
||||
for (double L1ratio = L1ratioBase; getL1size(L2U.cols, L1ratio) > 0; L1ratio -= L1ratioStep)
|
||||
{
|
||||
Point2d L2Upeak = L2Umid; // reset the accumulated L2U peak position
|
||||
const int L1size = getL1size(L2U.cols, L1ratio); // calculate the current L1 size
|
||||
const Point2d L1mid(L1size / 2, L1size / 2); // update the L1 mid position
|
||||
|
||||
// perform the iterative refinement algorithm
|
||||
for (int iter = 0; iter < maxIters; ++iter)
|
||||
{
|
||||
// verify that the L1 region is within the L2U region
|
||||
if (isOutOfBounds(L2Upeak, L2U, L1size))
|
||||
break;
|
||||
|
||||
// extract the L1 region from L2U
|
||||
const Mat L1 = L2U(Rect(static_cast<int>(L2Upeak.x - L1size / 2),
|
||||
static_cast<int>(L2Upeak.y - L1size / 2),
|
||||
L1size,
|
||||
L1size));
|
||||
|
||||
// calculate the centroid location
|
||||
const Point2d L1peak = getPeakSubpixel(L1);
|
||||
|
||||
// add the contribution of the current iteration to the accumulated L2U peak location
|
||||
L2Upeak += Point2d(std::round(L1peak.x - L1mid.x), std::round(L1peak.y - L1mid.y));
|
||||
|
||||
// check for convergence
|
||||
if (accuracyReached(L1peak, L1mid))
|
||||
// return the refined subpixel image shift
|
||||
return Point2d(L3peak) - L3mid +
|
||||
(L2Upeak - L2Umid + L1peak - L1mid) /
|
||||
(static_cast<double>(L2Usize) / L2size);
|
||||
}
|
||||
}
|
||||
|
||||
// iterative refinement failed to converge, return non-iterative subpixel shift
|
||||
return getSubpixelShift(L3, Point2d(L3peak), L3mid, L2size);
|
||||
}
|
||||
@@ -365,7 +365,7 @@ cv::RotatedRect cv::minAreaRect( InputArray _points )
|
||||
Mat hull;
|
||||
Point2f out[3];
|
||||
RotatedRect box;
|
||||
box.angle = -(float)CV_PI / 2; // default angle for box without rotation and single point
|
||||
double angle = -CV_PI / 2; // default angle for box without rotation and single point
|
||||
|
||||
static const bool clockwise = false;
|
||||
convexHull(_points, hull, clockwise, true);
|
||||
@@ -390,7 +390,7 @@ cv::RotatedRect cv::minAreaRect( InputArray _points )
|
||||
if (out[1].x == 0.f && out[1].y > 0.f)
|
||||
std::swap(box.size.width, box.size.height);
|
||||
else
|
||||
box.angle += (float)atan2( (double)out[1].y, (double)out[1].x );
|
||||
angle = -atan2( (double)out[1].x, (double)out[1].y );
|
||||
}
|
||||
else if( n == 2 )
|
||||
{
|
||||
@@ -406,12 +406,12 @@ cv::RotatedRect cv::minAreaRect( InputArray _points )
|
||||
}
|
||||
else if (dy < 0)
|
||||
{
|
||||
box.angle = (float)atan2( dy, dx );
|
||||
angle = atan2( dy, dx );
|
||||
std::swap(box.size.width, box.size.height);
|
||||
}
|
||||
else if (dy > 0)
|
||||
{
|
||||
box.angle += (float)atan2( dy, dx );
|
||||
angle = -atan2( dx, dy );
|
||||
}
|
||||
}
|
||||
else
|
||||
@@ -420,7 +420,7 @@ cv::RotatedRect cv::minAreaRect( InputArray _points )
|
||||
box.center = hpoints[0];
|
||||
}
|
||||
|
||||
box.angle = (float)(box.angle*180/CV_PI);
|
||||
box.angle = (float)(angle*180/CV_PI);
|
||||
CV_DbgCheckGE(box.angle, -90.0f, "");
|
||||
CV_DbgCheckLT(box.angle, 0.0f, "");
|
||||
return box;
|
||||
|
||||
@@ -41,6 +41,7 @@ OTHER DEALINGS IN THE SOFTWARE.
|
||||
#include "opencv2/core/hal/intrin.hpp"
|
||||
|
||||
#include <iostream>
|
||||
#include <algorithm>
|
||||
|
||||
using namespace std;
|
||||
|
||||
@@ -1199,12 +1200,17 @@ void stackBlur(InputArray _src, OutputArray _dst, Size ksize)
|
||||
CV_Assert( ksize.width > 0 && ksize.width % 2 == 1 &&
|
||||
ksize.height > 0 && ksize.height % 2 == 1 );
|
||||
|
||||
int radiusH = ksize.height / 2;
|
||||
int radiusW = ksize.width / 2;
|
||||
|
||||
int stype = _src.type(), sdepth = _src.depth();
|
||||
Mat src = _src.getMat();
|
||||
|
||||
if (ksize.width > src.cols)
|
||||
ksize.width = (src.cols % 2 == 0) ? std::max(1, src.cols - 1) : src.cols;
|
||||
if (ksize.height > src.rows)
|
||||
ksize.height = (src.rows % 2 == 0) ? std::max(1, src.rows - 1) : src.rows;
|
||||
|
||||
int radiusH = ksize.height / 2;
|
||||
int radiusW = ksize.width / 2;
|
||||
|
||||
if (ksize.width == 1)
|
||||
{
|
||||
_src.copyTo(_dst);
|
||||
|
||||
@@ -265,7 +265,7 @@ int Subdiv2D::newPoint(Point2f pt, bool isvirtual, int firstEdge)
|
||||
{
|
||||
if( freePoint == 0 )
|
||||
{
|
||||
vtx.push_back(Vertex());
|
||||
vtx.emplace_back();
|
||||
freePoint = (int)(vtx.size()-1);
|
||||
}
|
||||
int vidx = freePoint;
|
||||
@@ -520,8 +520,8 @@ void Subdiv2D::initDelaunay( Rect rect )
|
||||
Point2f ppB( rx, ry + big_coord );
|
||||
Point2f ppC( rx - big_coord, ry - big_coord );
|
||||
|
||||
vtx.push_back(Vertex());
|
||||
qedges.push_back(QuadEdge());
|
||||
vtx.emplace_back();
|
||||
qedges.emplace_back();
|
||||
|
||||
freeQEdge = 0;
|
||||
freePoint = 0;
|
||||
@@ -566,8 +566,8 @@ void Subdiv2D::initDelaunay( Rect2f rect )
|
||||
Point2f ppB( rx, ry + big_coord );
|
||||
Point2f ppC( rx - big_coord, ry - big_coord );
|
||||
|
||||
vtx.push_back(Vertex());
|
||||
qedges.push_back(QuadEdge());
|
||||
vtx.emplace_back();
|
||||
qedges.emplace_back();
|
||||
|
||||
freeQEdge = 0;
|
||||
freePoint = 0;
|
||||
@@ -784,7 +784,7 @@ void Subdiv2D::getEdgeList(std::vector<Vec4f>& edgeList) const
|
||||
{
|
||||
Point2f org = vtx[qedges[i].pt[0]].pt;
|
||||
Point2f dst = vtx[qedges[i].pt[2]].pt;
|
||||
edgeList.push_back(Vec4f(org.x, org.y, dst.x, dst.y));
|
||||
edgeList.emplace_back(org.x, org.y, dst.x, dst.y);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -836,7 +836,7 @@ void Subdiv2D::getTriangleList(std::vector<Vec6f>& triangleList) const
|
||||
edgemask[edge_a] = true;
|
||||
edgemask[edge_b] = true;
|
||||
edgemask[edge_c] = true;
|
||||
triangleList.push_back(Vec6f(a.x, a.y, b.x, b.y, c.x, c.y));
|
||||
triangleList.emplace_back(a.x, a.y, b.x, b.y, c.x, c.y);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -76,6 +76,19 @@ TEST(Imgproc_ApproxPoly, bad_epsilon)
|
||||
ASSERT_ANY_THROW(approxPolyDP(inputPoints, outputPoints, eps, false));
|
||||
}
|
||||
|
||||
TEST(Imgproc_ApproxPoly, distace_between_point_and_segment)
|
||||
{
|
||||
vector<Point2f> inputPoints = {
|
||||
{ {0.f, 0.f}, {4.f, 2.f}, {11.f, 1.f}, {8.f, 0.f} }
|
||||
};
|
||||
std::vector<Point2f> result;
|
||||
approxPolyDP(inputPoints, result, 1.9, false);
|
||||
vector<Point2f> expectedResult = {
|
||||
{ {0.f, 0.f}, {11.f, 1.f}, {8.f, 0.f} }
|
||||
};
|
||||
ASSERT_EQ(result, expectedResult);
|
||||
}
|
||||
|
||||
struct ApproxPolyN: public testing::Test
|
||||
{
|
||||
void SetUp()
|
||||
|
||||
@@ -291,4 +291,33 @@ namespace opencv_test { namespace {
|
||||
test.safe_run();
|
||||
}
|
||||
|
||||
// Regression test for issue #28254
|
||||
// Out-of-bounds read in AVX2 bilateralFilter 32f path with BORDER_CONSTANT
|
||||
TEST(Imgproc_BilateralFilter, regression_28254_oob_read)
|
||||
{
|
||||
// Create a 64x64 CV_32FC1 image with values in range [100, 200]
|
||||
// Image must be large enough (width >= 32) to trigger SIMD/AVX2 code path.
|
||||
// Values are set so BORDER_CONSTANT padding (default 0) is outside the range,
|
||||
// which triggers the out-of-bounds condition in the LUT access.
|
||||
cv::Mat src(64, 64, CV_32FC1);
|
||||
cv::randu(src, 100.0f, 200.0f);
|
||||
cv::Mat dst;
|
||||
|
||||
// Parameters that trigger the bug
|
||||
int d = -1;
|
||||
double sigmaColor = 2.7;
|
||||
double sigmaSpace = 44.5;
|
||||
int borderType = cv::BORDER_CONSTANT;
|
||||
|
||||
// This should not crash or trigger AddressSanitizer
|
||||
EXPECT_NO_THROW(
|
||||
cv::bilateralFilter(src, dst, d, sigmaColor, sigmaSpace, borderType)
|
||||
);
|
||||
|
||||
// Verify output is valid
|
||||
EXPECT_FALSE(dst.empty());
|
||||
EXPECT_EQ(dst.size(), src.size());
|
||||
EXPECT_EQ(dst.type(), src.type());
|
||||
}
|
||||
|
||||
}} // namespace
|
||||
|
||||
@@ -233,5 +233,20 @@ TEST(Imgproc_DrawContours, MatListOfMatIntScalarInt)
|
||||
EXPECT_EQ(nz, 0);
|
||||
}
|
||||
|
||||
TEST(Imgproc_Moments, degenerateContours)
|
||||
{
|
||||
std::vector<cv::Point> c1;
|
||||
c1.push_back(cv::Point(10,10));
|
||||
cv::Moments m1 = cv::moments(c1, false);
|
||||
EXPECT_EQ(m1.m00, 0);
|
||||
|
||||
std::vector<cv::Point> c2;
|
||||
c2.push_back(cv::Point(0,0));
|
||||
c2.push_back(cv::Point(5,5));
|
||||
c2.push_back(cv::Point(10,10));
|
||||
cv::Moments m2 = cv::moments(c2, false);
|
||||
EXPECT_EQ(m2.m00, 0);
|
||||
}
|
||||
|
||||
}} // namespace
|
||||
/* End of file. */
|
||||
|
||||
@@ -304,9 +304,11 @@ TEST(Imgproc_ConvexityDefects, ordering_4539)
|
||||
vector<int> hull_ind;
|
||||
vector<Vec4i> defects;
|
||||
|
||||
#if 0 // deprecated behavior
|
||||
// first, check the original contour as-is, without intermediate fillPoly/drawContours.
|
||||
convexHull(contour_, hull_ind, false, false);
|
||||
EXPECT_THROW( convexityDefects(contour_, hull_ind, defects), cv::Exception );
|
||||
#endif
|
||||
|
||||
int scale = 20;
|
||||
contour_ *= (double)scale;
|
||||
@@ -319,10 +321,12 @@ TEST(Imgproc_ConvexityDefects, ordering_4539)
|
||||
findContours(canvas_gray, contours, noArray(), RETR_LIST, CHAIN_APPROX_SIMPLE);
|
||||
convexHull(contours[0], hull_ind, false, false);
|
||||
|
||||
#if 0 // deprecated behavior
|
||||
// the original contour contains self-intersections,
|
||||
// therefore convexHull does not return a monotonous sequence of points
|
||||
// and therefore convexityDefects throws an exception
|
||||
EXPECT_THROW( convexityDefects(contours[0], hull_ind, defects), cv::Exception );
|
||||
#endif
|
||||
|
||||
#if 1
|
||||
// one way to eliminate the contour self-intersection in this particular case is to apply dilate(),
|
||||
@@ -1049,7 +1053,7 @@ TEST_P(minEnclosingTriangle_Modes, accuracy)
|
||||
const Mat midPoint = (cur + next) / 2;
|
||||
EXPECT_TRUE(isPointOnHull(hull, midPoint));
|
||||
|
||||
// at least one of hull edges must be on tirangle edge
|
||||
// at least one of hull edges must be on triangle edge
|
||||
hasEdgeOnHull = hasEdgeOnHull || isEdgeOnHull(hull, cur, next);
|
||||
}
|
||||
EXPECT_TRUE(hasEdgeOnHull);
|
||||
@@ -1279,10 +1283,60 @@ INSTANTIATE_TEST_CASE_P(Imgproc, minAreaRect_of_line,
|
||||
testing::Values(
|
||||
std::make_tuple(Point2f(10, 15), Point2f(10, 25), Point2f(10, 20), Size2f(10, 0), -90.f),
|
||||
std::make_tuple(Point2f(450, 500), Point2f(508, 500), Point2f(479, 500), Size2f(0, 58), -90.f),
|
||||
std::make_tuple(Point2f(10, 20), Point2f(13, 16), Point2f(11.5, 18), Size2f(5, 0), -53.1301002f),
|
||||
std::make_tuple(Point2f(10, 20), Point2f(13, 16), Point2f(11.5, 18), Size2f(5, 0), -53.1301041f),
|
||||
std::make_tuple(Point2f(9, 19), Point2f(4, 7), Point2f(6.5, 13), Size2f(0, 13), -22.6198654f)
|
||||
));
|
||||
|
||||
typedef testing::TestWithParam<tuple<tuple<std::vector<Point>, Mat>, bool> > convexHull_monotonous;
|
||||
TEST_P(convexHull_monotonous, self_intersecting_contour)
|
||||
{
|
||||
std::vector<Point> contour = get<0>(get<0>(GetParam()));
|
||||
Mat ref = get<1>(get<0>(GetParam())).clone();
|
||||
bool clockwise = get<1>(GetParam());
|
||||
if (!clockwise)
|
||||
{
|
||||
std::reverse(ref.begin<int>(), ref.end<int>());
|
||||
}
|
||||
|
||||
Mat indices;
|
||||
convexHull(contour, indices, clockwise, false);
|
||||
|
||||
Point minLoc;
|
||||
minMaxLoc(indices, nullptr, nullptr, &minLoc);
|
||||
std::rotate(indices.begin<int>(), indices.begin<int>() + minLoc.y, indices.end<int>());
|
||||
|
||||
minMaxLoc(ref, nullptr, nullptr, &minLoc);
|
||||
std::rotate(ref.begin<int>(), ref.begin<int>() + minLoc.y, ref.end<int>());
|
||||
|
||||
ASSERT_EQ( cvtest::norm(indices, ref, NORM_INF), 0) << indices;
|
||||
}
|
||||
INSTANTIATE_TEST_CASE_P(Imgproc, convexHull_monotonous,
|
||||
testing::Combine(
|
||||
testing::Values(
|
||||
std::make_tuple(
|
||||
std::vector<Point>{
|
||||
Point(3, 2), Point(3, 4), Point(2, 5), Point(1, 5),
|
||||
Point(2, 5), Point(3, 4), Point(6, 4), Point(6, 2)
|
||||
},
|
||||
(Mat_<int>(5, 1) << 0, 3, 4, 6, 7)
|
||||
),
|
||||
std::make_tuple(
|
||||
std::vector<Point>{
|
||||
Point(3, -2), Point(3, -4), Point(2, -5), Point(1, -5),
|
||||
Point(2, -5), Point(3, -4), Point(6, -4), Point(6, -2)
|
||||
},
|
||||
(Mat_<int>(5, 1) << 3, 0, 7, 6, 4)
|
||||
),
|
||||
std::make_tuple(
|
||||
std::vector<Point>{
|
||||
Point(1, 1), Point(1, 0), Point(0, 0), Point(1, 0), Point(0, 1)
|
||||
},
|
||||
(Mat_<int>(4, 1) << 0, 1, 2, 4)
|
||||
)
|
||||
),
|
||||
testing::Bool()
|
||||
));
|
||||
|
||||
}} // namespace
|
||||
|
||||
/* End of file. */
|
||||
|
||||
@@ -1281,4 +1281,28 @@ TEST(Drawing, contours_filled)
|
||||
}
|
||||
}
|
||||
|
||||
// Test for LINE_4 vs LINE_8 connectivity behavior
|
||||
// Regression test for issue #26413
|
||||
TEST(Drawing, line_connectivity_regression_26413)
|
||||
{
|
||||
Mat img4(10, 10, CV_8UC1, Scalar(0));
|
||||
Mat img8(10, 10, CV_8UC1, Scalar(0));
|
||||
|
||||
// Draw a diagonal line from (0,0) to (9,9)
|
||||
// LINE_4 (4-connected) should produce staircase pattern (no diagonals)
|
||||
// LINE_8 (8-connected) should produce diagonal steps
|
||||
line(img4, Point(0, 0), Point(9, 9), Scalar(255), 1, LINE_4);
|
||||
line(img8, Point(0, 0), Point(9, 9), Scalar(255), 1, LINE_8);
|
||||
|
||||
int count4 = countNonZero(img4);
|
||||
int count8 = countNonZero(img8);
|
||||
|
||||
// LINE_8 for a 10-pixel diagonal should have exactly 10 pixels
|
||||
EXPECT_EQ(10, count8) << "LINE_8 diagonal from (0,0) to (9,9) should have 10 pixels";
|
||||
|
||||
// LINE_4 for a 10-pixel diagonal should have approximately 19 pixels
|
||||
// (needs both horizontal and vertical steps)
|
||||
EXPECT_GT(count4, 15) << "LINE_4 diagonal should have significantly more pixels due to staircase";
|
||||
}
|
||||
|
||||
}} // namespace
|
||||
|
||||
@@ -509,7 +509,8 @@ int CV_GoodFeatureToTTest::validate_test_results( int test_case_idx )
|
||||
EXPECT_LE(e, eps); // never true
|
||||
ts->set_failed_test_info(cvtest::TS::FAIL_BAD_ACCURACY);
|
||||
|
||||
for(int i = 0; i < (int)std::min((unsigned int)(cornersQuality.size()), (unsigned int)(cornersQuality.size())); i++) {
|
||||
int min_size = (int)std::min(cornersQuality.size(), RefcornersQuality.size());
|
||||
for(int i = 0; i < min_size; i++) {
|
||||
if (std::abs(cornersQuality[i] - RefcornersQuality[i]) > eps * std::max(cornersQuality[i], RefcornersQuality[i]))
|
||||
printf("i = %i Quality %2.6f Quality ref %2.6f\n", i, cornersQuality[i], RefcornersQuality[i]);
|
||||
}
|
||||
|
||||
@@ -0,0 +1,117 @@
|
||||
// This file is part of OpenCV project.
|
||||
// It is subject to the license terms in the LICENSE file found in the top-level directory
|
||||
// of this distribution and at http://opencv.org/license.html.
|
||||
|
||||
#include "test_precomp.hpp"
|
||||
#include <vector>
|
||||
|
||||
namespace opencv_test { namespace {
|
||||
|
||||
Mat CropMid(InputArray src, int w, int h)
|
||||
{
|
||||
Mat mat = src.getMat();
|
||||
return mat(Rect(mat.cols / 2 - w / 2, mat.rows / 2 - h / 2, w, h));
|
||||
}
|
||||
|
||||
Mat GenerateTestImage(Size size)
|
||||
{
|
||||
Mat image = Mat::zeros(size.height * 2, size.width * 2, CV_32F);
|
||||
rectangle(image,
|
||||
Point(static_cast<int>(size.width * 0.1), static_cast<int>(size.height * 0.1)),
|
||||
Point(static_cast<int>(size.width * 0.9), static_cast<int>(size.height * 0.9)),
|
||||
Scalar(1),
|
||||
-1);
|
||||
return image;
|
||||
}
|
||||
|
||||
void TestPhaseCorrelationIterative(const Size& size, const double maxShift)
|
||||
{
|
||||
const auto iters = std::max(201., maxShift * 10 + 1);
|
||||
const Point2d shiftOffset(-maxShift * 0.5, -maxShift * 0.5);
|
||||
Mat image1 = GenerateTestImage(size);
|
||||
Mat crop1 = CropMid(image1, size.width, size.height);
|
||||
Mat image2 = image1.clone();
|
||||
|
||||
std::vector<double> pcErrors;
|
||||
std::vector<double> ipcErrors;
|
||||
|
||||
for (int i = 0; i < iters; ++i)
|
||||
{
|
||||
const auto shift =
|
||||
Point2d(maxShift * i / (iters - 1), maxShift * i / (iters - 1)) + shiftOffset;
|
||||
const Mat Tmat = (Mat_<double>(2, 3) << 1., 0., shift.x, 0., 1., shift.y);
|
||||
warpAffine(image1, image2, Tmat, image2.size());
|
||||
Mat crop2 = CropMid(image2, size.width, size.height);
|
||||
const auto ipcshift = phaseCorrelateIterative(crop1, crop2);
|
||||
const auto pcshift = phaseCorrelate(crop1, crop2);
|
||||
|
||||
pcErrors.push_back(
|
||||
0.5 * std::abs(pcshift.x - shift.y) + 0.5 * std::abs(pcshift.y - shift.x));
|
||||
ipcErrors.push_back(
|
||||
0.5 * std::abs(ipcshift.x - shift.y) + 0.5 * std::abs(ipcshift.y - shift.x));
|
||||
|
||||
// error should be low
|
||||
EXPECT_NEAR(ipcshift.x - shift.x, 0.0, 0.1);
|
||||
EXPECT_NEAR(ipcshift.y - shift.y, 0.0, 0.1);
|
||||
}
|
||||
|
||||
cv::Scalar pcMean, pcStddev, ipcMean, ipcStddev;
|
||||
meanStdDev(ipcErrors, ipcMean, ipcStddev);
|
||||
meanStdDev(pcErrors, pcMean, pcStddev);
|
||||
|
||||
// average error should be low
|
||||
ASSERT_LT(ipcMean[0], 0.03);
|
||||
// average error should be less than non-iterative average error
|
||||
ASSERT_LT(ipcMean[0], pcMean[0]);
|
||||
// error stddev should be less than non-iterative error stddev
|
||||
ASSERT_LT(ipcStddev[0], pcStddev[0]);
|
||||
}
|
||||
|
||||
|
||||
TEST(Imgproc_PhaseCorrelationIterative, 256x128_accuracy)
|
||||
{
|
||||
TestPhaseCorrelationIterative(Size(256, 128), 1);
|
||||
}
|
||||
|
||||
TEST(Imgproc_PhaseCorrelationIterative, 64x64_accuracy_shift_1)
|
||||
{
|
||||
TestPhaseCorrelationIterative(Size(64, 64), 1);
|
||||
}
|
||||
|
||||
TEST(Imgproc_PhaseCorrelationIterative, 64x64_accuracy_shift_16)
|
||||
{
|
||||
TestPhaseCorrelationIterative(Size(64, 64), 16);
|
||||
}
|
||||
|
||||
TEST(Imgproc_PhaseCorrelationIterative, 0x0_image)
|
||||
{
|
||||
ASSERT_ANY_THROW(TestPhaseCorrelationIterative(Size(0, 0), 1));
|
||||
}
|
||||
|
||||
TEST(Imgproc_PhaseCorrelationIterative, 1x1_image)
|
||||
{
|
||||
ASSERT_ANY_THROW(TestPhaseCorrelationIterative(Size(1, 1), 1));
|
||||
}
|
||||
|
||||
TEST(Imgproc_PhaseCorrelationIterative, accuracy_real_img)
|
||||
{
|
||||
Mat img = imread(cvtest::TS::ptr()->get_data_path() + "shared/airplane.png", IMREAD_GRAYSCALE);
|
||||
if (img.empty())
|
||||
return;
|
||||
img.convertTo(img, CV_64FC1);
|
||||
|
||||
const int xLen = 256;
|
||||
const int yLen = 256;
|
||||
const int xShift = 40;
|
||||
const int yShift = 14;
|
||||
|
||||
Mat roi1 = img(Rect(xShift, yShift, xLen, yLen));
|
||||
Mat roi2 = img(Rect(0, 0, xLen, yLen));
|
||||
|
||||
const Point2d ipcShift = phaseCorrelateIterative(roi1, roi2);
|
||||
|
||||
ASSERT_NEAR(ipcShift.x, (double)xShift, 1.);
|
||||
ASSERT_NEAR(ipcShift.y, (double)yShift, 1.);
|
||||
}
|
||||
|
||||
}} // namespace opencv_test
|
||||
@@ -311,5 +311,18 @@ TEST_P(StackBlur_GaussianBlur, compare)
|
||||
}
|
||||
|
||||
INSTANTIATE_TEST_CASE_P(Imgproc, StackBlur_GaussianBlur, testing::Values(CV_8U, CV_16S, CV_16U, CV_32F));
|
||||
|
||||
TEST(Imgproc_StackBlur, regression_28233)
|
||||
{
|
||||
Mat src1(1, 1, CV_8UC1, Scalar(123));
|
||||
Mat dst1;
|
||||
EXPECT_NO_THROW(stackBlur(src1, dst1, Size(9, 1)));
|
||||
EXPECT_EQ(dst1.at<uchar>(0, 0), 123);
|
||||
|
||||
Mat src2(3, 3, CV_8UC1, Scalar(50));
|
||||
Mat dst2;
|
||||
EXPECT_NO_THROW(stackBlur(src2, dst2, Size(11, 11)));
|
||||
EXPECT_EQ(dst2.at<uchar>(1, 1), 50);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user