久久精品国产精品国产精品污,男人扒开添女人下部免费视频,一级国产69式性姿势免费视频,夜鲁夜鲁很鲁在线视频 视频,欧美丰满少妇一区二区三区,国产偷国产偷亚洲高清人乐享,中文 在线 日韩 亚洲 欧美,熟妇人妻无乱码中文字幕真矢织江,一区二区三区人妻制服国产

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

OpenCV代码提取:cvtColor函数的实现

發布時間:2023/11/27 生活经验 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 OpenCV代码提取:cvtColor函数的实现 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

OpenCV中的cvtColor函數包括了很多顏色格式之間的轉換,用起來很方便,這里對cvtColor函數的code進行了提取,經測試,和OpenCV3.1結果完全一致。

實現代碼cvtColor.hpp:

// fbc_cv is free software and uses the same licence as OpenCV
// Email: fengbingchun@163.com#ifndef FBC_CV_CVTCOLOR_HPP_
#define FBC_CV_CVTCOLOR_HPP_// reference: include/opencv2/imgproc.hpp#include "core/mat.hpp"
#include "core/saturate.hpp"
#include "imgproc.hpp"
#include "core/core.hpp"namespace fbc {
#define  FBC_DESCALE(x,n)     (((x) + (1 << ((n)-1))) >> (n))template<typename _Tp, int chs1, int chs2> static int CvtColorLoop_RGB2RGB(const Mat_<_Tp, chs1>& src, Mat_<_Tp, chs2>& dst, int bidx);
template<typename _Tp, int chs1, int chs2> static int CvtColorLoop_RGB2Gray(const Mat_<_Tp, chs1>& src, Mat_<_Tp, chs2>& dst, int bidx);
template<typename _Tp, int chs1, int chs2> static int CvtColorLoop_Gray2RGB(const Mat_<_Tp, chs1>& src, Mat_<_Tp, chs2>& dst);
template<typename _Tp, int chs1, int chs2> static int CvtColorLoop_RGB2YCrCb(const Mat_<_Tp, chs1>& src, Mat_<_Tp, chs2>& dst, int bidx, const float* coeffs_f, const int* coeffs_i);
template<typename _Tp, int chs1, int chs2> static int CvtColorLoop_YCrCb2RGB(const Mat_<_Tp, chs1>& src, Mat_<_Tp, chs2>& dst, int bidx, const float* coeffs_f, const int* coeffs_i);
template<typename _Tp, int chs1, int chs2> static int CvtColorLoop_RGB2XYZ(const Mat_<_Tp, chs1>& src, Mat_<_Tp, chs2>& dst, int bidx);
template<typename _Tp, int chs1, int chs2> static int CvtColorLoop_XYZ2RGB(const Mat_<_Tp, chs1>& src, Mat_<_Tp, chs2>& dst, int bidx);
template<typename _Tp, int chs1, int chs2> static int CvtColorLoop_RGB2HSV(const Mat_<_Tp, chs1>& src, Mat_<_Tp, chs2>& dst, int bidx, int hrange);
template<typename _Tp, int chs1, int chs2> static int CvtColorLoop_RGB2HLS(const Mat_<_Tp, chs1>& src, Mat_<_Tp, chs2>& dst, int bidx, int hrange);
template<typename _Tp, int chs1, int chs2> static int CvtColorLoop_HSV2RGB(const Mat_<_Tp, chs1>& src, Mat_<_Tp, chs2>& dst, int bidx, int hrange);
template<typename _Tp, int chs1, int chs2> static int CvtColorLoop_HLS2RGB(const Mat_<_Tp, chs1>& src, Mat_<_Tp, chs2>& dst, int bidx, int hrange);
template<typename _Tp, int chs1, int chs2> static int CvtColorLoop_RGB2Lab(const Mat_<_Tp, chs1>& src, Mat_<_Tp, chs2>& dst, int bidx, const float* coeffs, const float* whitept, bool srgb);
template<typename _Tp, int chs1, int chs2> static int CvtColorLoop_RGB2Luv(const Mat_<_Tp, chs1>& src, Mat_<_Tp, chs2>& dst, int bidx, const float* coeffs, const float* whitept, bool srgb);
template<typename _Tp, int chs1, int chs2> static int CvtColorLoop_Lab2RGB(const Mat_<_Tp, chs1>& src, Mat_<_Tp, chs2>& dst, int bidx, const float* coeffs, const float* whitept, bool srgb);
template<typename _Tp, int chs1, int chs2> static int CvtColorLoop_Luv2RGB(const Mat_<_Tp, chs1>& src, Mat_<_Tp, chs2>& dst, int bidx, const float* coeffs, const float* whitept, bool srgb);// Converts an image from one color space to another
// support type: uchar/ushort/float
template<typename _Tp, int chs1, int chs2>
int cvtColor(const Mat_<_Tp, chs1>& src, Mat_<_Tp, chs2>& dst, int code)
{FBC_Assert(src.cols > 0 &&  src.rows > 0 && dst.cols > 0 && dst.rows > 0);FBC_Assert(src.cols == dst.cols);FBC_Assert(src.data != NULL && dst.data != NULL);FBC_Assert((sizeof(_Tp) == 1) || sizeof(_Tp) == 2 || sizeof(_Tp) == 4); // uchar || ushort || floatint scn = src.channels;int dcn = dst.channels; // number of channels in the destination imageSize sz = src.size();Size dz = dst.size();int bidx;switch (code) {case CV_BGR2BGRA: case CV_RGB2BGRA: case CV_BGRA2BGR:case CV_RGBA2BGR: case CV_RGB2BGR: case CV_BGRA2RGBA: {FBC_Assert(scn == 3 || scn == 4);dcn = code == CV_BGR2BGRA || code == CV_RGB2BGRA || code == CV_BGRA2RGBA ? 4 : 3;FBC_Assert(dst.channels == dcn);bidx = code == CV_BGR2BGRA || code == CV_BGRA2BGR ? 0 : 2;CvtColorLoop_RGB2RGB(src, dst, bidx); // uchar/ushort/floatbreak;}case CV_BGR2GRAY: case CV_BGRA2GRAY: case CV_RGB2GRAY: case CV_RGBA2GRAY: {FBC_Assert(scn == 3 || scn == 4);FBC_Assert(dst.channels == 1);bidx = code == CV_BGR2GRAY || code == CV_BGRA2GRAY ? 0 : 2;CvtColorLoop_RGB2Gray(src, dst, bidx);break;}case CV_GRAY2BGR: case CV_GRAY2BGRA: {FBC_Assert(scn == 1 && (dcn == 3 || dcn == 4));CvtColorLoop_Gray2RGB(src, dst);break;}case CV_BGR2YCrCb: case CV_RGB2YCrCb:case CV_BGR2YUV: case CV_RGB2YUV: {FBC_Assert(scn == 3 || scn == 4);bidx = code == CV_BGR2YCrCb || code == CV_BGR2YUV ? 0 : 2;static const float yuv_f[] = { 0.114f, 0.587f, 0.299f, 0.492f, 0.877f };static const int yuv_i[] = { B2Y, G2Y, R2Y, 8061, 14369 };const float* coeffs_f = code == CV_BGR2YCrCb || code == CV_RGB2YCrCb ? 0 : yuv_f;const int* coeffs_i = code == CV_BGR2YCrCb || code == CV_RGB2YCrCb ? 0 : yuv_i;CvtColorLoop_RGB2YCrCb(src, dst, bidx, coeffs_f, coeffs_i);break;}case CV_YCrCb2BGR: case CV_YCrCb2RGB:case CV_YUV2BGR: case CV_YUV2RGB: {FBC_Assert(scn == 3 && (dcn == 3 || dcn == 4));bidx = code == CV_YCrCb2BGR || code == CV_YUV2BGR ? 0 : 2;static const float yuv_f[] = { 2.032f, -0.395f, -0.581f, 1.140f };static const int yuv_i[] = { 33292, -6472, -9519, 18678 };const float* coeffs_f = code == CV_YCrCb2BGR || code == CV_YCrCb2RGB ? 0 : yuv_f;const int* coeffs_i = code == CV_YCrCb2BGR || code == CV_YCrCb2RGB ? 0 : yuv_i;CvtColorLoop_YCrCb2RGB(src, dst, bidx, coeffs_f, coeffs_i);break;}case CV_BGR2XYZ: case CV_RGB2XYZ: {FBC_Assert(scn == 3 || scn == 4);bidx = code == CV_BGR2XYZ ? 0 : 2;CvtColorLoop_RGB2XYZ(src, dst, bidx);break;}case CV_XYZ2BGR: case CV_XYZ2RGB: {FBC_Assert(scn == 3 && (dcn == 3 || dcn == 4));bidx = code == CV_XYZ2BGR ? 0 : 2;CvtColorLoop_XYZ2RGB(src, dst, bidx);break;}case CV_BGR2HSV: case CV_RGB2HSV: case CV_BGR2HSV_FULL: case CV_RGB2HSV_FULL:case CV_BGR2HLS: case CV_RGB2HLS: case CV_BGR2HLS_FULL: case CV_RGB2HLS_FULL: {FBC_Assert(scn == 3 || scn == 4);FBC_Assert(sizeof(_Tp) == 1 || sizeof(_Tp) == 4);bidx = code == CV_BGR2HSV || code == CV_BGR2HLS ||code == CV_BGR2HSV_FULL || code == CV_BGR2HLS_FULL ? 0 : 2;int hrange = sizeof(_Tp) == 4 ? 360 : code == CV_BGR2HSV || code == CV_RGB2HSV ||code == CV_BGR2HLS || code == CV_RGB2HLS ? 180 : 256;if (code == CV_BGR2HSV || code == CV_RGB2HSV || code == CV_BGR2HSV_FULL || code == CV_RGB2HSV_FULL) {CvtColorLoop_RGB2HSV(src, dst, bidx, hrange);} else {CvtColorLoop_RGB2HLS(src, dst, bidx, hrange);}break;}case CV_HSV2BGR: case CV_HSV2RGB: case CV_HSV2BGR_FULL: case CV_HSV2RGB_FULL:case CV_HLS2BGR: case CV_HLS2RGB: case CV_HLS2BGR_FULL: case CV_HLS2RGB_FULL: {FBC_Assert(scn == 3 && (dcn == 3 || dcn == 4));FBC_Assert(sizeof(_Tp) == 1 || sizeof(_Tp) == 4);bidx = code == CV_HSV2BGR || code == CV_HLS2BGR ||code == CV_HSV2BGR_FULL || code == CV_HLS2BGR_FULL ? 0 : 2;int hrange = sizeof(_Tp) == 4 ? 360 : code == CV_HSV2BGR || code == CV_HSV2RGB ||code == CV_HLS2BGR || code == CV_HLS2RGB ? 180 : 255;if (code == CV_HSV2BGR || code == CV_HSV2RGB || code == CV_HSV2BGR_FULL || code == CV_HSV2RGB_FULL) {CvtColorLoop_HSV2RGB(src, dst, bidx, hrange);} else {CvtColorLoop_HLS2RGB(src, dst, bidx, hrange);}break;}case CV_BGR2Lab: case CV_RGB2Lab:case CV_BGR2Luv: case CV_RGB2Luv: {FBC_Assert(scn == 3 || scn == 4);FBC_Assert(sizeof(_Tp) == 1 || sizeof(_Tp) == 4);bidx = code == CV_BGR2Lab || code == CV_BGR2Luv ? 0 : 2;bool srgb = code == CV_BGR2Lab || code == CV_RGB2Lab || code == CV_BGR2Luv || code == CV_RGB2Luv;if (code == CV_BGR2Lab || code == CV_RGB2Lab) {CvtColorLoop_RGB2Lab(src, dst, bidx, 0, 0, srgb);} else {CvtColorLoop_RGB2Luv(src, dst, bidx, 0, 0, srgb);}break;}case CV_Lab2BGR: case CV_Lab2RGB:case CV_Luv2BGR: case CV_Luv2RGB: {FBC_Assert(scn == 3 && (dcn == 3 || dcn == 4));FBC_Assert(sizeof(_Tp) == 1 || sizeof(_Tp) == 4);bidx = code == CV_Lab2BGR || code == CV_Luv2BGR ? 0 : 2;bool srgb = code == CV_Lab2BGR || code == CV_Lab2RGB || code == CV_Luv2BGR || code == CV_Luv2RGB;if (code == CV_Lab2BGR || code == CV_Lab2RGB) {CvtColorLoop_Lab2RGB(src, dst, bidx, 0, 0, srgb);} else {CvtColorLoop_Luv2RGB(src, dst, bidx, 0, 0, srgb);}break;}case CV_YUV2BGR_NV21:  case CV_YUV2RGB_NV21:  case CV_YUV2BGR_NV12:  case CV_YUV2RGB_NV12:case CV_YUV2BGRA_NV21: case CV_YUV2RGBA_NV21: case CV_YUV2BGRA_NV12: case CV_YUV2RGBA_NV12: {// http://www.fourcc.org/yuv.php#NV21 == yuv420sp -> a plane of 8 bit Y samples followed by an interleaved V/U plane containing 8 bit 2x2 subsampled chroma samples// http://www.fourcc.org/yuv.php#NV12 -> a plane of 8 bit Y samples followed by an interleaved U/V plane containing 8 bit 2x2 subsampled colour difference samplesdcn = (code == CV_YUV420sp2BGRA || code == CV_YUV420sp2RGBA || code == CV_YUV2BGRA_NV12 || code == CV_YUV2RGBA_NV12) ? 4 : 3;FBC_Assert(dcn == dst.channels);const int bIdx = (code == CV_YUV2BGR_NV21 || code == CV_YUV2BGRA_NV21 || code == CV_YUV2BGR_NV12 || code == CV_YUV2BGRA_NV12) ? 0 : 2;const int uIdx = (code == CV_YUV2BGR_NV21 || code == CV_YUV2BGRA_NV21 || code == CV_YUV2RGB_NV21 || code == CV_YUV2RGBA_NV21) ? 1 : 0;FBC_Assert(dcn == 3 || dcn == 4);FBC_Assert(sz.width % 2 == 0 && sz.height % 3 == 0);FBC_Assert(sizeof(_Tp) == 1);//Size dstSz(sz.width, sz.height * 2 / 3);FBC_Assert((sz.width == dz.width) && (dz.height = sz.height * 2 / 3));int srcstep = (int)src.step;const uchar* y = src.ptr();const uchar* uv = y + srcstep * dz.height;switch (dcn * 100 + bIdx * 10 + uIdx) {case 300: cvtYUV420sp2RGB<_Tp, chs2, 0, 0>(dst, srcstep, y, uv); break;case 301: cvtYUV420sp2RGB<_Tp, chs2, 0, 1>(dst, srcstep, y, uv); break;case 320: cvtYUV420sp2RGB<_Tp, chs2, 2, 0>(dst, srcstep, y, uv); break;case 321: cvtYUV420sp2RGB<_Tp, chs2, 2, 1>(dst, srcstep, y, uv); break;case 400: cvtYUV420sp2RGBA<_Tp, chs2, 0, 0>(dst, srcstep, y, uv); break;case 401: cvtYUV420sp2RGBA<_Tp, chs2, 0, 1>(dst, srcstep, y, uv); break;case 420: cvtYUV420sp2RGBA<_Tp, chs2, 2, 0>(dst, srcstep, y, uv); break;case 421: cvtYUV420sp2RGBA<_Tp, chs2, 2, 1>(dst, srcstep, y, uv); break;default: FBC_Error("Unknown/unsupported color conversion code"); break;};break;}case CV_YUV2BGR_YV12: case CV_YUV2RGB_YV12: case CV_YUV2BGRA_YV12: case CV_YUV2RGBA_YV12:case CV_YUV2BGR_IYUV: case CV_YUV2RGB_IYUV: case CV_YUV2BGRA_IYUV: case CV_YUV2RGBA_IYUV: {//http://www.fourcc.org/yuv.php#YV12 == yuv420p -> It comprises an NxM Y plane followed by (N/2)x(M/2) V and U planes.//http://www.fourcc.org/yuv.php#IYUV == I420 -> It comprises an NxN Y plane followed by (N/2)x(N/2) U and V planesdcn = (code == CV_YUV2BGRA_YV12 || code == CV_YUV2RGBA_YV12 || code == CV_YUV2RGBA_IYUV || code == CV_YUV2BGRA_IYUV) ? 4 : 3;FBC_Assert(dcn == dst.channels);const int bIdx = (code == CV_YUV2BGR_YV12 || code == CV_YUV2BGRA_YV12 || code == CV_YUV2BGR_IYUV || code == CV_YUV2BGRA_IYUV) ? 0 : 2;const int uIdx = (code == CV_YUV2BGR_YV12 || code == CV_YUV2RGB_YV12 || code == CV_YUV2BGRA_YV12 || code == CV_YUV2RGBA_YV12) ? 1 : 0;FBC_Assert(dcn == 3 || dcn == 4);FBC_Assert(sz.width % 2 == 0 && sz.height % 3 == 0);FBC_Assert(sizeof(_Tp) == 1);//Size dstSz(sz.width, sz.height * 2 / 3);FBC_Assert((sz.width == dz.width) && (dz.height = sz.height * 2 / 3));int srcstep = (int)src.step;const uchar* y = src.ptr();const uchar* u = y + srcstep * dz.height;const uchar* v = y + srcstep * (dz.height + dz.height / 4) + (dz.width / 2) * ((dz.height % 4) / 2);int ustepIdx = 0;int vstepIdx = dz.height % 4 == 2 ? 1 : 0;if (uIdx == 1) { std::swap(u, v), std::swap(ustepIdx, vstepIdx); }switch (dcn * 10 + bIdx) {case 30: cvtYUV420p2RGB<_Tp, chs2, 0>(dst, srcstep, y, u, v, ustepIdx, vstepIdx); break;case 32: cvtYUV420p2RGB<_Tp, chs2, 2>(dst, srcstep, y, u, v, ustepIdx, vstepIdx); break;case 40: cvtYUV420p2RGBA<_Tp, chs2, 0>(dst, srcstep, y, u, v, ustepIdx, vstepIdx); break;case 42: cvtYUV420p2RGBA<_Tp, chs2, 2>(dst, srcstep, y, u, v, ustepIdx, vstepIdx); break;default: FBC_Error("Unknown/unsupported color conversion code"); break;};break;}case CV_YUV2GRAY_420: {FBC_Assert(dcn == 1 && scn == 1);FBC_Assert(sz.width % 2 == 0 && sz.height % 3 == 0);FBC_Assert(sizeof(_Tp) == 1);//Size dstSz(sz.width, sz.height * 2 / 3);FBC_Assert((sz.width == dz.width) && (dz.height = sz.height * 2 / 3));//src.copyTo(dst, Rect(0, 0, sz.width, dz.height));memcpy(dst.data, src.data, dz.area());break;}case CV_RGB2YUV_YV12: case CV_BGR2YUV_YV12: case CV_RGBA2YUV_YV12: case CV_BGRA2YUV_YV12:case CV_RGB2YUV_IYUV: case CV_BGR2YUV_IYUV: case CV_RGBA2YUV_IYUV: case CV_BGRA2YUV_IYUV: {const int bIdx = (code == CV_BGR2YUV_IYUV || code == CV_BGRA2YUV_IYUV || code == CV_BGR2YUV_YV12 || code == CV_BGRA2YUV_YV12) ? 0 : 2;const int uIdx = (code == CV_BGR2YUV_IYUV || code == CV_BGRA2YUV_IYUV || code == CV_RGB2YUV_IYUV || code == CV_RGBA2YUV_IYUV) ? 1 : 2;FBC_Assert(scn == 3 || scn == 4);FBC_Assert(sizeof(_Tp) == 1);FBC_Assert(dcn == 1);FBC_Assert(sz.width % 2 == 0 && sz.height % 2 == 0);//Size dstSz(sz.width, sz.height / 2 * 3);FBC_Assert((dz.width == sz.width) && (sz.height / 2 * 3 == dz.height));switch (bIdx + uIdx * 10) {case 10: cvtRGBtoYUV420p<_Tp, chs1, chs2, 0, 1>(src, dst); break;case 12: cvtRGBtoYUV420p<_Tp, chs1, chs2, 2, 1>(src, dst); break;case 20: cvtRGBtoYUV420p<_Tp, chs1, chs2, 0, 2>(src, dst); break;case 22: cvtRGBtoYUV420p<_Tp, chs1, chs2, 2, 2>(src, dst); break;default: FBC_Error("Unknown/unsupported color conversion code"); break;};break;}default:FBC_Error("Unknown/unsupported color conversion code");}return 0;
}// computes cubic spline coefficients for a function: (xi=i, yi=f[i]), i=0..n
template<typename _Tp> static void splineBuild(const _Tp* f, int n, _Tp* tab)
{_Tp cn = 0;int i;tab[0] = tab[1] = (_Tp)0;for (i = 1; i < n - 1; i++) {_Tp t = 3 * (f[i + 1] - 2 * f[i] + f[i - 1]);_Tp l = 1 / (4 - tab[(i - 1) * 4]);tab[i * 4] = l; tab[i * 4 + 1] = (t - tab[(i - 1) * 4 + 1])*l;}for (i = n - 1; i >= 0; i--) {_Tp c = tab[i * 4 + 1] - tab[i * 4] * cn;_Tp b = f[i + 1] - f[i] - (cn + c * 2)*(_Tp)0.3333333333333333;_Tp d = (cn - c)*(_Tp)0.3333333333333333;tab[i * 4] = f[i]; tab[i * 4 + 1] = b;tab[i * 4 + 2] = c; tab[i * 4 + 3] = d;cn = c;}
}// interpolates value of a function at x, 0 <= x <= n using a cubic spline.
template<typename _Tp> static inline _Tp splineInterpolate(_Tp x, const _Tp* tab, int n)
{// don't touch this function without urgent need - some versions of gcc fail to inline it correctlyint ix = std::min(std::max(int(x), 0), n - 1);x -= ix;tab += ix * 4;return ((tab[3] * x + tab[2])*x + tab[1])*x + tab[0];
}template<typename _Tp> struct ColorChannel
{typedef float worktype_f;static _Tp max() { return std::numeric_limits<_Tp>::max(); }static _Tp half() { return (_Tp)(max() / 2 + 1); }
};template<> struct ColorChannel<float>
{typedef float worktype_f;static float max() { return 1.f; }static float half() { return 0.5f; }
};#undef R2Y
#undef G2Y
#undef B2Yenum
{yuv_shift = 14,xyz_shift = 12,R2Y = 4899,G2Y = 9617,B2Y = 1868,BLOCK_SIZE = 256
};template<typename _Tp> struct RGB2Gray
{typedef _Tp channel_type;RGB2Gray(int _srccn, int blueIdx, const float* _coeffs) : srccn(_srccn){static const float coeffs0[] = { 0.299f, 0.587f, 0.114f };memcpy(coeffs, _coeffs ? _coeffs : coeffs0, 3 * sizeof(coeffs[0]));if (blueIdx == 0)std::swap(coeffs[0], coeffs[2]);}void operator()(const _Tp* src, _Tp* dst, int n) const{int scn = srccn;float cb = coeffs[0], cg = coeffs[1], cr = coeffs[2];for (int i = 0; i < n; i++, src += scn)dst[i] = saturate_cast<_Tp>(src[0] * cb + src[1] * cg + src[2] * cr);}int srccn;float coeffs[3];
};template<> struct RGB2Gray<uchar>
{typedef uchar channel_type;RGB2Gray(int _srccn, int blueIdx, const int* coeffs) : srccn(_srccn){const int coeffs0[] = { R2Y, G2Y, B2Y };if (!coeffs) coeffs = coeffs0;int b = 0, g = 0, r = (1 << (yuv_shift - 1));int db = coeffs[blueIdx ^ 2], dg = coeffs[1], dr = coeffs[blueIdx];for (int i = 0; i < 256; i++, b += db, g += dg, r += dr) {tab[i] = b;tab[i + 256] = g;tab[i + 512] = r;}}void operator()(const uchar* src, uchar* dst, int n) const{int scn = srccn;const int* _tab = tab;for (int i = 0; i < n; i++, src += scn)dst[i] = (uchar)((_tab[src[0]] + _tab[src[1] + 256] + _tab[src[2] + 512]) >> yuv_shift);}int srccn;int tab[256 * 3];
};template<> struct RGB2Gray<ushort>
{typedef ushort channel_type;RGB2Gray(int _srccn, int blueIdx, const int* _coeffs) : srccn(_srccn){static const int coeffs0[] = { R2Y, G2Y, B2Y };memcpy(coeffs, _coeffs ? _coeffs : coeffs0, 3 * sizeof(coeffs[0]));if (blueIdx == 0)std::swap(coeffs[0], coeffs[2]);}void operator()(const ushort* src, ushort* dst, int n) const{int scn = srccn, cb = coeffs[0], cg = coeffs[1], cr = coeffs[2];for (int i = 0; i < n; i++, src += scn)dst[i] = (ushort)FBC_DESCALE((unsigned)(src[0] * cb + src[1] * cg + src[2] * cr), yuv_shift);}int srccn;int coeffs[3];
};template<typename _Tp>
struct Gray2RGB
{typedef _Tp channel_type;Gray2RGB(int _dstcn) : dstcn(_dstcn) {}void operator()(const _Tp* src, _Tp* dst, int n) const{if (dstcn == 3) {for (int i = 0; i < n; i++, dst += 3)dst[0] = dst[1] = dst[2] = src[i];} else {_Tp alpha = ColorChannel<_Tp>::max();for (int i = 0; i < n; i++, dst += 4) {dst[0] = dst[1] = dst[2] = src[i];dst[3] = alpha;}}}int dstcn;
};template<typename _Tp> struct RGB2YCrCb_f
{typedef _Tp channel_type;RGB2YCrCb_f(int _srccn, int _blueIdx, const float* _coeffs) : srccn(_srccn), blueIdx(_blueIdx){static const float coeffs0[] = { 0.299f, 0.587f, 0.114f, 0.713f, 0.564f };memcpy(coeffs, _coeffs ? _coeffs : coeffs0, 5 * sizeof(coeffs[0]));if (blueIdx == 0) std::swap(coeffs[0], coeffs[2]);}void operator()(const _Tp* src, _Tp* dst, int n) const{int scn = srccn, bidx = blueIdx;const _Tp delta = ColorChannel<_Tp>::half();float C0 = coeffs[0], C1 = coeffs[1], C2 = coeffs[2], C3 = coeffs[3], C4 = coeffs[4];n *= 3;for (int i = 0; i < n; i += 3, src += scn) {_Tp Y = saturate_cast<_Tp>(src[0] * C0 + src[1] * C1 + src[2] * C2);_Tp Cr = saturate_cast<_Tp>((src[bidx ^ 2] - Y)*C3 + delta);_Tp Cb = saturate_cast<_Tp>((src[bidx] - Y)*C4 + delta);dst[i] = Y; dst[i + 1] = Cr; dst[i + 2] = Cb;}}int srccn, blueIdx;float coeffs[5];
};template<typename _Tp> struct RGB2YCrCb_i
{typedef _Tp channel_type;RGB2YCrCb_i(int _srccn, int _blueIdx, const int* _coeffs) : srccn(_srccn), blueIdx(_blueIdx){static const int coeffs0[] = { R2Y, G2Y, B2Y, 11682, 9241 };memcpy(coeffs, _coeffs ? _coeffs : coeffs0, 5 * sizeof(coeffs[0]));if (blueIdx == 0) std::swap(coeffs[0], coeffs[2]);}void operator()(const _Tp* src, _Tp* dst, int n) const{int scn = srccn, bidx = blueIdx;int C0 = coeffs[0], C1 = coeffs[1], C2 = coeffs[2], C3 = coeffs[3], C4 = coeffs[4];int delta = ColorChannel<_Tp>::half()*(1 << yuv_shift);n *= 3;for (int i = 0; i < n; i += 3, src += scn) {int Y = FBC_DESCALE(src[0] * C0 + src[1] * C1 + src[2] * C2, yuv_shift);int Cr = FBC_DESCALE((src[bidx ^ 2] - Y)*C3 + delta, yuv_shift);int Cb = FBC_DESCALE((src[bidx] - Y)*C4 + delta, yuv_shift);dst[i] = saturate_cast<_Tp>(Y);dst[i + 1] = saturate_cast<_Tp>(Cr);dst[i + 2] = saturate_cast<_Tp>(Cb);}}int srccn, blueIdx;int coeffs[5];
};template<typename _Tp> struct YCrCb2RGB_f
{typedef _Tp channel_type;YCrCb2RGB_f(int _dstcn, int _blueIdx, const float* _coeffs): dstcn(_dstcn), blueIdx(_blueIdx){static const float coeffs0[] = { 1.403f, -0.714f, -0.344f, 1.773f };memcpy(coeffs, _coeffs ? _coeffs : coeffs0, 4 * sizeof(coeffs[0]));}void operator()(const _Tp* src, _Tp* dst, int n) const{int dcn = dstcn, bidx = blueIdx;const _Tp delta = ColorChannel<_Tp>::half(), alpha = ColorChannel<_Tp>::max();float C0 = coeffs[0], C1 = coeffs[1], C2 = coeffs[2], C3 = coeffs[3];n *= 3;for (int i = 0; i < n; i += 3, dst += dcn) {_Tp Y = src[i];_Tp Cr = src[i + 1];_Tp Cb = src[i + 2];_Tp b = saturate_cast<_Tp>(Y + (Cb - delta)*C3);_Tp g = saturate_cast<_Tp>(Y + (Cb - delta)*C2 + (Cr - delta)*C1);_Tp r = saturate_cast<_Tp>(Y + (Cr - delta)*C0);dst[bidx] = b; dst[1] = g; dst[bidx ^ 2] = r;if (dcn == 4)dst[3] = alpha;}}int dstcn, blueIdx;float coeffs[4];
};template<typename _Tp> struct YCrCb2RGB_i
{typedef _Tp channel_type;YCrCb2RGB_i(int _dstcn, int _blueIdx, const int* _coeffs): dstcn(_dstcn), blueIdx(_blueIdx){static const int coeffs0[] = { 22987, -11698, -5636, 29049 };memcpy(coeffs, _coeffs ? _coeffs : coeffs0, 4 * sizeof(coeffs[0]));}void operator()(const _Tp* src, _Tp* dst, int n) const{int dcn = dstcn, bidx = blueIdx;const _Tp delta = ColorChannel<_Tp>::half(), alpha = ColorChannel<_Tp>::max();int C0 = coeffs[0], C1 = coeffs[1], C2 = coeffs[2], C3 = coeffs[3];n *= 3;for (int i = 0; i < n; i += 3, dst += dcn) {_Tp Y = src[i];_Tp Cr = src[i + 1];_Tp Cb = src[i + 2];int b = Y + FBC_DESCALE((Cb - delta)*C3, yuv_shift);int g = Y + FBC_DESCALE((Cb - delta)*C2 + (Cr - delta)*C1, yuv_shift);int r = Y + FBC_DESCALE((Cr - delta)*C0, yuv_shift);dst[bidx] = saturate_cast<_Tp>(b);dst[1] = saturate_cast<_Tp>(g);dst[bidx ^ 2] = saturate_cast<_Tp>(r);if (dcn == 4)dst[3] = alpha;}}int dstcn, blueIdx;int coeffs[4];
};static const float sRGB2XYZ_D65[] =
{0.412453f, 0.357580f, 0.180423f,0.212671f, 0.715160f, 0.072169f,0.019334f, 0.119193f, 0.950227f
};static const float XYZ2sRGB_D65[] =
{3.240479f, -1.53715f, -0.498535f,-0.969256f, 1.875991f, 0.041556f,0.055648f, -0.204043f, 1.057311f
};template<typename _Tp> struct RGB2XYZ_f
{typedef _Tp channel_type;RGB2XYZ_f(int _srccn, int blueIdx, const float* _coeffs) : srccn(_srccn){memcpy(coeffs, _coeffs ? _coeffs : sRGB2XYZ_D65, 9 * sizeof(coeffs[0]));if (blueIdx == 0) {std::swap(coeffs[0], coeffs[2]);std::swap(coeffs[3], coeffs[5]);std::swap(coeffs[6], coeffs[8]);}}void operator()(const _Tp* src, _Tp* dst, int n) const{int scn = srccn;float C0 = coeffs[0], C1 = coeffs[1], C2 = coeffs[2],C3 = coeffs[3], C4 = coeffs[4], C5 = coeffs[5],C6 = coeffs[6], C7 = coeffs[7], C8 = coeffs[8];n *= 3;for (int i = 0; i < n; i += 3, src += scn) {_Tp X = saturate_cast<_Tp>(src[0] * C0 + src[1] * C1 + src[2] * C2);_Tp Y = saturate_cast<_Tp>(src[0] * C3 + src[1] * C4 + src[2] * C5);_Tp Z = saturate_cast<_Tp>(src[0] * C6 + src[1] * C7 + src[2] * C8);dst[i] = X; dst[i + 1] = Y; dst[i + 2] = Z;}}int srccn;float coeffs[9];
};template<typename _Tp> struct RGB2XYZ_i
{typedef _Tp channel_type;RGB2XYZ_i(int _srccn, int blueIdx, const float* _coeffs) : srccn(_srccn){static const int coeffs0[] = {1689, 1465, 739,871, 2929, 296,79, 488, 3892};for (int i = 0; i < 9; i++)coeffs[i] = _coeffs ? cvRound(_coeffs[i] * (1 << xyz_shift)) : coeffs0[i];if (blueIdx == 0) {std::swap(coeffs[0], coeffs[2]);std::swap(coeffs[3], coeffs[5]);std::swap(coeffs[6], coeffs[8]);}}void operator()(const _Tp* src, _Tp* dst, int n) const{int scn = srccn;int C0 = coeffs[0], C1 = coeffs[1], C2 = coeffs[2],C3 = coeffs[3], C4 = coeffs[4], C5 = coeffs[5],C6 = coeffs[6], C7 = coeffs[7], C8 = coeffs[8];n *= 3;for (int i = 0; i < n; i += 3, src += scn) {int X = FBC_DESCALE(src[0] * C0 + src[1] * C1 + src[2] * C2, xyz_shift);int Y = FBC_DESCALE(src[0] * C3 + src[1] * C4 + src[2] * C5, xyz_shift);int Z = FBC_DESCALE(src[0] * C6 + src[1] * C7 + src[2] * C8, xyz_shift);dst[i] = saturate_cast<_Tp>(X); dst[i + 1] = saturate_cast<_Tp>(Y);dst[i + 2] = saturate_cast<_Tp>(Z);}}int srccn;int coeffs[9];
};template<typename _Tp> struct XYZ2RGB_f
{typedef _Tp channel_type;XYZ2RGB_f(int _dstcn, int _blueIdx, const float* _coeffs) : dstcn(_dstcn), blueIdx(_blueIdx){memcpy(coeffs, _coeffs ? _coeffs : XYZ2sRGB_D65, 9 * sizeof(coeffs[0]));if (blueIdx == 0) {std::swap(coeffs[0], coeffs[6]);std::swap(coeffs[1], coeffs[7]);std::swap(coeffs[2], coeffs[8]);}}void operator()(const _Tp* src, _Tp* dst, int n) const{int dcn = dstcn;_Tp alpha = ColorChannel<_Tp>::max();float C0 = coeffs[0], C1 = coeffs[1], C2 = coeffs[2],C3 = coeffs[3], C4 = coeffs[4], C5 = coeffs[5],C6 = coeffs[6], C7 = coeffs[7], C8 = coeffs[8];n *= 3;for (int i = 0; i < n; i += 3, dst += dcn) {_Tp B = saturate_cast<_Tp>(src[i] * C0 + src[i + 1] * C1 + src[i + 2] * C2);_Tp G = saturate_cast<_Tp>(src[i] * C3 + src[i + 1] * C4 + src[i + 2] * C5);_Tp R = saturate_cast<_Tp>(src[i] * C6 + src[i + 1] * C7 + src[i + 2] * C8);dst[0] = B; dst[1] = G; dst[2] = R;if (dcn == 4)dst[3] = alpha;}}int dstcn, blueIdx;float coeffs[9];
};template<typename _Tp> struct XYZ2RGB_i
{typedef _Tp channel_type;XYZ2RGB_i(int _dstcn, int _blueIdx, const int* _coeffs): dstcn(_dstcn), blueIdx(_blueIdx){static const int coeffs0[] = {13273, -6296, -2042,-3970, 7684, 170,228, -836, 4331};for (int i = 0; i < 9; i++)coeffs[i] = _coeffs ? cvRound(_coeffs[i] * (1 << xyz_shift)) : coeffs0[i];if (blueIdx == 0) {std::swap(coeffs[0], coeffs[6]);std::swap(coeffs[1], coeffs[7]);std::swap(coeffs[2], coeffs[8]);}}void operator()(const _Tp* src, _Tp* dst, int n) const{int dcn = dstcn;_Tp alpha = ColorChannel<_Tp>::max();int C0 = coeffs[0], C1 = coeffs[1], C2 = coeffs[2],C3 = coeffs[3], C4 = coeffs[4], C5 = coeffs[5],C6 = coeffs[6], C7 = coeffs[7], C8 = coeffs[8];n *= 3;for (int i = 0; i < n; i += 3, dst += dcn) {int B = FBC_DESCALE(src[i] * C0 + src[i + 1] * C1 + src[i + 2] * C2, xyz_shift);int G = FBC_DESCALE(src[i] * C3 + src[i + 1] * C4 + src[i + 2] * C5, xyz_shift);int R = FBC_DESCALE(src[i] * C6 + src[i + 1] * C7 + src[i + 2] * C8, xyz_shift);dst[0] = saturate_cast<_Tp>(B); dst[1] = saturate_cast<_Tp>(G);dst[2] = saturate_cast<_Tp>(R);if (dcn == 4)dst[3] = alpha;}}int dstcn, blueIdx;int coeffs[9];
};struct RGB2HSV_b
{typedef uchar channel_type;RGB2HSV_b(int _srccn, int _blueIdx, int _hrange) : srccn(_srccn), blueIdx(_blueIdx), hrange(_hrange){FBC_Assert(hrange == 180 || hrange == 256);}void operator()(const uchar* src, uchar* dst, int n) const{int i, bidx = blueIdx, scn = srccn;const int hsv_shift = 12;static int sdiv_table[256];static int hdiv_table180[256];static int hdiv_table256[256];static volatile bool initialized = false;int hr = hrange;const int* hdiv_table = hr == 180 ? hdiv_table180 : hdiv_table256;n *= 3;if (!initialized) {sdiv_table[0] = hdiv_table180[0] = hdiv_table256[0] = 0;for (i = 1; i < 256; i++) {sdiv_table[i] = saturate_cast<int>((255 << hsv_shift) / (1.*i));hdiv_table180[i] = saturate_cast<int>((180 << hsv_shift) / (6.*i));hdiv_table256[i] = saturate_cast<int>((256 << hsv_shift) / (6.*i));}initialized = true;}for (i = 0; i < n; i += 3, src += scn) {int b = src[bidx], g = src[1], r = src[bidx ^ 2];int h, s, v = b;int vmin = b, diff;int vr, vg;FBC_CALC_MAX_8U(v, g);FBC_CALC_MAX_8U(v, r);FBC_CALC_MIN_8U(vmin, g);FBC_CALC_MIN_8U(vmin, r);diff = v - vmin;vr = v == r ? -1 : 0;vg = v == g ? -1 : 0;s = (diff * sdiv_table[v] + (1 << (hsv_shift - 1))) >> hsv_shift;h = (vr & (g - b)) + (~vr & ((vg & (b - r + 2 * diff)) + ((~vg) & (r - g + 4 * diff))));h = (h * hdiv_table[diff] + (1 << (hsv_shift - 1))) >> hsv_shift;h += h < 0 ? hr : 0;dst[i] = saturate_cast<uchar>(h);dst[i + 1] = (uchar)s;dst[i + 2] = (uchar)v;}}int srccn, blueIdx, hrange;
};struct RGB2HSV_f
{typedef float channel_type;RGB2HSV_f(int _srccn, int _blueIdx, float _hrange) : srccn(_srccn), blueIdx(_blueIdx), hrange(_hrange) {}void operator()(const float* src, float* dst, int n) const{int i, bidx = blueIdx, scn = srccn;float hscale = hrange*(1.f / 360.f);n *= 3;for (i = 0; i < n; i += 3, src += scn) {float b = src[bidx], g = src[1], r = src[bidx ^ 2];float h, s, v;float vmin, diff;v = vmin = r;if (v < g) v = g;if (v < b) v = b;if (vmin > g) vmin = g;if (vmin > b) vmin = b;diff = v - vmin;s = diff / (float)(fabs(v) + FLT_EPSILON);diff = (float)(60. / (diff + FLT_EPSILON));if (v == r)h = (g - b)*diff;else if (v == g)h = (b - r)*diff + 120.f;elseh = (r - g)*diff + 240.f;if (h < 0) h += 360.f;dst[i] = h*hscale;dst[i + 1] = s;dst[i + 2] = v;}}int srccn, blueIdx;float hrange;
};struct RGB2HLS_f
{typedef float channel_type;RGB2HLS_f(int _srccn, int _blueIdx, float _hrange) : srccn(_srccn), blueIdx(_blueIdx), hrange(_hrange) {}void operator()(const float* src, float* dst, int n) const{int i, bidx = blueIdx, scn = srccn;float hscale = hrange*(1.f / 360.f);n *= 3;for (i = 0; i < n; i += 3, src += scn) {float b = src[bidx], g = src[1], r = src[bidx ^ 2];float h = 0.f, s = 0.f, l;float vmin, vmax, diff;vmax = vmin = r;if (vmax < g) vmax = g;if (vmax < b) vmax = b;if (vmin > g) vmin = g;if (vmin > b) vmin = b;diff = vmax - vmin;l = (vmax + vmin)*0.5f;if (diff > FLT_EPSILON) {s = l < 0.5f ? diff / (vmax + vmin) : diff / (2 - vmax - vmin);diff = 60.f / diff;if (vmax == r)h = (g - b)*diff;else if (vmax == g)h = (b - r)*diff + 120.f;elseh = (r - g)*diff + 240.f;if (h < 0.f) h += 360.f;}dst[i] = h*hscale;dst[i + 1] = l;dst[i + 2] = s;}}int srccn, blueIdx;float hrange;
};struct RGB2HLS_b
{typedef uchar channel_type;RGB2HLS_b(int _srccn, int _blueIdx, int _hrange) : srccn(_srccn), cvt(3, _blueIdx, (float)_hrange) { }void operator()(const uchar* src, uchar* dst, int n) const{int i, j, scn = srccn;float FBC_DECL_ALIGNED(16) buf[3 * BLOCK_SIZE];for (i = 0; i < n; i += BLOCK_SIZE, dst += BLOCK_SIZE * 3) {int dn = std::min(n - i, (int)BLOCK_SIZE);j = 0;for (; j < dn * 3; j += 3, src += scn) {buf[j] = src[0] * (1.f / 255.f);buf[j + 1] = src[1] * (1.f / 255.f);buf[j + 2] = src[2] * (1.f / 255.f);}cvt(buf, buf, dn);j = 0;for (; j < dn * 3; j += 3) {dst[j] = saturate_cast<uchar>(buf[j]);dst[j + 1] = saturate_cast<uchar>(buf[j + 1] * 255.f);dst[j + 2] = saturate_cast<uchar>(buf[j + 2] * 255.f);}}}int srccn;RGB2HLS_f cvt;
};struct HSV2RGB_f
{typedef float channel_type;HSV2RGB_f(int _dstcn, int _blueIdx, float _hrange): dstcn(_dstcn), blueIdx(_blueIdx), hscale(6.f / _hrange) {}void operator()(const float* src, float* dst, int n) const{int i, bidx = blueIdx, dcn = dstcn;float _hscale = hscale;float alpha = ColorChannel<float>::max();n *= 3;for (i = 0; i < n; i += 3, dst += dcn) {float h = src[i], s = src[i + 1], v = src[i + 2];float b, g, r;if (s == 0)b = g = r = v;else {static const int sector_data[][3] ={ { 1, 3, 0 }, { 1, 0, 2 }, { 3, 0, 1 }, { 0, 2, 1 }, { 0, 1, 3 }, { 2, 1, 0 } };float tab[4];int sector;h *= _hscale;if (h < 0)do h += 6; while (h < 0);else if (h >= 6)do h -= 6; while (h >= 6);sector = fbcFloor(h);h -= sector;if ((unsigned)sector >= 6u) {sector = 0;h = 0.f;}tab[0] = v;tab[1] = v*(1.f - s);tab[2] = v*(1.f - s*h);tab[3] = v*(1.f - s*(1.f - h));b = tab[sector_data[sector][0]];g = tab[sector_data[sector][1]];r = tab[sector_data[sector][2]];}dst[bidx] = b;dst[1] = g;dst[bidx ^ 2] = r;if (dcn == 4)dst[3] = alpha;}}int dstcn, blueIdx;float hscale;
};struct HSV2RGB_b
{typedef uchar channel_type;HSV2RGB_b(int _dstcn, int _blueIdx, int _hrange) : dstcn(_dstcn), cvt(3, _blueIdx, (float)_hrange) {}void operator()(const uchar* src, uchar* dst, int n) const{int i, j, dcn = dstcn;uchar alpha = ColorChannel<uchar>::max();float FBC_DECL_ALIGNED(16) buf[3 * BLOCK_SIZE];for (i = 0; i < n; i += BLOCK_SIZE, src += BLOCK_SIZE * 3) {int dn = std::min(n - i, (int)BLOCK_SIZE);j = 0;for (; j < dn * 3; j += 3) {buf[j] = src[j];buf[j + 1] = src[j + 1] * (1.f / 255.f);buf[j + 2] = src[j + 2] * (1.f / 255.f);}cvt(buf, buf, dn);j = 0;for (; j < dn * 3; j += 3, dst += dcn) {dst[0] = saturate_cast<uchar>(buf[j] * 255.f);dst[1] = saturate_cast<uchar>(buf[j + 1] * 255.f);dst[2] = saturate_cast<uchar>(buf[j + 2] * 255.f);if (dcn == 4)dst[3] = alpha;}}}int dstcn;HSV2RGB_f cvt;
};struct HLS2RGB_f
{typedef float channel_type;HLS2RGB_f(int _dstcn, int _blueIdx, float _hrange) : dstcn(_dstcn), blueIdx(_blueIdx), hscale(6.f / _hrange) {}void operator()(const float* src, float* dst, int n) const{int i, bidx = blueIdx, dcn = dstcn;float _hscale = hscale;float alpha = ColorChannel<float>::max();n *= 3;for (i = 0; i < n; i += 3, dst += dcn) {float h = src[i], l = src[i + 1], s = src[i + 2];float b, g, r;if (s == 0)b = g = r = l;else {static const int sector_data[][3] ={ { 1, 3, 0 }, { 1, 0, 2 }, { 3, 0, 1 }, { 0, 2, 1 }, { 0, 1, 3 }, { 2, 1, 0 } };float tab[4];int sector;float p2 = l <= 0.5f ? l*(1 + s) : l + s - l*s;float p1 = 2 * l - p2;h *= _hscale;if (h < 0)do h += 6; while (h < 0);else if (h >= 6)do h -= 6; while (h >= 6);assert(0 <= h && h < 6);sector = fbcFloor(h);h -= sector;tab[0] = p2;tab[1] = p1;tab[2] = p1 + (p2 - p1)*(1 - h);tab[3] = p1 + (p2 - p1)*h;b = tab[sector_data[sector][0]];g = tab[sector_data[sector][1]];r = tab[sector_data[sector][2]];}dst[bidx] = b;dst[1] = g;dst[bidx ^ 2] = r;if (dcn == 4)dst[3] = alpha;}}int dstcn, blueIdx;float hscale;
};struct HLS2RGB_b
{typedef uchar channel_type;HLS2RGB_b(int _dstcn, int _blueIdx, int _hrange) : dstcn(_dstcn), cvt(3, _blueIdx, (float)_hrange) { }void operator()(const uchar* src, uchar* dst, int n) const{int i, j, dcn = dstcn;uchar alpha = ColorChannel<uchar>::max();float FBC_DECL_ALIGNED(16) buf[3 * BLOCK_SIZE];for (i = 0; i < n; i += BLOCK_SIZE, src += BLOCK_SIZE * 3) {int dn = std::min(n - i, (int)BLOCK_SIZE);j = 0;for (; j < dn * 3; j += 3) {buf[j] = src[j];buf[j + 1] = src[j + 1] * (1.f / 255.f);buf[j + 2] = src[j + 2] * (1.f / 255.f);}cvt(buf, buf, dn);j = 0;for (; j < dn * 3; j += 3, dst += dcn) {dst[0] = saturate_cast<uchar>(buf[j] * 255.f);dst[1] = saturate_cast<uchar>(buf[j + 1] * 255.f);dst[2] = saturate_cast<uchar>(buf[j + 2] * 255.f);if (dcn == 4)dst[3] = alpha;}}}int dstcn;HLS2RGB_f cvt;
};static const float D65[] = { 0.950456f, 1.f, 1.088754f };enum { LAB_CBRT_TAB_SIZE = 1024, GAMMA_TAB_SIZE = 1024 };
static float LabCbrtTab[LAB_CBRT_TAB_SIZE * 4];
static const float LabCbrtTabScale = LAB_CBRT_TAB_SIZE / 1.5f;static float sRGBGammaTab[GAMMA_TAB_SIZE * 4], sRGBInvGammaTab[GAMMA_TAB_SIZE * 4];
static const float GammaTabScale = (float)GAMMA_TAB_SIZE;static ushort sRGBGammaTab_b[256], linearGammaTab_b[256];
#undef lab_shift
#define lab_shift xyz_shift
#define gamma_shift 3
#define lab_shift2 (lab_shift + gamma_shift)
#define LAB_CBRT_TAB_SIZE_B (256*3/2*(1<<gamma_shift))
static ushort LabCbrtTab_b[LAB_CBRT_TAB_SIZE_B];static void initLabTabs()
{static bool initialized = false;if (!initialized) {float f[LAB_CBRT_TAB_SIZE + 1], g[GAMMA_TAB_SIZE + 1], ig[GAMMA_TAB_SIZE + 1], scale = 1.f / LabCbrtTabScale;int i;for (i = 0; i <= LAB_CBRT_TAB_SIZE; i++) {float x = i*scale;f[i] = x < 0.008856f ? x*7.787f + 0.13793103448275862f : fbcCbrt(x);}splineBuild(f, LAB_CBRT_TAB_SIZE, LabCbrtTab);scale = 1.f / GammaTabScale;for (i = 0; i <= GAMMA_TAB_SIZE; i++) {float x = i*scale;g[i] = x <= 0.04045f ? x*(1.f / 12.92f) : (float)std::pow((double)(x + 0.055)*(1. / 1.055), 2.4);ig[i] = x <= 0.0031308 ? x*12.92f : (float)(1.055*std::pow((double)x, 1. / 2.4) - 0.055);}splineBuild(g, GAMMA_TAB_SIZE, sRGBGammaTab);splineBuild(ig, GAMMA_TAB_SIZE, sRGBInvGammaTab);for (i = 0; i < 256; i++) {float x = i*(1.f / 255.f);sRGBGammaTab_b[i] = saturate_cast<ushort>(255.f*(1 << gamma_shift)*(x <= 0.04045f ? x*(1.f / 12.92f) : (float)std::pow((double)(x + 0.055)*(1. / 1.055), 2.4)));linearGammaTab_b[i] = (ushort)(i*(1 << gamma_shift));}for (i = 0; i < LAB_CBRT_TAB_SIZE_B; i++) {float x = i*(1.f / (255.f*(1 << gamma_shift)));LabCbrtTab_b[i] = saturate_cast<ushort>((1 << lab_shift2)*(x < 0.008856f ? x*7.787f + 0.13793103448275862f : fbcCbrt(x)));}initialized = true;}
}struct RGB2Lab_b
{typedef uchar channel_type;RGB2Lab_b(int _srccn, int blueIdx, const float* _coeffs, const float* _whitept, bool _srgb) : srccn(_srccn), srgb(_srgb){static volatile int _3 = 3;initLabTabs();if (!_coeffs)_coeffs = sRGB2XYZ_D65;if (!_whitept)_whitept = D65;float scale[] = {(1 << lab_shift) / _whitept[0],(float)(1 << lab_shift),(1 << lab_shift) / _whitept[2]};for (int i = 0; i < _3; i++) {coeffs[i * 3 + (blueIdx ^ 2)] = fbcRound(_coeffs[i * 3] * scale[i]);coeffs[i * 3 + 1] = fbcRound(_coeffs[i * 3 + 1] * scale[i]);coeffs[i * 3 + blueIdx] = fbcRound(_coeffs[i * 3 + 2] * scale[i]);FBC_Assert(coeffs[i] >= 0 && coeffs[i * 3 + 1] >= 0 && coeffs[i * 3 + 2] >= 0 &&coeffs[i * 3] + coeffs[i * 3 + 1] + coeffs[i * 3 + 2] < 2 * (1 << lab_shift));}}void operator()(const uchar* src, uchar* dst, int n) const{const int Lscale = (116 * 255 + 50) / 100;const int Lshift = -((16 * 255 * (1 << lab_shift2) + 50) / 100);const ushort* tab = srgb ? sRGBGammaTab_b : linearGammaTab_b;int i, scn = srccn;int C0 = coeffs[0], C1 = coeffs[1], C2 = coeffs[2],C3 = coeffs[3], C4 = coeffs[4], C5 = coeffs[5],C6 = coeffs[6], C7 = coeffs[7], C8 = coeffs[8];n *= 3;for (i = 0; i < n; i += 3, src += scn) {int R = tab[src[0]], G = tab[src[1]], B = tab[src[2]];int fX = LabCbrtTab_b[FBC_DESCALE(R*C0 + G*C1 + B*C2, lab_shift)];int fY = LabCbrtTab_b[FBC_DESCALE(R*C3 + G*C4 + B*C5, lab_shift)];int fZ = LabCbrtTab_b[FBC_DESCALE(R*C6 + G*C7 + B*C8, lab_shift)];int L = FBC_DESCALE(Lscale*fY + Lshift, lab_shift2);int a = FBC_DESCALE(500 * (fX - fY) + 128 * (1 << lab_shift2), lab_shift2);int b = FBC_DESCALE(200 * (fY - fZ) + 128 * (1 << lab_shift2), lab_shift2);dst[i] = saturate_cast<uchar>(L);dst[i + 1] = saturate_cast<uchar>(a);dst[i + 2] = saturate_cast<uchar>(b);}}int srccn;int coeffs[9];bool srgb;
};template<typename _Tp> static _Tp clip(_Tp value)
{return value < 0.0f ? 0.0f : value > 1.0f ? 1.0f : value;
}struct RGB2Lab_f
{typedef float channel_type;RGB2Lab_f(int _srccn, int blueIdx, const float* _coeffs, const float* _whitept, bool _srgb) : srccn(_srccn), srgb(_srgb){volatile int _3 = 3;initLabTabs();if (!_coeffs)_coeffs = sRGB2XYZ_D65;if (!_whitept)_whitept = D65;float scale[] = { 1.0f / _whitept[0], 1.0f, 1.0f / _whitept[2] };for (int i = 0; i < _3; i++) {int j = i * 3;coeffs[j + (blueIdx ^ 2)] = _coeffs[j] * scale[i];coeffs[j + 1] = _coeffs[j + 1] * scale[i];coeffs[j + blueIdx] = _coeffs[j + 2] * scale[i];FBC_Assert(coeffs[j] >= 0 && coeffs[j + 1] >= 0 && coeffs[j + 2] >= 0 &&coeffs[j] + coeffs[j + 1] + coeffs[j + 2] < 1.5f*LabCbrtTabScale);}}void operator()(const float* src, float* dst, int n) const{int i, scn = srccn;float gscale = GammaTabScale;const float* gammaTab = srgb ? sRGBGammaTab : 0;float C0 = coeffs[0], C1 = coeffs[1], C2 = coeffs[2],C3 = coeffs[3], C4 = coeffs[4], C5 = coeffs[5],C6 = coeffs[6], C7 = coeffs[7], C8 = coeffs[8];n *= 3;static const float _1_3 = 1.0f / 3.0f;static const float _a = 16.0f / 116.0f;for (i = 0; i < n; i += 3, src += scn) {float R = clip<float>(src[0]);float G = clip<float>(src[1]);float B = clip<float>(src[2]);if (gammaTab) {R = splineInterpolate(R * gscale, gammaTab, GAMMA_TAB_SIZE);G = splineInterpolate(G * gscale, gammaTab, GAMMA_TAB_SIZE);B = splineInterpolate(B * gscale, gammaTab, GAMMA_TAB_SIZE);}float X = R*C0 + G*C1 + B*C2;float Y = R*C3 + G*C4 + B*C5;float Z = R*C6 + G*C7 + B*C8;float FX = X > 0.008856f ? std::pow(X, _1_3) : (7.787f * X + _a);float FY = Y > 0.008856f ? std::pow(Y, _1_3) : (7.787f * Y + _a);float FZ = Z > 0.008856f ? std::pow(Z, _1_3) : (7.787f * Z + _a);float L = Y > 0.008856f ? (116.f * FY - 16.f) : (903.3f * Y);float a = 500.f * (FX - FY);float b = 200.f * (FY - FZ);dst[i] = L;dst[i + 1] = a;dst[i + 2] = b;}}int srccn;float coeffs[9];bool srgb;
};struct RGB2Luv_f
{typedef float channel_type;RGB2Luv_f(int _srccn, int blueIdx, const float* _coeffs, const float* whitept, bool _srgb) : srccn(_srccn), srgb(_srgb){volatile int i;initLabTabs();if (!_coeffs) _coeffs = sRGB2XYZ_D65;if (!whitept) whitept = D65;for (i = 0; i < 3; i++) {coeffs[i * 3] = _coeffs[i * 3];coeffs[i * 3 + 1] = _coeffs[i * 3 + 1];coeffs[i * 3 + 2] = _coeffs[i * 3 + 2];if (blueIdx == 0)std::swap(coeffs[i * 3], coeffs[i * 3 + 2]);FBC_Assert(coeffs[i * 3] >= 0 && coeffs[i * 3 + 1] >= 0 && coeffs[i * 3 + 2] >= 0 &&coeffs[i * 3] + coeffs[i * 3 + 1] + coeffs[i * 3 + 2] < 1.5f);}float d = 1.f / (whitept[0] + whitept[1] * 15 + whitept[2] * 3);un = 4 * whitept[0] * d;vn = 9 * whitept[1] * d;FBC_Assert(whitept[1] == 1.f);}void operator()(const float* src, float* dst, int n) const{int i, scn = srccn;float gscale = GammaTabScale;const float* gammaTab = srgb ? sRGBGammaTab : 0;float C0 = coeffs[0], C1 = coeffs[1], C2 = coeffs[2],C3 = coeffs[3], C4 = coeffs[4], C5 = coeffs[5],C6 = coeffs[6], C7 = coeffs[7], C8 = coeffs[8];float _un = 13 * un, _vn = 13 * vn;n *= 3;for (i = 0; i < n; i += 3, src += scn) {float R = src[0], G = src[1], B = src[2];if (gammaTab) {R = splineInterpolate(R*gscale, gammaTab, GAMMA_TAB_SIZE);G = splineInterpolate(G*gscale, gammaTab, GAMMA_TAB_SIZE);B = splineInterpolate(B*gscale, gammaTab, GAMMA_TAB_SIZE);}float X = R*C0 + G*C1 + B*C2;float Y = R*C3 + G*C4 + B*C5;float Z = R*C6 + G*C7 + B*C8;float L = splineInterpolate(Y*LabCbrtTabScale, LabCbrtTab, LAB_CBRT_TAB_SIZE);L = 116.f*L - 16.f;float d = (4 * 13) / std::max(X + 15 * Y + 3 * Z, FLT_EPSILON);float u = L*(X*d - _un);float v = L*((9 * 0.25f)*Y*d - _vn);dst[i] = L; dst[i + 1] = u; dst[i + 2] = v;}}int srccn;float coeffs[9], un, vn;bool srgb;
};struct RGB2Luv_b
{typedef uchar channel_type;RGB2Luv_b(int _srccn, int blueIdx, const float* _coeffs, const float* _whitept, bool _srgb): srccn(_srccn), cvt(3, blueIdx, _coeffs, _whitept, _srgb) { }void operator()(const uchar* src, uchar* dst, int n) const{int i, j, scn = srccn;float FBC_DECL_ALIGNED(16) buf[3 * BLOCK_SIZE];for (i = 0; i < n; i += BLOCK_SIZE, dst += BLOCK_SIZE * 3) {int dn = std::min(n - i, (int)BLOCK_SIZE);j = 0;for (; j < dn * 3; j += 3, src += scn) {buf[j] = src[0] * (1.f / 255.f);buf[j + 1] = (float)(src[1] * (1.f / 255.f));buf[j + 2] = (float)(src[2] * (1.f / 255.f));}cvt(buf, buf, dn);j = 0;for (; j < dn * 3; j += 3) {dst[j] = saturate_cast<uchar>(buf[j] * 2.55f);dst[j + 1] = saturate_cast<uchar>(buf[j + 1] * 0.72033898305084743f + 96.525423728813564f);dst[j + 2] = saturate_cast<uchar>(buf[j + 2] * 0.9732824427480916f + 136.259541984732824f);}}}int srccn;RGB2Luv_f cvt;
};struct Lab2RGB_f
{typedef float channel_type;Lab2RGB_f(int _dstcn, int blueIdx, const float* _coeffs, const float* _whitept, bool _srgb) : dstcn(_dstcn), srgb(_srgb){initLabTabs();if (!_coeffs)_coeffs = XYZ2sRGB_D65;if (!_whitept)_whitept = D65;for (int i = 0; i < 3; i++) {coeffs[i + (blueIdx ^ 2) * 3] = _coeffs[i] * _whitept[i];coeffs[i + 3] = _coeffs[i + 3] * _whitept[i];coeffs[i + blueIdx * 3] = _coeffs[i + 6] * _whitept[i];}}void operator()(const float* src, float* dst, int n) const{int i, dcn = dstcn;const float* gammaTab = srgb ? sRGBInvGammaTab : 0;float gscale = GammaTabScale;float C0 = coeffs[0], C1 = coeffs[1], C2 = coeffs[2],C3 = coeffs[3], C4 = coeffs[4], C5 = coeffs[5],C6 = coeffs[6], C7 = coeffs[7], C8 = coeffs[8];float alpha = ColorChannel<float>::max();n *= 3;static const float lThresh = 0.008856f * 903.3f;static const float fThresh = 7.787f * 0.008856f + 16.0f / 116.0f;for (i = 0; i < n; i += 3, dst += dcn) {float li = src[i];float ai = src[i + 1];float bi = src[i + 2];float y, fy;if (li <= lThresh) {y = li / 903.3f;fy = 7.787f * y + 16.0f / 116.0f;} else {fy = (li + 16.0f) / 116.0f;y = fy * fy * fy;}float fxz[] = { ai / 500.0f + fy, fy - bi / 200.0f };for (int j = 0; j < 2; j++)if (fxz[j] <= fThresh)fxz[j] = (fxz[j] - 16.0f / 116.0f) / 7.787f;elsefxz[j] = fxz[j] * fxz[j] * fxz[j];float x = fxz[0], z = fxz[1];float ro = C0 * x + C1 * y + C2 * z;float go = C3 * x + C4 * y + C5 * z;float bo = C6 * x + C7 * y + C8 * z;ro = clip(ro);go = clip(go);bo = clip(bo);if (gammaTab) {ro = splineInterpolate(ro * gscale, gammaTab, GAMMA_TAB_SIZE);go = splineInterpolate(go * gscale, gammaTab, GAMMA_TAB_SIZE);bo = splineInterpolate(bo * gscale, gammaTab, GAMMA_TAB_SIZE);}dst[0] = ro, dst[1] = go, dst[2] = bo;if (dcn == 4)dst[3] = alpha;}}int dstcn;float coeffs[9];bool srgb;
};struct Lab2RGB_b
{typedef uchar channel_type;Lab2RGB_b(int _dstcn, int blueIdx, const float* _coeffs, const float* _whitept, bool _srgb): dstcn(_dstcn), cvt(3, blueIdx, _coeffs, _whitept, _srgb) { }void operator()(const uchar* src, uchar* dst, int n) const{int i, j, dcn = dstcn;uchar alpha = ColorChannel<uchar>::max();float FBC_DECL_ALIGNED(16) buf[3 * BLOCK_SIZE];for (i = 0; i < n; i += BLOCK_SIZE, src += BLOCK_SIZE * 3){int dn = std::min(n - i, (int)BLOCK_SIZE);j = 0;for (; j < dn * 3; j += 3) {buf[j] = src[j] * (100.f / 255.f);buf[j + 1] = (float)(src[j + 1] - 128);buf[j + 2] = (float)(src[j + 2] - 128);}cvt(buf, buf, dn);j = 0;for (; j < dn * 3; j += 3, dst += dcn) {dst[0] = saturate_cast<uchar>(buf[j] * 255.f);dst[1] = saturate_cast<uchar>(buf[j + 1] * 255.f);dst[2] = saturate_cast<uchar>(buf[j + 2] * 255.f);if (dcn == 4)dst[3] = alpha;}}}int dstcn;Lab2RGB_f cvt;
};struct Luv2RGB_f
{typedef float channel_type;Luv2RGB_f(int _dstcn, int blueIdx, const float* _coeffs, const float* whitept, bool _srgb) : dstcn(_dstcn), srgb(_srgb){initLabTabs();if (!_coeffs) _coeffs = XYZ2sRGB_D65;if (!whitept) whitept = D65;for (int i = 0; i < 3; i++) {coeffs[i + (blueIdx ^ 2) * 3] = _coeffs[i];coeffs[i + 3] = _coeffs[i + 3];coeffs[i + blueIdx * 3] = _coeffs[i + 6];}float d = 1.f / (whitept[0] + whitept[1] * 15 + whitept[2] * 3);un = 4 * whitept[0] * d;vn = 9 * whitept[1] * d;FBC_Assert(whitept[1] == 1.f);}void operator()(const float* src, float* dst, int n) const{int i, dcn = dstcn;const float* gammaTab = srgb ? sRGBInvGammaTab : 0;float gscale = GammaTabScale;float C0 = coeffs[0], C1 = coeffs[1], C2 = coeffs[2],C3 = coeffs[3], C4 = coeffs[4], C5 = coeffs[5],C6 = coeffs[6], C7 = coeffs[7], C8 = coeffs[8];float alpha = ColorChannel<float>::max();float _un = un, _vn = vn;n *= 3;for (i = 0; i < n; i += 3, dst += dcn) {float L = src[i], u = src[i + 1], v = src[i + 2], d, X, Y, Z;Y = (L + 16.f) * (1.f / 116.f);Y = Y*Y*Y;d = (1.f / 13.f) / L;u = u*d + _un;v = v*d + _vn;float iv = 1.f / v;X = 2.25f * u * Y * iv;Z = (12 - 3 * u - 20 * v) * Y * 0.25f * iv;float R = X*C0 + Y*C1 + Z*C2;float G = X*C3 + Y*C4 + Z*C5;float B = X*C6 + Y*C7 + Z*C8;R = std::min(std::max(R, 0.f), 1.f);G = std::min(std::max(G, 0.f), 1.f);B = std::min(std::max(B, 0.f), 1.f);if (gammaTab) {R = splineInterpolate(R*gscale, gammaTab, GAMMA_TAB_SIZE);G = splineInterpolate(G*gscale, gammaTab, GAMMA_TAB_SIZE);B = splineInterpolate(B*gscale, gammaTab, GAMMA_TAB_SIZE);}dst[0] = R; dst[1] = G; dst[2] = B;if (dcn == 4)dst[3] = alpha;}}int dstcn;float coeffs[9], un, vn;bool srgb;
};struct Luv2RGB_b
{typedef uchar channel_type;Luv2RGB_b(int _dstcn, int blueIdx, const float* _coeffs, const float* _whitept, bool _srgb): dstcn(_dstcn), cvt(3, blueIdx, _coeffs, _whitept, _srgb) { }void operator()(const uchar* src, uchar* dst, int n) const{int i, j, dcn = dstcn;uchar alpha = ColorChannel<uchar>::max();float FBC_DECL_ALIGNED(16) buf[3 * BLOCK_SIZE];for (i = 0; i < n; i += BLOCK_SIZE, src += BLOCK_SIZE * 3) {int dn = std::min(n - i, (int)BLOCK_SIZE);j = 0;for (; j < dn * 3; j += 3) {buf[j] = src[j] * (100.f / 255.f);buf[j + 1] = (float)(src[j + 1] * 1.388235294117647f - 134.f);buf[j + 2] = (float)(src[j + 2] * 1.027450980392157f - 140.f);}cvt(buf, buf, dn);j = 0;for (; j < dn * 3; j += 3, dst += dcn) {dst[0] = saturate_cast<uchar>(buf[j] * 255.f);dst[1] = saturate_cast<uchar>(buf[j + 1] * 255.f);dst[2] = saturate_cast<uchar>(buf[j + 2] * 255.f);if (dcn == 4)dst[3] = alpha;}}}int dstcn;Luv2RGB_f cvt;
};const int ITUR_BT_601_CY = 1220542;
const int ITUR_BT_601_CUB = 2116026;
const int ITUR_BT_601_CUG = -409993;
const int ITUR_BT_601_CVG = -852492;
const int ITUR_BT_601_CVR = 1673527;
const int ITUR_BT_601_SHIFT = 20;// Coefficients for RGB to YUV420p conversion
const int ITUR_BT_601_CRY = 269484;
const int ITUR_BT_601_CGY = 528482;
const int ITUR_BT_601_CBY = 102760;
const int ITUR_BT_601_CRU = -155188;
const int ITUR_BT_601_CGU = -305135;
const int ITUR_BT_601_CBU = 460324;
const int ITUR_BT_601_CGV = -385875;
const int ITUR_BT_601_CBV = -74448;template<typename _Tp, int chs, int bIdx, int uIdx>
struct YUV420sp2RGB888Invoker
{Mat_<_Tp, chs>* dst;const uchar* my1, *muv;int width, stride;YUV420sp2RGB888Invoker(Mat_<_Tp, chs>* _dst, int _stride, const uchar* _y1, const uchar* _uv): dst(_dst), my1(_y1), muv(_uv), width(_dst->cols), stride(_stride) {}void operator()(const Range& range) const{int rangeBegin = range.start * 2;int rangeEnd = range.end * 2;//R = 1.164(Y - 16) + 1.596(V - 128)//G = 1.164(Y - 16) - 0.813(V - 128) - 0.391(U - 128)//B = 1.164(Y - 16)                  + 2.018(U - 128)//R = (1220542(Y - 16) + 1673527(V - 128)                  + (1 << 19)) >> 20//G = (1220542(Y - 16) - 852492(V - 128) - 409993(U - 128) + (1 << 19)) >> 20//B = (1220542(Y - 16)                  + 2116026(U - 128) + (1 << 19)) >> 20const uchar* y1 = my1 + rangeBegin * stride, *uv = muv + rangeBegin * stride / 2;for (int j = rangeBegin; j < rangeEnd; j += 2, y1 += stride * 2, uv += stride) {uchar* row1 = (uchar*)dst->ptr(j);uchar* row2 = (uchar*)dst->ptr(j + 1);const uchar* y2 = y1 + stride;for (int i = 0; i < width; i += 2, row1 += 6, row2 += 6) {int u = int(uv[i + 0 + uIdx]) - 128;int v = int(uv[i + 1 - uIdx]) - 128;int ruv = (1 << (ITUR_BT_601_SHIFT - 1)) + ITUR_BT_601_CVR * v;int guv = (1 << (ITUR_BT_601_SHIFT - 1)) + ITUR_BT_601_CVG * v + ITUR_BT_601_CUG * u;int buv = (1 << (ITUR_BT_601_SHIFT - 1)) + ITUR_BT_601_CUB * u;int y00 = std::max(0, int(y1[i]) - 16) * ITUR_BT_601_CY;row1[2 - bIdx] = saturate_cast<uchar>((y00 + ruv) >> ITUR_BT_601_SHIFT);row1[1] = saturate_cast<uchar>((y00 + guv) >> ITUR_BT_601_SHIFT);row1[bIdx] = saturate_cast<uchar>((y00 + buv) >> ITUR_BT_601_SHIFT);int y01 = std::max(0, int(y1[i + 1]) - 16) * ITUR_BT_601_CY;row1[5 - bIdx] = saturate_cast<uchar>((y01 + ruv) >> ITUR_BT_601_SHIFT);row1[4] = saturate_cast<uchar>((y01 + guv) >> ITUR_BT_601_SHIFT);row1[3 + bIdx] = saturate_cast<uchar>((y01 + buv) >> ITUR_BT_601_SHIFT);int y10 = std::max(0, int(y2[i]) - 16) * ITUR_BT_601_CY;row2[2 - bIdx] = saturate_cast<uchar>((y10 + ruv) >> ITUR_BT_601_SHIFT);row2[1] = saturate_cast<uchar>((y10 + guv) >> ITUR_BT_601_SHIFT);row2[bIdx] = saturate_cast<uchar>((y10 + buv) >> ITUR_BT_601_SHIFT);int y11 = std::max(0, int(y2[i + 1]) - 16) * ITUR_BT_601_CY;row2[5 - bIdx] = saturate_cast<uchar>((y11 + ruv) >> ITUR_BT_601_SHIFT);row2[4] = saturate_cast<uchar>((y11 + guv) >> ITUR_BT_601_SHIFT);row2[3 + bIdx] = saturate_cast<uchar>((y11 + buv) >> ITUR_BT_601_SHIFT);}}}
};template<typename _Tp, int chs, int bIdx, int uIdx>
struct YUV420sp2RGBA8888Invoker
{Mat_<_Tp, chs>* dst;const uchar* my1, *muv;int width, stride;YUV420sp2RGBA8888Invoker(Mat_<_Tp, chs>* _dst, int _stride, const uchar* _y1, const uchar* _uv): dst(_dst), my1(_y1), muv(_uv), width(_dst->cols), stride(_stride) {}void operator()(const Range& range) const{int rangeBegin = range.start * 2;int rangeEnd = range.end * 2;//R = 1.164(Y - 16) + 1.596(V - 128)//G = 1.164(Y - 16) - 0.813(V - 128) - 0.391(U - 128)//B = 1.164(Y - 16)                  + 2.018(U - 128)//R = (1220542(Y - 16) + 1673527(V - 128)                  + (1 << 19)) >> 20//G = (1220542(Y - 16) - 852492(V - 128) - 409993(U - 128) + (1 << 19)) >> 20//B = (1220542(Y - 16)                  + 2116026(U - 128) + (1 << 19)) >> 20const uchar* y1 = my1 + rangeBegin * stride, *uv = muv + rangeBegin * stride / 2;for (int j = rangeBegin; j < rangeEnd; j += 2, y1 += stride * 2, uv += stride) {uchar* row1 = (uchar*)dst->ptr(j);uchar* row2 = (uchar*)dst->ptr(j + 1);const uchar* y2 = y1 + stride;for (int i = 0; i < width; i += 2, row1 += 8, row2 += 8) {int u = int(uv[i + 0 + uIdx]) - 128;int v = int(uv[i + 1 - uIdx]) - 128;int ruv = (1 << (ITUR_BT_601_SHIFT - 1)) + ITUR_BT_601_CVR * v;int guv = (1 << (ITUR_BT_601_SHIFT - 1)) + ITUR_BT_601_CVG * v + ITUR_BT_601_CUG * u;int buv = (1 << (ITUR_BT_601_SHIFT - 1)) + ITUR_BT_601_CUB * u;int y00 = std::max(0, int(y1[i]) - 16) * ITUR_BT_601_CY;row1[2 - bIdx] = saturate_cast<uchar>((y00 + ruv) >> ITUR_BT_601_SHIFT);row1[1] = saturate_cast<uchar>((y00 + guv) >> ITUR_BT_601_SHIFT);row1[bIdx] = saturate_cast<uchar>((y00 + buv) >> ITUR_BT_601_SHIFT);row1[3] = uchar(0xff);int y01 = std::max(0, int(y1[i + 1]) - 16) * ITUR_BT_601_CY;row1[6 - bIdx] = saturate_cast<uchar>((y01 + ruv) >> ITUR_BT_601_SHIFT);row1[5] = saturate_cast<uchar>((y01 + guv) >> ITUR_BT_601_SHIFT);row1[4 + bIdx] = saturate_cast<uchar>((y01 + buv) >> ITUR_BT_601_SHIFT);row1[7] = uchar(0xff);int y10 = std::max(0, int(y2[i]) - 16) * ITUR_BT_601_CY;row2[2 - bIdx] = saturate_cast<uchar>((y10 + ruv) >> ITUR_BT_601_SHIFT);row2[1] = saturate_cast<uchar>((y10 + guv) >> ITUR_BT_601_SHIFT);row2[bIdx] = saturate_cast<uchar>((y10 + buv) >> ITUR_BT_601_SHIFT);row2[3] = uchar(0xff);int y11 = std::max(0, int(y2[i + 1]) - 16) * ITUR_BT_601_CY;row2[6 - bIdx] = saturate_cast<uchar>((y11 + ruv) >> ITUR_BT_601_SHIFT);row2[5] = saturate_cast<uchar>((y11 + guv) >> ITUR_BT_601_SHIFT);row2[4 + bIdx] = saturate_cast<uchar>((y11 + buv) >> ITUR_BT_601_SHIFT);row2[7] = uchar(0xff);}}}
};template<typename _Tp, int chs, int bIdx>
struct YUV420p2RGB888Invoker
{Mat_<_Tp, chs>* dst;const uchar* my1, *mu, *mv;int width, stride;int ustepIdx, vstepIdx;YUV420p2RGB888Invoker(Mat_<_Tp, chs>* _dst, int _stride, const uchar* _y1, const uchar* _u, const uchar* _v, int _ustepIdx, int _vstepIdx): dst(_dst), my1(_y1), mu(_u), mv(_v), width(_dst->cols), stride(_stride), ustepIdx(_ustepIdx), vstepIdx(_vstepIdx) {}void operator()(const Range& range) const{const int rangeBegin = range.start * 2;const int rangeEnd = range.end * 2;int uvsteps[2] = { width / 2, stride - width / 2 };int usIdx = ustepIdx, vsIdx = vstepIdx;const uchar* y1 = my1 + rangeBegin * stride;const uchar* u1 = mu + (range.start / 2) * stride;const uchar* v1 = mv + (range.start / 2) * stride;if (range.start % 2 == 1) {u1 += uvsteps[(usIdx++) & 1];v1 += uvsteps[(vsIdx++) & 1];}for (int j = rangeBegin; j < rangeEnd; j += 2, y1 += stride * 2, u1 += uvsteps[(usIdx++) & 1], v1 += uvsteps[(vsIdx++) & 1]) {uchar* row1 = (uchar*)dst->ptr(j);uchar* row2 = (uchar*)dst->ptr(j + 1);const uchar* y2 = y1 + stride;for (int i = 0; i < width / 2; i += 1, row1 += 6, row2 += 6) {int u = int(u1[i]) - 128;int v = int(v1[i]) - 128;int ruv = (1 << (ITUR_BT_601_SHIFT - 1)) + ITUR_BT_601_CVR * v;int guv = (1 << (ITUR_BT_601_SHIFT - 1)) + ITUR_BT_601_CVG * v + ITUR_BT_601_CUG * u;int buv = (1 << (ITUR_BT_601_SHIFT - 1)) + ITUR_BT_601_CUB * u;int y00 = std::max(0, int(y1[2 * i]) - 16) * ITUR_BT_601_CY;row1[2 - bIdx] = saturate_cast<uchar>((y00 + ruv) >> ITUR_BT_601_SHIFT);row1[1] = saturate_cast<uchar>((y00 + guv) >> ITUR_BT_601_SHIFT);row1[bIdx] = saturate_cast<uchar>((y00 + buv) >> ITUR_BT_601_SHIFT);int y01 = std::max(0, int(y1[2 * i + 1]) - 16) * ITUR_BT_601_CY;row1[5 - bIdx] = saturate_cast<uchar>((y01 + ruv) >> ITUR_BT_601_SHIFT);row1[4] = saturate_cast<uchar>((y01 + guv) >> ITUR_BT_601_SHIFT);row1[3 + bIdx] = saturate_cast<uchar>((y01 + buv) >> ITUR_BT_601_SHIFT);int y10 = std::max(0, int(y2[2 * i]) - 16) * ITUR_BT_601_CY;row2[2 - bIdx] = saturate_cast<uchar>((y10 + ruv) >> ITUR_BT_601_SHIFT);row2[1] = saturate_cast<uchar>((y10 + guv) >> ITUR_BT_601_SHIFT);row2[bIdx] = saturate_cast<uchar>((y10 + buv) >> ITUR_BT_601_SHIFT);int y11 = std::max(0, int(y2[2 * i + 1]) - 16) * ITUR_BT_601_CY;row2[5 - bIdx] = saturate_cast<uchar>((y11 + ruv) >> ITUR_BT_601_SHIFT);row2[4] = saturate_cast<uchar>((y11 + guv) >> ITUR_BT_601_SHIFT);row2[3 + bIdx] = saturate_cast<uchar>((y11 + buv) >> ITUR_BT_601_SHIFT);}}}
};template<typename _Tp, int chs, int bIdx>
struct YUV420p2RGBA8888Invoker
{Mat_<_Tp, chs>* dst;const uchar* my1, *mu, *mv;int width, stride;int ustepIdx, vstepIdx;YUV420p2RGBA8888Invoker(Mat_<_Tp, chs>* _dst, int _stride, const uchar* _y1, const uchar* _u, const uchar* _v, int _ustepIdx, int _vstepIdx): dst(_dst), my1(_y1), mu(_u), mv(_v), width(_dst->cols), stride(_stride), ustepIdx(_ustepIdx), vstepIdx(_vstepIdx) {}void operator()(const Range& range) const{int rangeBegin = range.start * 2;int rangeEnd = range.end * 2;int uvsteps[2] = { width / 2, stride - width / 2 };int usIdx = ustepIdx, vsIdx = vstepIdx;const uchar* y1 = my1 + rangeBegin * stride;const uchar* u1 = mu + (range.start / 2) * stride;const uchar* v1 = mv + (range.start / 2) * stride;if (range.start % 2 == 1) {u1 += uvsteps[(usIdx++) & 1];v1 += uvsteps[(vsIdx++) & 1];}for (int j = rangeBegin; j < rangeEnd; j += 2, y1 += stride * 2, u1 += uvsteps[(usIdx++) & 1], v1 += uvsteps[(vsIdx++) & 1]) {uchar* row1 = (uchar*)dst->ptr(j);uchar* row2 = (uchar*)dst->ptr(j + 1);const uchar* y2 = y1 + stride;for (int i = 0; i < width / 2; i += 1, row1 += 8, row2 += 8) {int u = int(u1[i]) - 128;int v = int(v1[i]) - 128;int ruv = (1 << (ITUR_BT_601_SHIFT - 1)) + ITUR_BT_601_CVR * v;int guv = (1 << (ITUR_BT_601_SHIFT - 1)) + ITUR_BT_601_CVG * v + ITUR_BT_601_CUG * u;int buv = (1 << (ITUR_BT_601_SHIFT - 1)) + ITUR_BT_601_CUB * u;int y00 = std::max(0, int(y1[2 * i]) - 16) * ITUR_BT_601_CY;row1[2 - bIdx] = saturate_cast<uchar>((y00 + ruv) >> ITUR_BT_601_SHIFT);row1[1] = saturate_cast<uchar>((y00 + guv) >> ITUR_BT_601_SHIFT);row1[bIdx] = saturate_cast<uchar>((y00 + buv) >> ITUR_BT_601_SHIFT);row1[3] = uchar(0xff);int y01 = std::max(0, int(y1[2 * i + 1]) - 16) * ITUR_BT_601_CY;row1[6 - bIdx] = saturate_cast<uchar>((y01 + ruv) >> ITUR_BT_601_SHIFT);row1[5] = saturate_cast<uchar>((y01 + guv) >> ITUR_BT_601_SHIFT);row1[4 + bIdx] = saturate_cast<uchar>((y01 + buv) >> ITUR_BT_601_SHIFT);row1[7] = uchar(0xff);int y10 = std::max(0, int(y2[2 * i]) - 16) * ITUR_BT_601_CY;row2[2 - bIdx] = saturate_cast<uchar>((y10 + ruv) >> ITUR_BT_601_SHIFT);row2[1] = saturate_cast<uchar>((y10 + guv) >> ITUR_BT_601_SHIFT);row2[bIdx] = saturate_cast<uchar>((y10 + buv) >> ITUR_BT_601_SHIFT);row2[3] = uchar(0xff);int y11 = std::max(0, int(y2[2 * i + 1]) - 16) * ITUR_BT_601_CY;row2[6 - bIdx] = saturate_cast<uchar>((y11 + ruv) >> ITUR_BT_601_SHIFT);row2[5] = saturate_cast<uchar>((y11 + guv) >> ITUR_BT_601_SHIFT);row2[4 + bIdx] = saturate_cast<uchar>((y11 + buv) >> ITUR_BT_601_SHIFT);row2[7] = uchar(0xff);}}}
};template<typename _Tp, int chs, int bIdx, int uIdx>
inline void cvtYUV420sp2RGB(Mat_<_Tp, chs>& _dst, int _stride, const uchar* _y1, const uchar* _uv)
{YUV420sp2RGB888Invoker<_Tp, chs, bIdx, uIdx> converter(&_dst, _stride, _y1, _uv);converter(Range(0, _dst.rows / 2));
}template<typename _Tp, int chs, int bIdx, int uIdx>
inline void cvtYUV420sp2RGBA(Mat_<_Tp, chs>& _dst, int _stride, const uchar* _y1, const uchar* _uv)
{YUV420sp2RGBA8888Invoker<_Tp, chs, bIdx, uIdx> converter(&_dst, _stride, _y1, _uv);converter(Range(0, _dst.rows / 2));
}template<typename _Tp, int chs, int bIdx>
inline void cvtYUV420p2RGB(Mat_<_Tp, chs>& _dst, int _stride, const uchar* _y1, const uchar* _u, const uchar* _v, int ustepIdx, int vstepIdx)
{YUV420p2RGB888Invoker<_Tp, chs, bIdx> converter(&_dst, _stride, _y1, _u, _v, ustepIdx, vstepIdx);converter(Range(0, _dst.rows / 2));
}template<typename _Tp, int chs, int bIdx>
inline void cvtYUV420p2RGBA(Mat_<_Tp, chs>& _dst, int _stride, const uchar* _y1, const uchar* _u, const uchar* _v, int ustepIdx, int vstepIdx)
{YUV420p2RGBA8888Invoker<_Tp, chs, bIdx> converter(&_dst, _stride, _y1, _u, _v, ustepIdx, vstepIdx);converter(Range(0, _dst.rows / 2));
}template<typename _Tp, int chs1, int chs2, int bIdx>
struct RGB888toYUV420pInvoker
{RGB888toYUV420pInvoker(const Mat_<_Tp, chs1>& src, Mat_<_Tp, chs2>* dst, const int uIdx): src_(src), dst_(dst), uIdx_(uIdx) { }void operator()(const Range& rowRange) const{const int w = src_.cols;const int h = src_.rows;const int cn = src_.channels;for (int i = rowRange.start; i < rowRange.end; i++) {const uchar* row0 = src_.ptr(2 * i);const uchar* row1 = src_.ptr(2 * i + 1);uchar* y = (uchar*)dst_->ptr(2 * i);uchar* u = (uchar*)dst_->ptr(h + i / 2) + (i % 2) * (w / 2);uchar* v = (uchar*)dst_->ptr(h + (i + h / 2) / 2) + ((i + h / 2) % 2) * (w / 2);if (uIdx_ == 2) std::swap(u, v);for (int j = 0, k = 0; j < w * cn; j += 2 * cn, k++) {int r00 = row0[2 - bIdx + j];      int g00 = row0[1 + j];      int b00 = row0[bIdx + j];int r01 = row0[2 - bIdx + cn + j]; int g01 = row0[1 + cn + j]; int b01 = row0[bIdx + cn + j];int r10 = row1[2 - bIdx + j];      int g10 = row1[1 + j];      int b10 = row1[bIdx + j];int r11 = row1[2 - bIdx + cn + j]; int g11 = row1[1 + cn + j]; int b11 = row1[bIdx + cn + j];const int shifted16 = (16 << ITUR_BT_601_SHIFT);const int halfShift = (1 << (ITUR_BT_601_SHIFT - 1));int y00 = ITUR_BT_601_CRY * r00 + ITUR_BT_601_CGY * g00 + ITUR_BT_601_CBY * b00 + halfShift + shifted16;int y01 = ITUR_BT_601_CRY * r01 + ITUR_BT_601_CGY * g01 + ITUR_BT_601_CBY * b01 + halfShift + shifted16;int y10 = ITUR_BT_601_CRY * r10 + ITUR_BT_601_CGY * g10 + ITUR_BT_601_CBY * b10 + halfShift + shifted16;int y11 = ITUR_BT_601_CRY * r11 + ITUR_BT_601_CGY * g11 + ITUR_BT_601_CBY * b11 + halfShift + shifted16;y[2 * k + 0] = saturate_cast<uchar>(y00 >> ITUR_BT_601_SHIFT);y[2 * k + 1] = saturate_cast<uchar>(y01 >> ITUR_BT_601_SHIFT);y[2 * k + dst_->step + 0] = saturate_cast<uchar>(y10 >> ITUR_BT_601_SHIFT);y[2 * k + dst_->step + 1] = saturate_cast<uchar>(y11 >> ITUR_BT_601_SHIFT);const int shifted128 = (128 << ITUR_BT_601_SHIFT);int u00 = ITUR_BT_601_CRU * r00 + ITUR_BT_601_CGU * g00 + ITUR_BT_601_CBU * b00 + halfShift + shifted128;int v00 = ITUR_BT_601_CBU * r00 + ITUR_BT_601_CGV * g00 + ITUR_BT_601_CBV * b00 + halfShift + shifted128;u[k] = saturate_cast<uchar>(u00 >> ITUR_BT_601_SHIFT);v[k] = saturate_cast<uchar>(v00 >> ITUR_BT_601_SHIFT);}}}private:RGB888toYUV420pInvoker& operator=(const RGB888toYUV420pInvoker&);const Mat_<_Tp, chs1>& src_;Mat_<_Tp, chs2>* const dst_;const int uIdx_;
};template<typename _Tp, int chs1, int chs2, int bIdx, int uIdx>
static void cvtRGBtoYUV420p(const Mat_<_Tp, chs1>& src, Mat_<_Tp, chs2>& dst)
{RGB888toYUV420pInvoker<_Tp, chs1, chs2, bIdx> colorConverter(src, &dst, uIdx);colorConverter(Range(0, src.rows / 2));
}template<typename _Tp, int chs1, int chs2>
static int CvtColorLoop_RGB2RGB(const Mat_<_Tp, chs1>& src, Mat_<_Tp, chs2>& dst, int bidx)
{Range range(0, src.rows);const uchar* yS_ = src.ptr(range.start);uchar* yD_ = (uchar*)dst.ptr(range.start);int scn = src.channels, dcn = dst.channels;for (int h = range.start; h < range.end; ++h, yS_ += src.step, yD_ += dst.step) {int n = src.cols;const _Tp* yS = (const _Tp*)yS_;_Tp* yD = (_Tp*)yD_;if (dcn == 3) {n *= 3;for (int i = 0; i < n; i += 3, yS += scn) {_Tp t0 = yS[bidx], t1 = yS[1], t2 = yS[bidx ^ 2];yD[i] = t0; yD[i + 1] = t1; yD[i + 2] = t2;}} else if (scn == 3) {n *= 3;_Tp alpha = ColorChannel<_Tp>::max(); // Note: _Tp = float: alpha = 1.0ffor (int i = 0; i < n; i += 3, yD += 4) {_Tp t0 = yS[i], t1 = yS[i + 1], t2 = yS[i + 2];yD[bidx] = t0; yD[1] = t1; yD[bidx ^ 2] = t2; yD[3] = alpha;}} else {n *= 4;for (int i = 0; i < n; i += 4) {_Tp t0 = yS[i], t1 = yS[i + 1], t2 = yS[i + 2], t3 = yS[i + 3];yD[i] = t2; yD[i + 1] = t1; yD[i + 2] = t0; yD[i + 3] = t3;}}}return 0;
}template<typename _Tp, int chs1, int chs2>
static int CvtColorLoop_RGB2Gray(const Mat_<_Tp, chs1>& src, Mat_<_Tp, chs2>& dst, int bidx)
{Range range(0, src.rows);const uchar* yS = src.ptr(range.start);uchar* yD = (uchar*)dst.ptr(range.start);int scn = src.channels, dcn = dst.channels;RGB2Gray<_Tp> rgb2gray(scn, bidx, 0);for (int i = range.start; i < range.end; ++i, yS += src.step, yD += dst.step) {rgb2gray((const _Tp*)yS, (_Tp*)yD, src.cols);}return 0;
}template<typename _Tp, int chs1, int chs2>
static int CvtColorLoop_Gray2RGB(const Mat_<_Tp, chs1>& src, Mat_<_Tp, chs2>& dst)
{Range range(0, src.rows);const uchar* yS = src.ptr(range.start);uchar* yD = (uchar*)dst.ptr(range.start);int scn = src.channels, dcn = dst.channels;Gray2RGB<_Tp> gray2rgb(dcn);for (int i = range.start; i < range.end; ++i, yS += src.step, yD += dst.step) {gray2rgb((const _Tp*)yS, (_Tp*)yD, src.cols);}return 0;
}template<typename _Tp, int chs1, int chs2>
static int CvtColorLoop_RGB2YCrCb(const Mat_<_Tp, chs1>& src, Mat_<_Tp, chs2>& dst, int bidx, const float* coeffs_f, const int* coeffs_i)
{Range range(0, src.rows);const uchar* yS = src.ptr(range.start);uchar* yD = (uchar*)dst.ptr(range.start);int scn = src.channels, dcn = dst.channels;if (sizeof(_Tp) == 4) {RGB2YCrCb_f<_Tp> rgb2ycrcb(scn, bidx, coeffs_f);for (int i = range.start; i < range.end; ++i, yS += src.step, yD += dst.step) {rgb2ycrcb((const _Tp*)yS, (_Tp*)yD, src.cols);}} else {if (sizeof(_Tp) == 1) {RGB2YCrCb_i<uchar> rgb2ycrcb(scn, bidx, coeffs_i);for (int i = range.start; i < range.end; ++i, yS += src.step, yD += dst.step) {rgb2ycrcb((const uchar*)yS, (uchar*)yD, src.cols);}} else {RGB2YCrCb_i<ushort> rgb2ycrcb(scn, bidx, coeffs_i);for (int i = range.start; i < range.end; ++i, yS += src.step, yD += dst.step) {rgb2ycrcb((const ushort*)yS, (ushort*)yD, src.cols);}}}return 0;
}template<typename _Tp, int chs1, int chs2>
static int CvtColorLoop_YCrCb2RGB(const Mat_<_Tp, chs1>& src, Mat_<_Tp, chs2>& dst, int bidx, const float* coeffs_f, const int* coeffs_i)
{Range range(0, src.rows);const uchar* yS = src.ptr(range.start);uchar* yD = (uchar*)dst.ptr(range.start);int scn = src.channels, dcn = dst.channels;if (sizeof(_Tp) == 4) {YCrCb2RGB_f<_Tp> ycrcb2rgb(dcn, bidx, coeffs_f);for (int i = range.start; i < range.end; ++i, yS += src.step, yD += dst.step) {ycrcb2rgb((const _Tp*)yS, (_Tp*)yD, src.cols);}} else {if (sizeof(_Tp) == 1) {YCrCb2RGB_i<uchar> ycrcb2rgb(dcn, bidx, coeffs_i);for (int i = range.start; i < range.end; ++i, yS += src.step, yD += dst.step) {ycrcb2rgb((const uchar*)yS, (uchar*)yD, src.cols);}}else {YCrCb2RGB_i<ushort> ycrcb2rgb(dcn, bidx, coeffs_i);for (int i = range.start; i < range.end; ++i, yS += src.step, yD += dst.step) {ycrcb2rgb((const ushort*)yS, (ushort*)yD, src.cols);}}}return 0;
}template<typename _Tp, int chs1, int chs2>
static int CvtColorLoop_RGB2XYZ(const Mat_<_Tp, chs1>& src, Mat_<_Tp, chs2>& dst, int bidx)
{Range range(0, src.rows);const uchar* yS = src.ptr(range.start);uchar* yD = (uchar*)dst.ptr(range.start);int scn = src.channels, dcn = dst.channels;if (sizeof(_Tp) == 4) {RGB2XYZ_f<_Tp> rgb2xyz(scn, bidx, 0);for (int i = range.start; i < range.end; ++i, yS += src.step, yD += dst.step) {rgb2xyz((const _Tp*)yS, (_Tp*)yD, src.cols);}} else {if (sizeof(_Tp) == 1) {RGB2XYZ_i<uchar> rgb2xyz(scn, bidx, 0);for (int i = range.start; i < range.end; ++i, yS += src.step, yD += dst.step) {rgb2xyz((const uchar*)yS, (uchar*)yD, src.cols);}} else {RGB2XYZ_i<ushort> rgb2xyz(scn, bidx, 0);for (int i = range.start; i < range.end; ++i, yS += src.step, yD += dst.step) {rgb2xyz((const ushort*)yS, (ushort*)yD, src.cols);}}}return 0;
}template<typename _Tp, int chs1, int chs2>
static int CvtColorLoop_XYZ2RGB(const Mat_<_Tp, chs1>& src, Mat_<_Tp, chs2>& dst, int bidx)
{Range range(0, src.rows);const uchar* yS = src.ptr(range.start);uchar* yD = (uchar*)dst.ptr(range.start);int scn = src.channels, dcn = dst.channels;if (sizeof(_Tp) == 4) {XYZ2RGB_f<_Tp> xyz2rgb(dcn, bidx, 0);for (int i = range.start; i < range.end; ++i, yS += src.step, yD += dst.step) {xyz2rgb((const _Tp*)yS, (_Tp*)yD, src.cols);}} else {if (sizeof(_Tp) == 1) {XYZ2RGB_i<uchar> xyz2rgb(dcn, bidx, 0);for (int i = range.start; i < range.end; ++i, yS += src.step, yD += dst.step) {xyz2rgb((const uchar*)yS, (uchar*)yD, src.cols);}} else {XYZ2RGB_i<ushort> xyz2rgb(dcn, bidx, 0);for (int i = range.start; i < range.end; ++i, yS += src.step, yD += dst.step) {xyz2rgb((const ushort*)yS, (ushort*)yD, src.cols);}}}return 0;
}template<typename _Tp, int chs1, int chs2>
static int CvtColorLoop_RGB2HSV(const Mat_<_Tp, chs1>& src, Mat_<_Tp, chs2>& dst, int bidx, int hrange)
{Range range(0, src.rows);const uchar* yS = src.ptr(range.start);uchar* yD = (uchar*)dst.ptr(range.start);int scn = src.channels, dcn = dst.channels;if (sizeof(_Tp) == 1) {RGB2HSV_b rgb2hsv(scn, bidx, hrange);for (int i = range.start; i < range.end; ++i, yS += src.step, yD += dst.step) {rgb2hsv((const uchar*)yS, (uchar*)yD, src.cols);}} else {RGB2HSV_f rgb2hsv(scn, bidx, (float)hrange);for (int i = range.start; i < range.end; ++i, yS += src.step, yD += dst.step) {rgb2hsv((const float*)yS, (float*)yD, src.cols);}}return 0;
}template<typename _Tp, int chs1, int chs2>
static int CvtColorLoop_RGB2HLS(const Mat_<_Tp, chs1>& src, Mat_<_Tp, chs2>& dst, int bidx, int hrange)
{Range range(0, src.rows);const uchar* yS = src.ptr(range.start);uchar* yD = (uchar*)dst.ptr(range.start);int scn = src.channels, dcn = dst.channels;if (sizeof(_Tp) == 1) {RGB2HLS_b rgb2hls(scn, bidx, hrange);for (int i = range.start; i < range.end; ++i, yS += src.step, yD += dst.step) {rgb2hls((const uchar*)yS, (uchar*)yD, src.cols);}} else {RGB2HLS_f rgb2hls(scn, bidx, (float)hrange);for (int i = range.start; i < range.end; ++i, yS += src.step, yD += dst.step) {rgb2hls((const float*)yS, (float*)yD, src.cols);}}return 0;
}template<typename _Tp, int chs1, int chs2>
static int CvtColorLoop_HSV2RGB(const Mat_<_Tp, chs1>& src, Mat_<_Tp, chs2>& dst, int bidx, int hrange)
{Range range(0, src.rows);const uchar* yS = src.ptr(range.start);uchar* yD = (uchar*)dst.ptr(range.start);int scn = src.channels, dcn = dst.channels;if (sizeof(_Tp) == 1) {HSV2RGB_b hsv2rgb(dcn, bidx, hrange);for (int i = range.start; i < range.end; ++i, yS += src.step, yD += dst.step) {hsv2rgb((const uchar*)yS, (uchar*)yD, src.cols);}} else {HSV2RGB_f hsv2rgb(dcn, bidx, (float)hrange);for (int i = range.start; i < range.end; ++i, yS += src.step, yD += dst.step) {hsv2rgb((const float*)yS, (float*)yD, src.cols);}}return 0;
}template<typename _Tp, int chs1, int chs2>
static int CvtColorLoop_HLS2RGB(const Mat_<_Tp, chs1>& src, Mat_<_Tp, chs2>& dst, int bidx, int hrange)
{Range range(0, src.rows);const uchar* yS = src.ptr(range.start);uchar* yD = (uchar*)dst.ptr(range.start);int scn = src.channels, dcn = dst.channels;if (sizeof(_Tp) == 1) {HLS2RGB_b hls2rgb(dcn, bidx, hrange);for (int i = range.start; i < range.end; ++i, yS += src.step, yD += dst.step) {hls2rgb((const uchar*)yS, (uchar*)yD, src.cols);}} else {HLS2RGB_f hls2rgb(dcn, bidx, (float)hrange);for (int i = range.start; i < range.end; ++i, yS += src.step, yD += dst.step) {hls2rgb((const float*)yS, (float*)yD, src.cols);}}return 0;
}template<typename _Tp, int chs1, int chs2>
static int CvtColorLoop_RGB2Lab(const Mat_<_Tp, chs1>& src, Mat_<_Tp, chs2>& dst, int bidx, const float* coeffs, const float* whitept, bool srgb)
{Range range(0, src.rows);const uchar* yS = src.ptr(range.start);uchar* yD = (uchar*)dst.ptr(range.start);int scn = src.channels, dcn = dst.channels;if (sizeof(_Tp) == 1) {RGB2Lab_b rgb2lab(scn, bidx, coeffs, whitept, srgb);for (int i = range.start; i < range.end; ++i, yS += src.step, yD += dst.step) {rgb2lab((const uchar*)yS, (uchar*)yD, src.cols);}}else {RGB2Lab_f rgb2lab(scn, bidx, coeffs, whitept, srgb);for (int i = range.start; i < range.end; ++i, yS += src.step, yD += dst.step) {rgb2lab((const float*)yS, (float*)yD, src.cols);}}return 0;
}template<typename _Tp, int chs1, int chs2>
static int CvtColorLoop_RGB2Luv(const Mat_<_Tp, chs1>& src, Mat_<_Tp, chs2>& dst, int bidx, const float* coeffs, const float* whitept, bool srgb)
{Range range(0, src.rows);const uchar* yS = src.ptr(range.start);uchar* yD = (uchar*)dst.ptr(range.start);int scn = src.channels, dcn = dst.channels;if (sizeof(_Tp) == 1) {RGB2Luv_b rgb2luv(scn, bidx, coeffs, whitept, srgb);for (int i = range.start; i < range.end; ++i, yS += src.step, yD += dst.step) {rgb2luv((const uchar*)yS, (uchar*)yD, src.cols);}}else {RGB2Luv_f rgb2luv(scn, bidx, coeffs, whitept, srgb);for (int i = range.start; i < range.end; ++i, yS += src.step, yD += dst.step) {rgb2luv((const float*)yS, (float*)yD, src.cols);}}return 0;
}template<typename _Tp, int chs1, int chs2>
static int CvtColorLoop_Lab2RGB(const Mat_<_Tp, chs1>& src, Mat_<_Tp, chs2>& dst, int bidx, const float* coeffs, const float* whitept, bool srgb)
{Range range(0, src.rows);const uchar* yS = src.ptr(range.start);uchar* yD = (uchar*)dst.ptr(range.start);int scn = src.channels, dcn = dst.channels;if (sizeof(_Tp) == 1) {Lab2RGB_b lab2rgb(dcn, bidx, coeffs, whitept, srgb);for (int i = range.start; i < range.end; ++i, yS += src.step, yD += dst.step) {lab2rgb((const uchar*)yS, (uchar*)yD, src.cols);}}else {Lab2RGB_f lab2rgb(dcn, bidx, coeffs, whitept, srgb);for (int i = range.start; i < range.end; ++i, yS += src.step, yD += dst.step) {lab2rgb((const float*)yS, (float*)yD, src.cols);}}return 0;
}template<typename _Tp, int chs1, int chs2>
static int CvtColorLoop_Luv2RGB(const Mat_<_Tp, chs1>& src, Mat_<_Tp, chs2>& dst, int bidx, const float* coeffs, const float* whitept, bool srgb)
{Range range(0, src.rows);const uchar* yS = src.ptr(range.start);uchar* yD = (uchar*)dst.ptr(range.start);int scn = src.channels, dcn = dst.channels;if (sizeof(_Tp) == 1) {Luv2RGB_b luv2rgb(dcn, bidx, coeffs, whitept, srgb);for (int i = range.start; i < range.end; ++i, yS += src.step, yD += dst.step) {luv2rgb((const uchar*)yS, (uchar*)yD, src.cols);}}else {Luv2RGB_f luv2rgb(dcn, bidx, coeffs, whitept, srgb);for (int i = range.start; i < range.end; ++i, yS += src.step, yD += dst.step) {luv2rgb((const float*)yS, (float*)yD, src.cols);}}return 0;
}} // namespace fbc
#endif // FBC_CV_CVTCOLOR_HPP_
測試代碼test_cvtColor.cpp:

#include <assert.h>
#include <core/mat.hpp>
#include <cvtColor.hpp>#include <opencv2/opencv.hpp>#include "test_cvtColor.hpp"int test_cvtColor_RGB2RGB()
{cv::Mat mat = cv::imread("E:/GitCode/OpenCV_Test/test_images/lena.png", 1);if (!mat.data) {std::cout << "read image fail" << std::endl;return -1;}int width = mat.cols;int height = mat.rows;// ucharfbc::Mat3BGR mat1(height, width, mat.data);fbc::Mat3BGR mat2(mat1);fbc::Mat_<uchar, 4> mat3(height, width);fbc::cvtColor(mat2, mat3, fbc::CV_BGR2BGRA);cv::Mat mat1_(height, width, CV_8UC3, mat.data);cv::Mat mat2_;mat1_.copyTo(mat2_);cv::Mat mat3_(height, width, CV_8UC4);cv::cvtColor(mat2_, mat3_, CV_BGR2BGRA);assert(mat3.step == mat3_.step);for (int y = 0; y < mat3.rows; y++) {const fbc::uchar* p = mat3.ptr(y);const uchar* p_ = mat3_.ptr(y);for (int x = 0; x < mat3.step; x++) {assert(p[x] == p_[x]);}}// floatcv::Mat matf;mat.convertTo(matf, CV_32FC3);fbc::Mat_<float, 3> mat4(height, width, matf.data);fbc::Mat_<float, 3> mat5(mat4);fbc::Mat_<float, 4> mat6(height, width);fbc::cvtColor(mat5, mat6, fbc::CV_BGR2BGRA);cv::Mat mat4_(height, width, CV_32FC3, matf.data);cv::Mat mat5_;mat4_.copyTo(mat5_);cv::Mat mat6_(height, width, CV_32FC4);cv::cvtColor(mat5_, mat6_, CV_BGR2BGRA);assert(mat6.step == mat6_.step);for (int y = 0; y < mat6.rows; y++) {const fbc::uchar* p = mat6.ptr(y);const uchar* p_ = mat6_.ptr(y);for (int x = 0; x < mat6.step; x++) {assert(p[x] == p_[x]);}}return 0;
}int test_cvtColor_RGB2Gray()
{cv::Mat mat = cv::imread("E:/GitCode/OpenCV_Test/test_images/lena.png", 1);if (!mat.data) {std::cout << "read image fail" << std::endl;return -1;}int width = mat.cols;int height = mat.rows;// ucharfbc::Mat3BGR mat1(height, width, mat.data);fbc::Mat3BGR mat2(mat1);fbc::Mat1Gray mat3(height, width);fbc::cvtColor(mat2, mat3, fbc::CV_BGR2GRAY);cv::Mat mat1_(height, width, CV_8UC3, mat.data);cv::Mat mat2_;mat1_.copyTo(mat2_);cv::Mat mat3_(height, width, CV_8UC1);cv::cvtColor(mat2_, mat3_, CV_BGR2GRAY);assert(mat3.step == mat3_.step);for (int y = 0; y < mat3.rows; y++) {const fbc::uchar* p = mat3.ptr(y);const uchar* p_ = mat3_.ptr(y);for (int x = 0; x < mat3.step; x++) {assert(p[x] == p_[x]);}}// floatcv::Mat matf;mat.convertTo(matf, CV_32FC3);fbc::Mat_<float, 3> mat4(height, width, matf.data);fbc::Mat_<float, 3> mat5(mat4);fbc::Mat_<float, 1> mat6(height, width);fbc::cvtColor(mat5, mat6, fbc::CV_BGR2GRAY);cv::Mat mat4_(height, width, CV_32FC3, matf.data);cv::Mat mat5_;mat4_.copyTo(mat5_);cv::Mat mat6_(height, width, CV_32FC1);cv::cvtColor(mat5_, mat6_, CV_BGR2GRAY);assert(mat6.step == mat6_.step);for (int y = 0; y < mat6.rows; y++) {const fbc::uchar* p = mat6.ptr(y);const uchar* p_ = mat6_.ptr(y);for (int x = 0; x < mat6.step; x++) {assert(p[x] == p_[x]);}}return 0;
}int test_cvtColor_Gray2RGB()
{cv::Mat mat = cv::imread("E:/GitCode/OpenCV_Test/test_images/lena.png", 1);if (!mat.data) {std::cout << "read image fail" << std::endl;return -1;}cv::cvtColor(mat, mat, CV_BGR2GRAY);int width = mat.cols;int height = mat.rows;// ucharfbc::Mat1Gray mat1(height, width, mat.data);fbc::Mat1Gray mat2(mat1);fbc::Mat3BGR mat3(height, width);fbc::cvtColor(mat2, mat3, fbc::CV_GRAY2BGR);cv::Mat mat1_(height, width, CV_8UC1, mat.data);cv::Mat mat2_;mat1_.copyTo(mat2_);cv::Mat mat3_(height, width, CV_8UC3);cv::cvtColor(mat2_, mat3_, CV_GRAY2BGR);assert(mat3.step == mat3_.step);for (int y = 0; y < mat3.rows; y++) {const fbc::uchar* p = mat3.ptr(y);const uchar* p_ = mat3_.ptr(y);for (int x = 0; x < mat3.step; x++) {assert(p[x] == p_[x]);}}// floatcv::Mat matf;mat.convertTo(matf, CV_32FC1);fbc::Mat_<float, 1> mat4(height, width, matf.data);fbc::Mat_<float, 1> mat5(mat4);fbc::Mat_<float, 3> mat6(height, width);fbc::cvtColor(mat5, mat6, fbc::CV_GRAY2BGR);cv::Mat mat4_(height, width, CV_32FC1, matf.data);cv::Mat mat5_;mat4_.copyTo(mat5_);cv::Mat mat6_(height, width, CV_32FC3);cv::cvtColor(mat5_, mat6_, CV_GRAY2BGR);assert(mat6.step == mat6_.step);for (int y = 0; y < mat6.rows; y++) {const fbc::uchar* p = mat6.ptr(y);const uchar* p_ = mat6_.ptr(y);for (int x = 0; x < mat6.step; x++) {assert(p[x] == p_[x]);}}return 0;
}int test_cvtColor_RGB2YCrCb()
{cv::Mat mat = cv::imread("E:/GitCode/OpenCV_Test/test_images/lena.png", 1);if (!mat.data) {std::cout << "read image fail" << std::endl;return -1;}int width = mat.cols;int height = mat.rows;// ucharfbc::Mat3BGR mat1(height, width, mat.data);fbc::Mat3BGR mat2(mat1);fbc::Mat_<uchar, 3> mat3(height, width);fbc::cvtColor(mat2, mat3, fbc::CV_BGR2YCrCb);cv::Mat mat1_(height, width, CV_8UC3, mat.data);cv::Mat mat2_;mat1_.copyTo(mat2_);cv::Mat mat3_(height, width, CV_8UC3);cv::cvtColor(mat2_, mat3_, CV_BGR2YCrCb);assert(mat3.step == mat3_.step);for (int y = 0; y < mat3.rows; y++) {const fbc::uchar* p = mat3.ptr(y);const uchar* p_ = mat3_.ptr(y);for (int x = 0; x < mat3.step; x++) {assert(p[x] == p_[x]);}}// floatcv::Mat matf;mat.convertTo(matf, CV_32FC3);fbc::Mat_<float, 3> mat4(height, width, matf.data);fbc::Mat_<float, 3> mat5(mat4);fbc::Mat_<float, 3> mat6(height, width);fbc::cvtColor(mat5, mat6, fbc::CV_BGR2YCrCb);cv::Mat mat4_(height, width, CV_32FC3, matf.data);cv::Mat mat5_;mat4_.copyTo(mat5_);cv::Mat mat6_(height, width, CV_32FC3);cv::cvtColor(mat5_, mat6_, CV_BGR2YCrCb);assert(mat6.step == mat6_.step);for (int y = 0; y < mat6.rows; y++) {const fbc::uchar* p = mat6.ptr(y);const uchar* p_ = mat6_.ptr(y);for (int x = 0; x < mat6.step; x++) {assert(p[x] == p_[x]);}}return 0;
}int test_cvtColor_YCrCb2RGB()
{cv::Mat mat = cv::imread("E:/GitCode/OpenCV_Test/test_images/lena.png", 1);if (!mat.data) {std::cout << "read image fail" << std::endl;return -1;}cv::cvtColor(mat, mat, CV_BGR2YCrCb);int width = mat.cols;int height = mat.rows;// ucharfbc::Mat_<uchar, 3> mat1(height, width, mat.data);fbc::Mat_<uchar, 3> mat2(mat1);fbc::Mat3BGR mat3(height, width);fbc::cvtColor(mat2, mat3, fbc::CV_YCrCb2BGR);cv::Mat mat1_(height, width, CV_8UC3, mat.data);cv::Mat mat2_;mat1_.copyTo(mat2_);cv::Mat mat3_(height, width, CV_8UC3);cv::cvtColor(mat2_, mat3_, CV_YCrCb2BGR);assert(mat3.step == mat3_.step);for (int y = 0; y < mat3.rows; y++) {const fbc::uchar* p = mat3.ptr(y);const uchar* p_ = mat3_.ptr(y);for (int x = 0; x < mat3.step; x++) {assert(p[x] == p_[x]);}}// floatcv::Mat matf;mat.convertTo(matf, CV_32FC3);fbc::Mat_<float, 3> mat4(height, width, matf.data);fbc::Mat_<float, 3> mat5(mat4);fbc::Mat_<float, 3> mat6(height, width);fbc::cvtColor(mat5, mat6, fbc::CV_YCrCb2BGR);cv::Mat mat4_(height, width, CV_32FC3, matf.data);cv::Mat mat5_;mat4_.copyTo(mat5_);cv::Mat mat6_(height, width, CV_32FC3);cv::cvtColor(mat5_, mat6_, CV_YCrCb2BGR);assert(mat6.step == mat6_.step);for (int y = 0; y < mat6.rows; y++) {const fbc::uchar* p = mat6.ptr(y);const uchar* p_ = mat6_.ptr(y);for (int x = 0; x < mat6.step; x++) {assert(p[x] == p_[x]);}}return 0;
}int test_cvtColor_RGB2XYZ()
{cv::Mat mat = cv::imread("E:/GitCode/OpenCV_Test/test_images/lena.png", 1);if (!mat.data) {std::cout << "read image fail" << std::endl;return -1;}int width = mat.cols;int height = mat.rows;// ucharfbc::Mat_<uchar, 3> mat1(height, width, mat.data);fbc::Mat_<uchar, 3> mat2(mat1);fbc::Mat_<uchar, 3> mat3(height, width);fbc::cvtColor(mat2, mat3, fbc::CV_BGR2XYZ);cv::Mat mat1_(height, width, CV_8UC3, mat.data);cv::Mat mat2_;mat1_.copyTo(mat2_);cv::Mat mat3_(height, width, CV_8UC3);cv::cvtColor(mat2_, mat3_, CV_BGR2XYZ);assert(mat3.step == mat3_.step);for (int y = 0; y < mat3.rows; y++) {const fbc::uchar* p = mat3.ptr(y);const uchar* p_ = mat3_.ptr(y);for (int x = 0; x < mat3.step; x++) {assert(p[x] == p_[x]);}}// floatcv::Mat matf;mat.convertTo(matf, CV_32FC3);fbc::Mat_<float, 3> mat4(height, width, matf.data);fbc::Mat_<float, 3> mat5(mat4);fbc::Mat_<float, 3> mat6(height, width);fbc::cvtColor(mat5, mat6, fbc::CV_BGR2XYZ);cv::Mat mat4_(height, width, CV_32FC3, matf.data);cv::Mat mat5_;mat4_.copyTo(mat5_);cv::Mat mat6_(height, width, CV_32FC3);cv::cvtColor(mat5_, mat6_, CV_BGR2XYZ);assert(mat6.step == mat6_.step);for (int y = 0; y < mat6.rows; y++) {const fbc::uchar* p = mat6.ptr(y);const uchar* p_ = mat6_.ptr(y);for (int x = 0; x < mat6.step; x++) {assert(p[x] == p_[x]);}}return 0;
}int test_cvtColor_XYZ2RGB()
{cv::Mat mat = cv::imread("E:/GitCode/OpenCV_Test/test_images/lena.png", 1);if (!mat.data) {std::cout << "read image fail" << std::endl;return -1;}cv::cvtColor(mat, mat, CV_BGR2XYZ);int width = mat.cols;int height = mat.rows;// ucharfbc::Mat_<uchar, 3> mat1(height, width, mat.data);fbc::Mat_<uchar, 3> mat2(mat1);fbc::Mat_<uchar, 3> mat3(height, width);fbc::cvtColor(mat2, mat3, fbc::CV_XYZ2BGR);cv::Mat mat1_(height, width, CV_8UC3, mat.data);cv::Mat mat2_;mat1_.copyTo(mat2_);cv::Mat mat3_(height, width, CV_8UC3);cv::cvtColor(mat2_, mat3_, CV_XYZ2BGR);assert(mat3.step == mat3_.step);for (int y = 0; y < mat3.rows; y++) {const fbc::uchar* p = mat3.ptr(y);const uchar* p_ = mat3_.ptr(y);for (int x = 0; x < mat3.step; x++) {assert(p[x] == p_[x]);}}// floatcv::Mat matf;mat.convertTo(matf, CV_32FC3);fbc::Mat_<float, 3> mat4(height, width, matf.data);fbc::Mat_<float, 3> mat5(mat4);fbc::Mat_<float, 3> mat6(height, width);fbc::cvtColor(mat5, mat6, fbc::CV_XYZ2BGR);cv::Mat mat4_(height, width, CV_32FC3, matf.data);cv::Mat mat5_;mat4_.copyTo(mat5_);cv::Mat mat6_(height, width, CV_32FC3);cv::cvtColor(mat5_, mat6_, CV_XYZ2BGR);assert(mat6.step == mat6_.step);for (int y = 0; y < mat6.rows; y++) {const fbc::uchar* p = mat6.ptr(y);const uchar* p_ = mat6_.ptr(y);for (int x = 0; x < mat6.step; x++) {assert(p[x] == p_[x]);}}return 0;
}int test_cvtColor_RGB2HSV()
{cv::Mat mat = cv::imread("E:/GitCode/OpenCV_Test/test_images/lena.png", 1);if (!mat.data) {std::cout << "read image fail" << std::endl;return -1;}int code[] = { fbc::CV_BGR2HSV, fbc::CV_BGR2HLS };for (int i = 0; i < 2; i++) {int width = mat.cols;int height = mat.rows;// ucharfbc::Mat_<uchar, 3> mat1(height, width, mat.data);fbc::Mat_<uchar, 3> mat2(mat1);fbc::Mat_<uchar, 3> mat3(height, width);fbc::cvtColor(mat2, mat3, code[i]);cv::Mat mat1_(height, width, CV_8UC3, mat.data);cv::Mat mat2_;mat1_.copyTo(mat2_);cv::Mat mat3_(height, width, CV_8UC3);cv::cvtColor(mat2_, mat3_, code[i]);assert(mat3.step == mat3_.step);for (int y = 0; y < mat3.rows; y++) {const fbc::uchar* p = mat3.ptr(y);const uchar* p_ = mat3_.ptr(y);for (int x = 0; x < mat3.step; x++) {assert(p[x] == p_[x]);}}// floatcv::Mat matf;mat.convertTo(matf, CV_32FC3);fbc::Mat_<float, 3> mat4(height, width, matf.data);fbc::Mat_<float, 3> mat5(mat4);fbc::Mat_<float, 3> mat6(height, width);fbc::cvtColor(mat5, mat6, code[i]);cv::Mat mat4_(height, width, CV_32FC3, matf.data);cv::Mat mat5_;mat4_.copyTo(mat5_);cv::Mat mat6_(height, width, CV_32FC3);cv::cvtColor(mat5_, mat6_, code[i]);assert(mat6.step == mat6_.step);for (int y = 0; y < mat6.rows; y++) {const fbc::uchar* p = mat6.ptr(y);const uchar* p_ = mat6_.ptr(y);for (int x = 0; x < mat6.step; x++) {assert(p[x] == p_[x]);}}}return 0;
}int test_cvtColor_HSV2RGB()
{cv::Mat mat = cv::imread("E:/GitCode/OpenCV_Test/test_images/lena.png", 1);if (!mat.data) {std::cout << "read image fail" << std::endl;return -1;}int code[] = { fbc::CV_HSV2BGR, fbc::CV_HLS2BGR };int code1[] = { fbc::CV_BGR2HSV, fbc::CV_BGR2HLS };for (int i = 0; i < 2; i++) {cv::cvtColor(mat, mat, code1[i]);int width = mat.cols;int height = mat.rows;// ucharfbc::Mat_<uchar, 3> mat1(height, width, mat.data);fbc::Mat_<uchar, 3> mat2(mat1);fbc::Mat_<uchar, 3> mat3(height, width);fbc::cvtColor(mat2, mat3, code[i]);cv::Mat mat1_(height, width, CV_8UC3, mat.data);cv::Mat mat2_;mat1_.copyTo(mat2_);cv::Mat mat3_(height, width, CV_8UC3);cv::cvtColor(mat2_, mat3_, code[i]);assert(mat3.step == mat3_.step);for (int y = 0; y < mat3.rows; y++) {const fbc::uchar* p = mat3.ptr(y);const uchar* p_ = mat3_.ptr(y);for (int x = 0; x < mat3.step; x++) {assert(p[x] == p_[x]);}}// floatcv::Mat matf;mat.convertTo(matf, CV_32FC3);fbc::Mat_<float, 3> mat4(height, width, matf.data);fbc::Mat_<float, 3> mat5(mat4);fbc::Mat_<float, 3> mat6(height, width);fbc::cvtColor(mat5, mat6, code[i]);cv::Mat mat4_(height, width, CV_32FC3, matf.data);cv::Mat mat5_;mat4_.copyTo(mat5_);cv::Mat mat6_(height, width, CV_32FC3);cv::cvtColor(mat5_, mat6_, code[i]);assert(mat6.step == mat6_.step);for (int y = 0; y < mat6.rows; y++) {const fbc::uchar* p = mat6.ptr(y);const uchar* p_ = mat6_.ptr(y);for (int x = 0; x < mat6.step; x++) {assert(p[x] == p_[x]);}}}return 0;
}int test_cvtColor_RGB2Lab()
{cv::Mat mat = cv::imread("E:/GitCode/OpenCV_Test/test_images/lena.png", 1);if (!mat.data) {std::cout << "read image fail" << std::endl;return -1;}int code[] = { fbc::CV_BGR2Lab, fbc::CV_BGR2Luv };for (int i = 0; i < 2; i++) {int width = mat.cols;int height = mat.rows;// ucharfbc::Mat_<uchar, 3> mat1(height, width, mat.data);fbc::Mat_<uchar, 3> mat2(mat1);fbc::Mat_<uchar, 3> mat3(height, width);fbc::cvtColor(mat2, mat3, code[i]);cv::Mat mat1_(height, width, CV_8UC3, mat.data);cv::Mat mat2_;mat1_.copyTo(mat2_);cv::Mat mat3_(height, width, CV_8UC3);cv::cvtColor(mat2_, mat3_, code[i]);assert(mat3.step == mat3_.step);for (int y = 0; y < mat3.rows; y++) {const fbc::uchar* p = mat3.ptr(y);const uchar* p_ = mat3_.ptr(y);for (int x = 0; x < mat3.step; x++) {assert(p[x] == p_[x]);}}// floatcv::Mat matf;mat.convertTo(matf, CV_32FC3);fbc::Mat_<float, 3> mat4(height, width, matf.data);fbc::Mat_<float, 3> mat5(mat4);fbc::Mat_<float, 3> mat6(height, width);fbc::cvtColor(mat5, mat6, code[i]);cv::Mat mat4_(height, width, CV_32FC3, matf.data);cv::Mat mat5_;mat4_.copyTo(mat5_);cv::Mat mat6_(height, width, CV_32FC3);cv::cvtColor(mat5_, mat6_, code[i]);assert(mat6.step == mat6_.step);for (int y = 0; y < mat6.rows; y++) {const fbc::uchar* p = mat6.ptr(y);const uchar* p_ = mat6_.ptr(y);for (int x = 0; x < mat6.step; x++) {assert(p[x] == p_[x]);}}}
}int test_cvtColor_Lab2RGB()
{cv::Mat mat = cv::imread("E:/GitCode/OpenCV_Test/test_images/lena.png", 1);if (!mat.data) {std::cout << "read image fail" << std::endl;return -1;}int code[] = { fbc::CV_Lab2BGR, fbc::CV_Luv2BGR };int code1[] = { fbc::CV_BGR2Lab, fbc::CV_BGR2Luv };for (int i = 0; i < 2; i++) {cv::cvtColor(mat, mat, code1[i]);int width = mat.cols;int height = mat.rows;// ucharfbc::Mat_<uchar, 3> mat1(height, width, mat.data);fbc::Mat_<uchar, 3> mat2(mat1);fbc::Mat_<uchar, 3> mat3(height, width);fbc::cvtColor(mat2, mat3, code[i]);cv::Mat mat1_(height, width, CV_8UC3, mat.data);cv::Mat mat2_;mat1_.copyTo(mat2_);cv::Mat mat3_(height, width, CV_8UC3);cv::cvtColor(mat2_, mat3_, code[i]);assert(mat3.step == mat3_.step);for (int y = 0; y < mat3.rows; y++) {const fbc::uchar* p = mat3.ptr(y);const uchar* p_ = mat3_.ptr(y);for (int x = 0; x < mat3.step; x++) {assert(p[x] == p_[x]);}}// floatcv::Mat matf;mat.convertTo(matf, CV_32FC3);fbc::Mat_<float, 3> mat4(height, width, matf.data);fbc::Mat_<float, 3> mat5(mat4);fbc::Mat_<float, 3> mat6(height, width);fbc::cvtColor(mat5, mat6, code[i]);cv::Mat mat4_(height, width, CV_32FC3, matf.data);cv::Mat mat5_;mat4_.copyTo(mat5_);cv::Mat mat6_(height, width, CV_32FC3);cv::cvtColor(mat5_, mat6_, code[i]);assert(mat6.step == mat6_.step);for (int y = 0; y < mat6.rows; y++) {const fbc::uchar* p = mat6.ptr(y);const uchar* p_ = mat6_.ptr(y);for (int x = 0; x < mat6.step; x++) {assert(p[x] == p_[x]);}}}return 0;
}int test_cvtColor_YUV2BGR()
{cv::Mat mat = cv::imread("E:/GitCode/OpenCV_Test/test_images/lena.png", 1);if (!mat.data) {std::cout << "read image fail" << std::endl;return -1;}cv::cvtColor(mat, mat, CV_BGR2YUV_I420);int width = mat.cols;int height = mat.rows;int newHeight = height * 2 / 3;// ucharfbc::Mat_<uchar, 1> mat1(height, width, mat.data);fbc::Mat_<uchar, 1> mat2(mat1);fbc::Mat_<uchar, 3> mat3(newHeight, width);fbc::cvtColor(mat2, mat3, fbc::CV_YUV2BGR_I420);cv::Mat mat1_(height, width, CV_8UC1, mat.data);cv::Mat mat2_;mat1_.copyTo(mat2_);cv::Mat mat3_(newHeight, width, CV_8UC3);cv::cvtColor(mat2_, mat3_, CV_YUV2BGR_I420);assert(mat3.step == mat3_.step);for (int y = 0; y < mat3.rows; y++) {const fbc::uchar* p = mat3.ptr(y);const uchar* p_ = mat3_.ptr(y);for (int x = 0; x < mat3.step; x++) {assert(p[x] == p_[x]);}}return 0;
}int test_cvtColor_BGR2YUV()
{cv::Mat mat = cv::imread("E:/GitCode/OpenCV_Test/test_images/lena.png", 1);if (!mat.data) {std::cout << "read image fail" << std::endl;return -1;}int width = mat.cols;int height = mat.rows;int newHeight = height / 2 * 3;// ucharfbc::Mat_<uchar, 3> mat1(height, width, mat.data);fbc::Mat_<uchar, 3> mat2(mat1);fbc::Mat_<uchar, 1> mat3(newHeight, width);fbc::cvtColor(mat2, mat3, fbc::CV_BGR2YUV_YV12);cv::Mat mat1_(height, width, CV_8UC3, mat.data);cv::Mat mat2_;mat1_.copyTo(mat2_);cv::Mat mat3_(newHeight, width, CV_8UC1);cv::cvtColor(mat2_, mat3_, CV_BGR2YUV_YV12);assert(mat3.step == mat3_.step);for (int y = 0; y < mat3.rows; y++) {const fbc::uchar* p = mat3.ptr(y);const uchar* p_ = mat3_.ptr(y);for (int x = 0; x < mat3.step; x++) {assert(p[x] == p_[x]);}}return 0;
}int test_cvtColor_YUV2Gray()
{cv::Mat mat = cv::imread("E:/GitCode/OpenCV_Test/test_images/lena.png", 1);if (!mat.data) {std::cout << "read image fail" << std::endl;return -1;}cv::cvtColor(mat, mat, CV_BGRA2YUV_I420);int width = mat.cols;int height = mat.rows;int newHeight = height * 2 / 3;// ucharfbc::Mat_<uchar, 1> mat1(height, width, mat.data);fbc::Mat_<uchar, 1> mat2(mat1);fbc::Mat_<uchar, 1> mat3(newHeight, width);fbc::cvtColor(mat2, mat3, fbc::CV_YUV2GRAY_420);cv::Mat mat1_(height, width, CV_8UC1, mat.data);cv::Mat mat2_;mat1_.copyTo(mat2_);cv::Mat mat3_(newHeight, width, CV_8UC1);cv::cvtColor(mat2_, mat3_, CV_YUV2GRAY_420);assert(mat3.step == mat3_.step);for (int y = 0; y < mat3.rows; y++) {const fbc::uchar* p = mat3.ptr(y);const uchar* p_ = mat3_.ptr(y);for (int x = 0; x < mat3.step; x++) {assert(p[x] == p_[x]);}}return 0;
}

GitHub: https://github.com/fengbingchun/OpenCV_Test

總結

以上是生活随笔為你收集整理的OpenCV代码提取:cvtColor函数的实现的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

歡迎分享!

轉載請說明來源于"生活随笔",并保留原作者的名字。

本文地址:OpenCV代码提取:cvtColor函数的实现

18禁黄网站男男禁片免费观看 | 奇米综合四色77777久久 东京无码熟妇人妻av在线网址 | 欧美人与物videos另类 | 国内精品久久久久久中文字幕 | 色偷偷人人澡人人爽人人模 | 精品人妻人人做人人爽 | 免费无码肉片在线观看 | 欧美日韩一区二区免费视频 | 亚洲欧洲无卡二区视頻 | а√天堂www在线天堂小说 | 国产成人综合美国十次 | 成人女人看片免费视频放人 | 亚洲精品久久久久avwww潮水 | 四虎影视成人永久免费观看视频 | 国产亚洲美女精品久久久2020 | 欧美国产日韩亚洲中文 | 无码中文字幕色专区 | 中文字幕乱码人妻无码久久 | 国产人妻精品一区二区三区 | 亚洲成在人网站无码天堂 | 欧美性生交xxxxx久久久 | 欧美猛少妇色xxxxx | 国精产品一品二品国精品69xx | 亚洲熟妇色xxxxx欧美老妇 | 日产精品高潮呻吟av久久 | 日日碰狠狠丁香久燥 | 性啪啪chinese东北女人 | 99精品无人区乱码1区2区3区 | 久久 国产 尿 小便 嘘嘘 | 精品久久久无码人妻字幂 | 国产精品爱久久久久久久 | 97夜夜澡人人双人人人喊 | 99麻豆久久久国产精品免费 | 亚洲综合精品香蕉久久网 | 性做久久久久久久免费看 | 中文亚洲成a人片在线观看 | 日韩无码专区 | 亚洲午夜无码久久 | 亚洲国产av精品一区二区蜜芽 | 麻豆国产人妻欲求不满谁演的 | 无码吃奶揉捏奶头高潮视频 | 日产国产精品亚洲系列 | 久久99精品国产.久久久久 | 中文字幕无码人妻少妇免费 | 久久午夜无码鲁丝片午夜精品 | 日本欧美一区二区三区乱码 | 国色天香社区在线视频 | 日韩精品a片一区二区三区妖精 | 久久精品99久久香蕉国产色戒 | ass日本丰满熟妇pics | 中文字幕中文有码在线 | 一本大道伊人av久久综合 | 久久久久久九九精品久 | 国产一区二区三区影院 | 色综合久久88色综合天天 | 久久99精品久久久久久 | 久久天天躁夜夜躁狠狠 | 婷婷色婷婷开心五月四房播播 | 久久国语露脸国产精品电影 | 国精产品一品二品国精品69xx | 国产成人精品三级麻豆 | 国内精品久久久久久中文字幕 | 久久精品国产精品国产精品污 | 蜜桃av抽搐高潮一区二区 | 亚洲精品无码人妻无码 | 人人澡人人透人人爽 | 久久99热只有频精品8 | 永久免费精品精品永久-夜色 | 亚洲伊人久久精品影院 | 国产精品无码成人午夜电影 | 亚洲精品国产精品乱码视色 | 2019午夜福利不卡片在线 | 未满小14洗澡无码视频网站 | 任你躁在线精品免费 | 蜜桃无码一区二区三区 | 中文字幕乱码人妻二区三区 | 亚洲欧洲中文日韩av乱码 | 国产偷国产偷精品高清尤物 | 欧美自拍另类欧美综合图片区 | 久久久久免费看成人影片 | 国产特级毛片aaaaaa高潮流水 | 国产av剧情md精品麻豆 | 性史性农村dvd毛片 | 国产精品手机免费 | 又黄又爽又色的视频 | 亚洲人成影院在线无码按摩店 | 牲欲强的熟妇农村老妇女 | 国内综合精品午夜久久资源 | 国产超级va在线观看视频 | 搡女人真爽免费视频大全 | 国产肉丝袜在线观看 | 久久www免费人成人片 | 国产成人无码a区在线观看视频app | 我要看www免费看插插视频 | 少妇性荡欲午夜性开放视频剧场 | 国产婷婷色一区二区三区在线 | 大地资源中文第3页 | 搡女人真爽免费视频大全 | 亚洲国产精品美女久久久久 | 亚洲阿v天堂在线 | 亚洲s色大片在线观看 | 久久久久se色偷偷亚洲精品av | 久久久久亚洲精品中文字幕 | 少妇的肉体aa片免费 | 蜜桃视频韩日免费播放 | 久久久久se色偷偷亚洲精品av | 国产免费久久久久久无码 | 少妇激情av一区二区 | 国产特级毛片aaaaaa高潮流水 | 国产乱人伦av在线无码 | 国产人妻精品午夜福利免费 | 国产av无码专区亚洲a∨毛片 | 国产无遮挡吃胸膜奶免费看 | 成人欧美一区二区三区 | 亚洲中文字幕无码一久久区 | 纯爱无遮挡h肉动漫在线播放 | 久久精品人妻少妇一区二区三区 | 97久久国产亚洲精品超碰热 | 99国产精品白浆在线观看免费 | 国产另类ts人妖一区二区 | 成人性做爰aaa片免费看 | 精品人妻av区 | 亚洲精品成人福利网站 | 国产成人无码一二三区视频 | 日产精品99久久久久久 | 色综合视频一区二区三区 | 国精产品一品二品国精品69xx | 国产精品人人爽人人做我的可爱 | 午夜精品久久久久久久久 | 国内精品久久毛片一区二区 | 久久人人爽人人人人片 | 亚洲日韩av片在线观看 | 97夜夜澡人人双人人人喊 | 偷窥村妇洗澡毛毛多 | 性欧美videos高清精品 | 玩弄人妻少妇500系列视频 | 中文字幕av无码一区二区三区电影 | 内射巨臀欧美在线视频 | 久久aⅴ免费观看 | 国内精品九九久久久精品 | 久久午夜夜伦鲁鲁片无码免费 | 国产亚洲精品久久久久久久久动漫 | 美女极度色诱视频国产 | 精品久久久久久人妻无码中文字幕 | 国产办公室秘书无码精品99 | 亚洲爆乳大丰满无码专区 | 国产高清不卡无码视频 | 国内精品九九久久久精品 | 色欲综合久久中文字幕网 | 亚洲自偷自偷在线制服 | 中国女人内谢69xxxxxa片 | 中文字幕乱码亚洲无线三区 | 国产人妻精品一区二区三区不卡 | 捆绑白丝粉色jk震动捧喷白浆 | 熟妇女人妻丰满少妇中文字幕 | 亚洲中文字幕成人无码 | 午夜精品久久久内射近拍高清 | 大肉大捧一进一出好爽视频 | 精品久久久无码人妻字幂 | 乱人伦人妻中文字幕无码 | 亚洲欧美精品伊人久久 | 少妇被黑人到高潮喷出白浆 | www一区二区www免费 | 亚洲熟妇色xxxxx亚洲 | 无码午夜成人1000部免费视频 | 日韩精品无码一区二区中文字幕 | 蜜桃无码一区二区三区 | 国产色在线 | 国产 | 又大又黄又粗又爽的免费视频 | 成 人影片 免费观看 | 在线а√天堂中文官网 | 曰韩少妇内射免费播放 | 亚洲小说图区综合在线 | 狠狠色丁香久久婷婷综合五月 | 久久综合激激的五月天 | 丝袜 中出 制服 人妻 美腿 | 国产精品亚洲综合色区韩国 | 荫蒂添的好舒服视频囗交 | 国产无av码在线观看 | 日日碰狠狠丁香久燥 | 久9re热视频这里只有精品 | 国产精品福利视频导航 | 久久精品国产一区二区三区 | 蜜臀aⅴ国产精品久久久国产老师 | 国产精品永久免费视频 | 蜜桃臀无码内射一区二区三区 | 日本熟妇浓毛 | 国产黄在线观看免费观看不卡 | 在线观看国产午夜福利片 | 男女性色大片免费网站 | 一本一道久久综合久久 | 丝袜人妻一区二区三区 | 少妇性l交大片欧洲热妇乱xxx | 亚洲国产欧美在线成人 | 国产在线精品一区二区三区直播 | 中文字幕亚洲情99在线 | 久久久久免费精品国产 | 大屁股大乳丰满人妻 | 亚洲高清偷拍一区二区三区 | 无码纯肉视频在线观看 | 免费乱码人妻系列无码专区 | 人妻中文无码久热丝袜 | 亚洲国产成人av在线观看 | 欧美黑人性暴力猛交喷水 | 欧美野外疯狂做受xxxx高潮 | 国产亚洲精品久久久久久国模美 | 欧美zoozzooz性欧美 | 一本大道伊人av久久综合 | 亚洲狠狠色丁香婷婷综合 | 色狠狠av一区二区三区 | 国产极品美女高潮无套在线观看 | 蜜桃无码一区二区三区 | 高清不卡一区二区三区 | 久久精品中文闷骚内射 | 日韩精品久久久肉伦网站 | 国产99久久精品一区二区 | 精品人人妻人人澡人人爽人人 | 亚洲精品国偷拍自产在线观看蜜桃 | 亚洲gv猛男gv无码男同 | 久久久久久九九精品久 | 小鲜肉自慰网站xnxx | 欧美老人巨大xxxx做受 | 性史性农村dvd毛片 | 亚洲精品综合五月久久小说 | 少女韩国电视剧在线观看完整 | 日日噜噜噜噜夜夜爽亚洲精品 | 久久www免费人成人片 | 亚洲啪av永久无码精品放毛片 | 亚洲码国产精品高潮在线 | 亚洲s色大片在线观看 | 99精品视频在线观看免费 | 九月婷婷人人澡人人添人人爽 | 老太婆性杂交欧美肥老太 | 色综合久久中文娱乐网 | 98国产精品综合一区二区三区 | 欧美老熟妇乱xxxxx | 亚洲精品欧美二区三区中文字幕 | 亚洲欧洲无卡二区视頻 | 亚洲一区二区三区四区 | 精品久久久无码中文字幕 | 亚洲中文字幕无码中字 | 无码国产激情在线观看 | 国产成人无码av一区二区 | 国产精品美女久久久 | 日本熟妇乱子伦xxxx | 自拍偷自拍亚洲精品10p | 免费国产黄网站在线观看 | 男人扒开女人内裤强吻桶进去 | 亚洲日韩av一区二区三区四区 | 久9re热视频这里只有精品 | √8天堂资源地址中文在线 | 中文字幕日产无线码一区 | 天堂а√在线中文在线 | 国产精品久久久久久无码 | 成熟妇人a片免费看网站 | 国产真实伦对白全集 | 内射爽无广熟女亚洲 | 亚洲中文字幕久久无码 | 人人爽人人爽人人片av亚洲 | 99久久婷婷国产综合精品青草免费 | 中国女人内谢69xxxxxa片 | 色婷婷av一区二区三区之红樱桃 | 日韩欧美中文字幕公布 | 成人欧美一区二区三区黑人免费 | 精品人妻中文字幕有码在线 | 美女扒开屁股让男人桶 | 少妇无码一区二区二三区 | √天堂资源地址中文在线 | 蜜臀av在线观看 在线欧美精品一区二区三区 | 性欧美牲交xxxxx视频 | 亚洲人成影院在线无码按摩店 | 免费人成在线观看网站 | 色妞www精品免费视频 | 香港三级日本三级妇三级 | 99久久亚洲精品无码毛片 | 成人女人看片免费视频放人 | 性做久久久久久久免费看 | av人摸人人人澡人人超碰下载 | 强辱丰满人妻hd中文字幕 | 日产国产精品亚洲系列 | 欧美真人作爱免费视频 | 18禁止看的免费污网站 | 久久人人爽人人爽人人片av高清 | 人妻少妇被猛烈进入中文字幕 | 欧美性生交xxxxx久久久 | 青青草原综合久久大伊人精品 | 无码av中文字幕免费放 | 丰满人妻被黑人猛烈进入 | 色老头在线一区二区三区 | 国产熟妇另类久久久久 | 久久综合九色综合97网 | 亚洲成av人综合在线观看 | 99视频精品全部免费免费观看 | 久久这里只有精品视频9 | 国产乱子伦视频在线播放 | 丰满人妻一区二区三区免费视频 | 欧美日韩综合一区二区三区 | 亚洲日韩乱码中文无码蜜桃臀网站 | 任你躁国产自任一区二区三区 | 久久久久久久女国产乱让韩 | 亚洲精品中文字幕久久久久 | 亚洲中文字幕av在天堂 | 精品乱子伦一区二区三区 | 97无码免费人妻超级碰碰夜夜 | 亚洲成a人片在线观看日本 | 免费观看激色视频网站 | 亚洲国产精品无码一区二区三区 | 欧美35页视频在线观看 | 亚洲欧洲无卡二区视頻 | 国产va免费精品观看 | 国产一区二区三区影院 | 娇妻被黑人粗大高潮白浆 | 久久久久免费精品国产 | 亚洲色成人中文字幕网站 | 99久久久无码国产aaa精品 | 性史性农村dvd毛片 | 麻花豆传媒剧国产免费mv在线 | 好爽又高潮了毛片免费下载 | 亚洲欧美日韩综合久久久 | 色婷婷香蕉在线一区二区 | 欧美日韩在线亚洲综合国产人 | 精品日本一区二区三区在线观看 | 偷窥日本少妇撒尿chinese | 欧美日韩在线亚洲综合国产人 | 男人和女人高潮免费网站 | 久久久久久久女国产乱让韩 | 亚洲熟妇色xxxxx欧美老妇y | 三上悠亚人妻中文字幕在线 | 奇米影视7777久久精品人人爽 | 精品国产青草久久久久福利 | 久久精品一区二区三区四区 | 亚洲色www成人永久网址 | 成人精品视频一区二区三区尤物 | 亚洲国产精品一区二区第一页 | 少妇厨房愉情理9仑片视频 | 久久亚洲日韩精品一区二区三区 | 人妻少妇精品无码专区动漫 | 久久久www成人免费毛片 | 四十如虎的丰满熟妇啪啪 | 最近中文2019字幕第二页 | 在线精品亚洲一区二区 | 18精品久久久无码午夜福利 | 久久久久av无码免费网 | 色一情一乱一伦一区二区三欧美 | 正在播放老肥熟妇露脸 | 亚洲国产一区二区三区在线观看 | 国产绳艺sm调教室论坛 | 婷婷六月久久综合丁香 | 亚洲精品一区二区三区在线观看 | 特大黑人娇小亚洲女 | 国产免费无码一区二区视频 | 久久99精品久久久久久 | 欧美日韩视频无码一区二区三 | 久久综合给久久狠狠97色 | 国产精品久久久久久久9999 | 无码av最新清无码专区吞精 | 日韩欧美群交p片內射中文 | 久久精品国产亚洲精品 | 免费视频欧美无人区码 | 国产成人无码午夜视频在线观看 | 午夜福利一区二区三区在线观看 | 国产成人无码区免费内射一片色欲 | 丝袜美腿亚洲一区二区 | 蜜臀av无码人妻精品 | 1000部夫妻午夜免费 | 呦交小u女精品视频 | 国产欧美亚洲精品a | 97精品人妻一区二区三区香蕉 | 荡女精品导航 | 国产农村乱对白刺激视频 | 中文字幕无码人妻少妇免费 | 婷婷五月综合缴情在线视频 | 老司机亚洲精品影院无码 | 无码中文字幕色专区 | 久久午夜无码鲁丝片 | 欧洲熟妇精品视频 | 亚洲男人av天堂午夜在 | 麻花豆传媒剧国产免费mv在线 | 内射后入在线观看一区 | 九九久久精品国产免费看小说 | 兔费看少妇性l交大片免费 | 国产免费无码一区二区视频 | 在线视频网站www色 | 天堂在线观看www | 丰满人妻翻云覆雨呻吟视频 | 亚洲aⅴ无码成人网站国产app | 18无码粉嫩小泬无套在线观看 | 久久久久久亚洲精品a片成人 | 国产成人无码午夜视频在线观看 | 国产午夜精品一区二区三区嫩草 | 东北女人啪啪对白 | 人人妻人人藻人人爽欧美一区 | 色婷婷av一区二区三区之红樱桃 | 乱人伦人妻中文字幕无码 | 亚洲熟悉妇女xxx妇女av | 日本一卡2卡3卡四卡精品网站 | 久热国产vs视频在线观看 | 久久国产精品萌白酱免费 | 亚洲狠狠婷婷综合久久 | 国产莉萝无码av在线播放 | 无码人妻久久一区二区三区不卡 | 久久久久久久久888 | 亚洲日韩精品欧美一区二区 | 国产小呦泬泬99精品 | 国产成人综合色在线观看网站 | 亚洲s色大片在线观看 | 成人欧美一区二区三区黑人 | 久久久久成人精品免费播放动漫 | 国产综合久久久久鬼色 | 狠狠色丁香久久婷婷综合五月 | 日本乱偷人妻中文字幕 | 日韩欧美中文字幕公布 | 亚洲精品久久久久久一区二区 | 女高中生第一次破苞av | 狠狠色噜噜狠狠狠狠7777米奇 | 少妇无码吹潮 | a在线观看免费网站大全 | 欧美日本精品一区二区三区 | 麻豆国产97在线 | 欧洲 | 东京热无码av男人的天堂 | 精品久久久久久亚洲精品 | 亚洲成av人片天堂网无码】 | 国产乱人伦av在线无码 | 精品日本一区二区三区在线观看 | 一本精品99久久精品77 | 亚洲日韩一区二区 | 亚洲中文字幕无码中文字在线 | 久久久久se色偷偷亚洲精品av | 中文字幕乱码人妻二区三区 | 国内揄拍国内精品人妻 | 性欧美牲交在线视频 | 欧美日本精品一区二区三区 | 大肉大捧一进一出好爽视频 | 国产内射老熟女aaaa | 国产精品-区区久久久狼 | 天天av天天av天天透 | 亚洲日本一区二区三区在线 | 女人色极品影院 | www一区二区www免费 | 国产国语老龄妇女a片 | aⅴ在线视频男人的天堂 | 综合人妻久久一区二区精品 | 377p欧洲日本亚洲大胆 | 久久久中文字幕日本无吗 | 最近免费中文字幕中文高清百度 | 狠狠综合久久久久综合网 | 特黄特色大片免费播放器图片 | 日本爽爽爽爽爽爽在线观看免 | 亚洲色www成人永久网址 | 久久人妻内射无码一区三区 | 久久aⅴ免费观看 | 国产精品久久久久久久影院 | 黑人巨大精品欧美一区二区 | 性色av无码免费一区二区三区 | 国产超碰人人爽人人做人人添 | 美女张开腿让人桶 | 狠狠亚洲超碰狼人久久 | 国产亲子乱弄免费视频 | 欧美老妇与禽交 | 久久综合给久久狠狠97色 | 图片小说视频一区二区 | 福利一区二区三区视频在线观看 | 欧美怡红院免费全部视频 | 天堂无码人妻精品一区二区三区 | 亚洲色偷偷男人的天堂 | 日日噜噜噜噜夜夜爽亚洲精品 | 蜜桃视频韩日免费播放 | 亚洲熟女一区二区三区 | 天天躁日日躁狠狠躁免费麻豆 | 国产精品无码永久免费888 | 久久久精品成人免费观看 | 大乳丰满人妻中文字幕日本 | 中文字幕av日韩精品一区二区 | 在线播放亚洲第一字幕 | а√天堂www在线天堂小说 | 国产真实伦对白全集 | 综合激情五月综合激情五月激情1 | 国产精品毛多多水多 | 高清不卡一区二区三区 | 男女性色大片免费网站 | 无码福利日韩神码福利片 | 亚洲人成影院在线无码按摩店 | 精品成人av一区二区三区 | 久久久久免费精品国产 | 国产av一区二区三区最新精品 | 老子影院午夜伦不卡 | 久久久www成人免费毛片 | 台湾无码一区二区 | 国产精品久久久久久无码 | 欧美性生交xxxxx久久久 | 野外少妇愉情中文字幕 | 99麻豆久久久国产精品免费 | 国产成人无码午夜视频在线观看 | 亚洲午夜福利在线观看 | 精品久久久久久人妻无码中文字幕 | 婷婷五月综合激情中文字幕 | 无码精品国产va在线观看dvd | 精品久久综合1区2区3区激情 | 精品国产一区二区三区av 性色 | 精品 日韩 国产 欧美 视频 | 人妻无码久久精品人妻 | 久久综合网欧美色妞网 | 久久久婷婷五月亚洲97号色 | 狠狠色丁香久久婷婷综合五月 | 国内精品久久毛片一区二区 | 蜜桃视频插满18在线观看 | 亚洲男人av香蕉爽爽爽爽 | 国产口爆吞精在线视频 | 国产成人无码专区 | 久久人人爽人人爽人人片av高清 | 欧美一区二区三区 | 免费国产黄网站在线观看 | 成人影院yy111111在线观看 | 国产精品亚洲а∨无码播放麻豆 | 丰腴饱满的极品熟妇 | 高清国产亚洲精品自在久久 | 丁香花在线影院观看在线播放 | 精品少妇爆乳无码av无码专区 | 亚洲综合在线一区二区三区 | 久久久久久亚洲精品a片成人 | 亚洲精品国偷拍自产在线观看蜜桃 | 婷婷色婷婷开心五月四房播播 | 国产莉萝无码av在线播放 | 亚洲国产综合无码一区 | 亚洲精品一区国产 | 丰满少妇熟乱xxxxx视频 | 精品国产乱码久久久久乱码 | 久久99热只有频精品8 | 国产精品久久久久久亚洲毛片 | 成年美女黄网站色大免费视频 | 亚洲第一网站男人都懂 | 国产精品美女久久久 | 无码人妻精品一区二区三区不卡 | 国产精品.xx视频.xxtv | 少妇一晚三次一区二区三区 | 少妇无套内谢久久久久 | 久久人人97超碰a片精品 | 极品嫩模高潮叫床 | 欧美熟妇另类久久久久久不卡 | 国产av剧情md精品麻豆 | 亚洲爆乳大丰满无码专区 | 中文字幕av无码一区二区三区电影 | 黑人玩弄人妻中文在线 | 少妇性荡欲午夜性开放视频剧场 | 亚洲 高清 成人 动漫 | 国产av一区二区精品久久凹凸 | 久久久久免费精品国产 | 少妇性俱乐部纵欲狂欢电影 | 亚洲综合无码一区二区三区 | 中国女人内谢69xxxxxa片 | 亚欧洲精品在线视频免费观看 | 老司机亚洲精品影院 | 国产福利视频一区二区 | 亚洲午夜福利在线观看 | 夜夜夜高潮夜夜爽夜夜爰爰 | 国产亚洲日韩欧美另类第八页 | 欧美性生交xxxxx久久久 | 欧美xxxx黑人又粗又长 | 色 综合 欧美 亚洲 国产 | 亚洲高清偷拍一区二区三区 | 4hu四虎永久在线观看 | 亚洲国产成人av在线观看 | 成人免费视频视频在线观看 免费 | 亚洲综合伊人久久大杳蕉 | 亚洲熟悉妇女xxx妇女av | 免费人成网站视频在线观看 | 亚洲一区二区三区含羞草 | 东京无码熟妇人妻av在线网址 | 亚洲成av人影院在线观看 | 国产农村乱对白刺激视频 | 大色综合色综合网站 | 欧美日韩一区二区免费视频 | 东北女人啪啪对白 | 国产免费久久久久久无码 | 老司机亚洲精品影院 | 无码国产乱人伦偷精品视频 | 最新版天堂资源中文官网 | 中文字幕精品av一区二区五区 | 无码午夜成人1000部免费视频 | 成人亚洲精品久久久久 | www国产亚洲精品久久网站 | 97资源共享在线视频 | 狠狠色欧美亚洲狠狠色www | 亚洲午夜久久久影院 | yw尤物av无码国产在线观看 | 亚洲成av人在线观看网址 | 亚洲成av人片天堂网无码】 | 精品无码一区二区三区爱欲 | 老熟妇仑乱视频一区二区 | 98国产精品综合一区二区三区 | 日本精品久久久久中文字幕 | 国产精品久久久久影院嫩草 | 中文字幕无码av波多野吉衣 | 麻豆蜜桃av蜜臀av色欲av | 乱人伦中文视频在线观看 | 欧美成人午夜精品久久久 | 婷婷综合久久中文字幕蜜桃三电影 | 双乳奶水饱满少妇呻吟 | 麻豆人妻少妇精品无码专区 | 精品一二三区久久aaa片 | 国产午夜精品一区二区三区嫩草 | 18黄暴禁片在线观看 | 日韩精品无码一区二区中文字幕 | 国产乱人伦偷精品视频 | 一个人免费观看的www视频 | 欧美乱妇无乱码大黄a片 | 波多野结衣aⅴ在线 | 亚洲春色在线视频 | 澳门永久av免费网站 | 天天躁夜夜躁狠狠是什么心态 | 青春草在线视频免费观看 | 亚洲男女内射在线播放 | 无码人妻精品一区二区三区不卡 | 久久久久成人片免费观看蜜芽 | 六月丁香婷婷色狠狠久久 | 在线天堂新版最新版在线8 | 日韩少妇白浆无码系列 | 亚洲中文无码av永久不收费 | 久久五月精品中文字幕 | 国产情侣作爱视频免费观看 | 国产精品久久久久久无码 | 日韩成人一区二区三区在线观看 | 97久久超碰中文字幕 | 亚洲精品成人av在线 | 国产真人无遮挡作爱免费视频 | 精品国产乱码久久久久乱码 | 日韩av无码一区二区三区不卡 | 久久久国产精品无码免费专区 | 国产成人无码av在线影院 | 国产三级久久久精品麻豆三级 | 一个人免费观看的www视频 | 亚洲春色在线视频 | 国产亚洲tv在线观看 | 欧美色就是色 | 免费无码一区二区三区蜜桃大 | 狠狠色噜噜狠狠狠7777奇米 | 国产真实伦对白全集 | 亚洲一区二区三区在线观看网站 | 国产一精品一av一免费 | 色一情一乱一伦一区二区三欧美 | 久久99国产综合精品 | 久久久精品欧美一区二区免费 | 内射白嫩少妇超碰 | 麻豆人妻少妇精品无码专区 | 国产激情无码一区二区 | 亚洲精品一区二区三区四区五区 | www一区二区www免费 | 亚洲 a v无 码免 费 成 人 a v | 国产香蕉97碰碰久久人人 | 麻豆国产人妻欲求不满 | 国产午夜视频在线观看 | 久久久久成人片免费观看蜜芽 | 精品国产青草久久久久福利 | 亚洲无人区午夜福利码高清完整版 | 精品成在人线av无码免费看 | 久久久久久久久888 | 亚洲精品一区二区三区婷婷月 | 国产超级va在线观看视频 | 桃花色综合影院 | 成人免费视频视频在线观看 免费 | 丰满妇女强制高潮18xxxx | 综合激情五月综合激情五月激情1 | 97久久超碰中文字幕 | 人妻天天爽夜夜爽一区二区 | 一本加勒比波多野结衣 | 久久精品中文闷骚内射 | 日韩少妇白浆无码系列 | 四虎国产精品一区二区 | 未满小14洗澡无码视频网站 | 日日噜噜噜噜夜夜爽亚洲精品 | 露脸叫床粗话东北少妇 | 黑森林福利视频导航 | 国产精品无套呻吟在线 | 日韩精品无码免费一区二区三区 | 久久亚洲精品成人无码 | 人妻中文无码久热丝袜 | а天堂中文在线官网 | 97久久国产亚洲精品超碰热 | 在线播放亚洲第一字幕 | 欧美精品在线观看 | 最近中文2019字幕第二页 | 内射白嫩少妇超碰 | 最新国产乱人伦偷精品免费网站 | 国产av无码专区亚洲a∨毛片 | 老司机亚洲精品影院 | 久久97精品久久久久久久不卡 | 国内丰满熟女出轨videos | 免费国产黄网站在线观看 | 嫩b人妻精品一区二区三区 | 强伦人妻一区二区三区视频18 | 曰韩无码二三区中文字幕 | 国产av无码专区亚洲awww | 亚洲精品午夜国产va久久成人 | 中文字幕无码av激情不卡 | 欧美喷潮久久久xxxxx | 正在播放东北夫妻内射 | 免费视频欧美无人区码 | 男女爱爱好爽视频免费看 | 精品少妇爆乳无码av无码专区 | 久久久久国色av免费观看性色 | а√资源新版在线天堂 | 日本成熟视频免费视频 | 综合网日日天干夜夜久久 | 九九综合va免费看 | 青青久在线视频免费观看 | 久久精品一区二区三区四区 | 日本精品久久久久中文字幕 | 日本精品人妻无码77777 天堂一区人妻无码 | 色一情一乱一伦 | 亚洲狠狠色丁香婷婷综合 | 久久国产劲爆∧v内射 | 东北女人啪啪对白 | 亚洲s色大片在线观看 | 国产精品美女久久久网av | 无码人妻黑人中文字幕 | 欧美喷潮久久久xxxxx | 正在播放老肥熟妇露脸 | 中文字幕无线码免费人妻 | 精品 日韩 国产 欧美 视频 | 色一情一乱一伦一视频免费看 | 婷婷六月久久综合丁香 | 中文字幕人妻无码一区二区三区 | 亚洲综合色区中文字幕 | 小泽玛莉亚一区二区视频在线 | 精品无码国产自产拍在线观看蜜 | 国内老熟妇对白xxxxhd | 大色综合色综合网站 | 丰满妇女强制高潮18xxxx | 国产在线一区二区三区四区五区 | 丰满肥臀大屁股熟妇激情视频 | 亚洲综合伊人久久大杳蕉 | 无码吃奶揉捏奶头高潮视频 | 在教室伦流澡到高潮hnp视频 | 国产特级毛片aaaaaaa高清 | 国语自产偷拍精品视频偷 | 日本精品人妻无码77777 天堂一区人妻无码 | 青草青草久热国产精品 | 亚洲熟女一区二区三区 | 粗大的内捧猛烈进出视频 | 久久国产36精品色熟妇 | 精品欧洲av无码一区二区三区 | 性欧美videos高清精品 | www国产亚洲精品久久网站 | 国产黄在线观看免费观看不卡 | 国产成人无码av片在线观看不卡 | 强开小婷嫩苞又嫩又紧视频 | 九九综合va免费看 | 永久黄网站色视频免费直播 | 亚洲精品一区二区三区四区五区 | 国产欧美熟妇另类久久久 | 国产肉丝袜在线观看 | 欧美xxxxx精品 | www国产亚洲精品久久网站 | a在线观看免费网站大全 | 亚洲爆乳无码专区 | 一本精品99久久精品77 | 精品国产国产综合精品 | 中文字幕无码日韩专区 | 99久久99久久免费精品蜜桃 | 少妇太爽了在线观看 | 国产成人无码区免费内射一片色欲 | 亚洲精品久久久久久一区二区 | 精品一二三区久久aaa片 | 精品人人妻人人澡人人爽人人 | 俺去俺来也在线www色官网 | 免费播放一区二区三区 | 最近免费中文字幕中文高清百度 | 国产亚洲精品久久久久久大师 | 欧美日韩色另类综合 | 给我免费的视频在线观看 | 精品少妇爆乳无码av无码专区 | 国产成人无码区免费内射一片色欲 | 亚洲国产成人a精品不卡在线 | 亚洲春色在线视频 | а√资源新版在线天堂 | 国产成人无码午夜视频在线观看 | 久久成人a毛片免费观看网站 | 无套内谢老熟女 | 麻豆av传媒蜜桃天美传媒 | 亚洲精品中文字幕久久久久 | 蜜桃av蜜臀av色欲av麻 999久久久国产精品消防器材 | 国产人妻大战黑人第1集 | 少妇人妻偷人精品无码视频 | 国产两女互慰高潮视频在线观看 | 国产性猛交╳xxx乱大交 国产精品久久久久久无码 欧洲欧美人成视频在线 | 国产精品亚洲lv粉色 | 成熟妇人a片免费看网站 | 最近免费中文字幕中文高清百度 | 国产精品毛多多水多 | 成熟人妻av无码专区 | 无套内射视频囯产 | 天天拍夜夜添久久精品大 | 99久久精品无码一区二区毛片 | 亚洲日韩av片在线观看 | 欧美喷潮久久久xxxxx | 亚洲精品国产第一综合99久久 | 亚洲小说春色综合另类 | 丰满诱人的人妻3 | 性色欲情网站iwww九文堂 | 秋霞特色aa大片 | 久久综合九色综合97网 | 日本乱偷人妻中文字幕 | 午夜无码区在线观看 | 国产亚洲精品久久久久久大师 | 狠狠色丁香久久婷婷综合五月 | 88国产精品欧美一区二区三区 | 久久aⅴ免费观看 | 综合激情五月综合激情五月激情1 | 九月婷婷人人澡人人添人人爽 | 无码av中文字幕免费放 | 国产色精品久久人妻 | 国产一精品一av一免费 | 黑人巨大精品欧美一区二区 | 成人影院yy111111在线观看 | 狠狠综合久久久久综合网 | 欧美成人午夜精品久久久 | 国产亚洲精品精品国产亚洲综合 | 中文字幕av无码一区二区三区电影 | 亚洲国产精品无码一区二区三区 | 欧美人与善在线com | 亚洲精品成人av在线 | 欧美性生交xxxxx久久久 | 亚洲色无码一区二区三区 | 好男人www社区 | 无遮挡国产高潮视频免费观看 | 免费无码午夜福利片69 | 成人毛片一区二区 | 久久国产劲爆∧v内射 | 无码人妻出轨黑人中文字幕 | 亚洲色大成网站www | 亚洲の无码国产の无码步美 | 天天av天天av天天透 | 老太婆性杂交欧美肥老太 | 7777奇米四色成人眼影 | 婷婷综合久久中文字幕蜜桃三电影 | 精品无码国产自产拍在线观看蜜 | 成人三级无码视频在线观看 | 精品国产青草久久久久福利 | 性欧美牲交xxxxx视频 | 乱人伦中文视频在线观看 | 日韩欧美中文字幕在线三区 | 久在线观看福利视频 | 全黄性性激高免费视频 | 999久久久国产精品消防器材 | 欧美大屁股xxxxhd黑色 | 国产莉萝无码av在线播放 | 免费乱码人妻系列无码专区 | 欧美国产日韩久久mv | 亚洲aⅴ无码成人网站国产app | 日韩av激情在线观看 | 疯狂三人交性欧美 | 国产欧美熟妇另类久久久 | 亚洲第一网站男人都懂 | 欧美 丝袜 自拍 制服 另类 | 性啪啪chinese东北女人 | 好爽又高潮了毛片免费下载 | 欧美黑人乱大交 | 欧美性黑人极品hd | 在线亚洲高清揄拍自拍一品区 | 一个人免费观看的www视频 | 天海翼激烈高潮到腰振不止 | 天天摸天天透天天添 | 国产精品沙发午睡系列 | 精品国产一区av天美传媒 | 国产成人精品久久亚洲高清不卡 | 无码国产色欲xxxxx视频 | 午夜福利试看120秒体验区 | 国产美女精品一区二区三区 | 精品久久久无码中文字幕 | 又大又紧又粉嫩18p少妇 | 久久99精品国产麻豆 | 国产精品美女久久久久av爽李琼 | 国产va免费精品观看 | 免费国产黄网站在线观看 | 兔费看少妇性l交大片免费 | 免费视频欧美无人区码 | 亚洲中文字幕无码中字 | 国产亚洲精品久久久久久大师 | 成人免费视频视频在线观看 免费 | 精品成人av一区二区三区 | 亚洲爆乳精品无码一区二区三区 | 97人妻精品一区二区三区 | 最新国产乱人伦偷精品免费网站 | 黑人粗大猛烈进出高潮视频 | 内射后入在线观看一区 | 亚洲午夜久久久影院 | 中文字幕无线码免费人妻 | 波多野结衣高清一区二区三区 | 国产精品高潮呻吟av久久 | 国产偷抇久久精品a片69 | 国内精品人妻无码久久久影院 | 欧美人妻一区二区三区 | 日韩人妻无码中文字幕视频 | 自拍偷自拍亚洲精品被多人伦好爽 | 亚洲爆乳大丰满无码专区 | 18精品久久久无码午夜福利 | 久久久久久亚洲精品a片成人 | 日韩人妻少妇一区二区三区 | 成人女人看片免费视频放人 | 国产精品无码永久免费888 | 亚洲一区二区三区国产精华液 | 天下第一社区视频www日本 | 国产免费观看黄av片 | 欧美亚洲日韩国产人成在线播放 | 欧美日韩综合一区二区三区 | 欧美黑人巨大xxxxx | 亚洲七七久久桃花影院 | √天堂中文官网8在线 | 国产无av码在线观看 | 国产精品资源一区二区 | 性啪啪chinese东北女人 | 亚洲熟熟妇xxxx | 水蜜桃色314在线观看 | 欧美日韩综合一区二区三区 | 奇米综合四色77777久久 东京无码熟妇人妻av在线网址 | 红桃av一区二区三区在线无码av | 曰本女人与公拘交酡免费视频 | 国产激情无码一区二区 | 高中生自慰www网站 | 无码精品国产va在线观看dvd | 国产成人一区二区三区在线观看 | 欧洲熟妇色 欧美 | 日韩精品无码免费一区二区三区 | 蜜臀av在线观看 在线欧美精品一区二区三区 | 丝袜人妻一区二区三区 | 无码av免费一区二区三区试看 | 国产精品久久久久久久影院 | 国产人妖乱国产精品人妖 | 亚洲一区二区三区在线观看网站 | 亚洲成av人片天堂网无码】 | 内射老妇bbwx0c0ck | 蜜桃视频韩日免费播放 | 欧美人与动性行为视频 | 国内精品人妻无码久久久影院蜜桃 | 亚洲熟悉妇女xxx妇女av | 狠狠色噜噜狠狠狠7777奇米 | 在线欧美精品一区二区三区 | 欧美丰满少妇xxxx性 | 黑森林福利视频导航 | 中文字幕乱妇无码av在线 | 国产激情艳情在线看视频 | 成 人影片 免费观看 | 青青青手机频在线观看 | 国产午夜视频在线观看 | 国产精品国产三级国产专播 | 久久天天躁狠狠躁夜夜免费观看 | 国产av一区二区精品久久凹凸 | 亚洲人成影院在线无码按摩店 | 四虎影视成人永久免费观看视频 | 青草青草久热国产精品 | 国产免费久久久久久无码 | 久久精品国产一区二区三区 | 国产美女极度色诱视频www | 亚洲欧美日韩综合久久久 | 熟妇人妻无乱码中文字幕 | 欧美亚洲国产一区二区三区 | 亚洲综合另类小说色区 | 亚洲人成网站色7799 | 国产亚洲人成在线播放 | 色婷婷久久一区二区三区麻豆 | 无码中文字幕色专区 | 男人的天堂2018无码 | 久久久久亚洲精品男人的天堂 | 女人被男人爽到呻吟的视频 | 无码av免费一区二区三区试看 | 中文亚洲成a人片在线观看 | 日本乱人伦片中文三区 | 午夜无码区在线观看 | 国产农村乱对白刺激视频 | 亚洲 高清 成人 动漫 | 日本丰满护士爆乳xxxx | 少妇无码av无码专区在线观看 | 国产又爽又猛又粗的视频a片 | 国产人妻人伦精品1国产丝袜 | 亚洲男人av香蕉爽爽爽爽 | 成人试看120秒体验区 | 欧美 亚洲 国产 另类 | 欧美日韩一区二区三区自拍 | 无码国内精品人妻少妇 | 日韩亚洲欧美中文高清在线 | 强开小婷嫩苞又嫩又紧视频 | 中国大陆精品视频xxxx | 欧洲精品码一区二区三区免费看 | 日日麻批免费40分钟无码 | 久久精品中文字幕大胸 | 国产成人精品一区二区在线小狼 | 国产一区二区不卡老阿姨 | 特黄特色大片免费播放器图片 | 国产成人无码午夜视频在线观看 | 国产人妻精品午夜福利免费 | 中文字幕av伊人av无码av | 久久精品女人天堂av免费观看 | 久久国产精品精品国产色婷婷 | 中文无码成人免费视频在线观看 | 国产精品美女久久久网av | 精品亚洲韩国一区二区三区 | 国产麻豆精品一区二区三区v视界 | 亚洲中文字幕无码中字 | 99精品国产综合久久久久五月天 | 久久aⅴ免费观看 | av无码电影一区二区三区 | 5858s亚洲色大成网站www | 免费无码肉片在线观看 | 国产福利视频一区二区 | 国产亚洲精品久久久闺蜜 | 国产精品内射视频免费 | 人人妻人人澡人人爽人人精品浪潮 | 老熟妇仑乱视频一区二区 | 久久久婷婷五月亚洲97号色 | 亚洲成av人片在线观看无码不卡 | 天天躁日日躁狠狠躁免费麻豆 | 色婷婷综合中文久久一本 | 成人免费视频在线观看 | 扒开双腿疯狂进出爽爽爽视频 | 久久97精品久久久久久久不卡 | 人妻体内射精一区二区三四 | av无码久久久久不卡免费网站 | 国产亚洲精品久久久ai换 | 久久久国产精品无码免费专区 | 精品乱码久久久久久久 | 麻花豆传媒剧国产免费mv在线 | 中文毛片无遮挡高清免费 | 国产色视频一区二区三区 | 亚洲区小说区激情区图片区 | 乱人伦人妻中文字幕无码 | 亚洲中文字幕在线观看 | 亚洲综合伊人久久大杳蕉 | 国产免费久久久久久无码 | 久久久精品成人免费观看 | 亚洲一区二区三区在线观看网站 | 国内精品一区二区三区不卡 | 欧美喷潮久久久xxxxx | 131美女爱做视频 | 中文无码精品a∨在线观看不卡 | 女人被爽到呻吟gif动态图视看 | 超碰97人人射妻 | 亚洲综合无码一区二区三区 | 麻豆果冻传媒2021精品传媒一区下载 | 激情爆乳一区二区三区 | 国产免费观看黄av片 | 国产在线精品一区二区高清不卡 | 日韩欧美成人免费观看 | 久久久久久久久888 | 最近中文2019字幕第二页 | 亚洲欧美色中文字幕在线 | 波多野结衣aⅴ在线 | 亚洲天堂2017无码 | 啦啦啦www在线观看免费视频 | 国产国语老龄妇女a片 | 成人av无码一区二区三区 | 亚洲日本在线电影 | 精品无码成人片一区二区98 | 国产精品无码一区二区桃花视频 | 狠狠噜狠狠狠狠丁香五月 | 一区二区三区乱码在线 | 欧洲 | 性做久久久久久久久 | 精品偷自拍另类在线观看 | 人妻少妇精品久久 | 亚洲另类伦春色综合小说 | 亚洲欧美色中文字幕在线 | 九九在线中文字幕无码 | 亚洲中文字幕无码中字 | 成年美女黄网站色大免费全看 | 日本肉体xxxx裸交 | 亚洲色成人中文字幕网站 | 好男人www社区 | 亚洲爆乳无码专区 | 九一九色国产 | 免费乱码人妻系列无码专区 | 欧美丰满老熟妇xxxxx性 | 久久国产精品偷任你爽任你 | 日产精品99久久久久久 | 精品成在人线av无码免费看 | 成人片黄网站色大片免费观看 | 99精品无人区乱码1区2区3区 | 一本无码人妻在中文字幕免费 | 女人被男人爽到呻吟的视频 | 亚洲综合在线一区二区三区 | 欧美亚洲日韩国产人成在线播放 | 麻豆精产国品 | 无码av最新清无码专区吞精 | 国产网红无码精品视频 | 精品一区二区三区无码免费视频 | 少妇性l交大片欧洲热妇乱xxx | 六十路熟妇乱子伦 | 久久久久成人片免费观看蜜芽 | 天堂在线观看www | 99国产欧美久久久精品 | 免费无码一区二区三区蜜桃大 | 亚洲欧美日韩综合久久久 | 中文毛片无遮挡高清免费 | 欧美人与善在线com | 乱人伦人妻中文字幕无码 | 国产黄在线观看免费观看不卡 | 日本精品人妻无码免费大全 | 亚洲国产精品毛片av不卡在线 | 中文字幕中文有码在线 | 成人av无码一区二区三区 | 东京热男人av天堂 | 熟女俱乐部五十路六十路av | 激情爆乳一区二区三区 | 亚洲熟女一区二区三区 | 国产亚洲精品久久久久久 | 老熟妇仑乱视频一区二区 | 精品无码国产一区二区三区av | 丰满少妇女裸体bbw | 成人欧美一区二区三区 | 国产精品办公室沙发 | 国产 浪潮av性色四虎 | 国产亚洲日韩欧美另类第八页 | 久久 国产 尿 小便 嘘嘘 | 2020久久超碰国产精品最新 | 帮老师解开蕾丝奶罩吸乳网站 | 九九久久精品国产免费看小说 | 丰满护士巨好爽好大乳 | 国产亚洲精品久久久久久久久动漫 | 亚洲国产精华液网站w | 欧美性生交xxxxx久久久 | 国产一区二区三区影院 | 久久99精品久久久久婷婷 | 亚洲成a人片在线观看无码 | 樱花草在线播放免费中文 | 久久zyz资源站无码中文动漫 | 国产suv精品一区二区五 | 久久久久久久久888 | 久久精品国产精品国产精品污 | 人妻天天爽夜夜爽一区二区 | 国产精品久久久久久久9999 | 国产偷抇久久精品a片69 | 久久综合狠狠综合久久综合88 | 性欧美videos高清精品 | 欧美刺激性大交 | av无码电影一区二区三区 | 自拍偷自拍亚洲精品被多人伦好爽 | 亚洲人交乣女bbw | 午夜不卡av免费 一本久久a久久精品vr综合 | 美女毛片一区二区三区四区 | 噜噜噜亚洲色成人网站 | 久青草影院在线观看国产 | 亚洲国产一区二区三区在线观看 | 学生妹亚洲一区二区 | 2020久久香蕉国产线看观看 | 亚洲最大成人网站 | 国产福利视频一区二区 | 九九综合va免费看 | 久久99精品久久久久久动态图 | 人妻体内射精一区二区三四 | 婷婷综合久久中文字幕蜜桃三电影 | 亚洲色偷偷男人的天堂 | 国产精品无码一区二区桃花视频 | 特黄特色大片免费播放器图片 | 99国产精品白浆在线观看免费 | 国产亲子乱弄免费视频 | a片免费视频在线观看 | 奇米影视888欧美在线观看 | 性欧美大战久久久久久久 | 内射欧美老妇wbb | 少妇无码一区二区二三区 | 性色av无码免费一区二区三区 | 国产99久久精品一区二区 | 国产成人精品久久亚洲高清不卡 | www国产亚洲精品久久久日本 | 爽爽影院免费观看 | 国产激情精品一区二区三区 | 日韩 欧美 动漫 国产 制服 | 亚洲欧美中文字幕5发布 | 欧美35页视频在线观看 | 亚洲小说图区综合在线 | 无码乱肉视频免费大全合集 | 亚洲国产精品一区二区第一页 | 中文无码成人免费视频在线观看 | 天堂а√在线地址中文在线 | 亚洲va中文字幕无码久久不卡 | 色一情一乱一伦一区二区三欧美 | 免费视频欧美无人区码 | 国产熟妇另类久久久久 | 黑人大群体交免费视频 | 天天躁日日躁狠狠躁免费麻豆 | 日本一区二区三区免费播放 | aⅴ在线视频男人的天堂 | 鲁一鲁av2019在线 | 亚洲午夜久久久影院 | 成人性做爰aaa片免费看不忠 | 精品人妻人人做人人爽 | 久久综合给合久久狠狠狠97色 | 国产色在线 | 国产 | 精品人妻人人做人人爽夜夜爽 | 国产在线无码精品电影网 | 男女作爱免费网站 | 色爱情人网站 | 中文字幕精品av一区二区五区 | 西西人体www44rt大胆高清 | 荡女精品导航 | 亚洲色欲久久久综合网东京热 | 国产美女极度色诱视频www | 7777奇米四色成人眼影 | 久久www免费人成人片 | 自拍偷自拍亚洲精品10p | 无码人妻出轨黑人中文字幕 | 成在人线av无码免观看麻豆 | 无套内射视频囯产 | 中文字幕无码热在线视频 | 成人三级无码视频在线观看 | 双乳奶水饱满少妇呻吟 | 激情国产av做激情国产爱 | 少妇性俱乐部纵欲狂欢电影 | 亚无码乱人伦一区二区 | 亚洲国产精华液网站w | 最新版天堂资源中文官网 | 亚洲春色在线视频 | 亚洲自偷精品视频自拍 | 国内综合精品午夜久久资源 | 双乳奶水饱满少妇呻吟 | 又大又紧又粉嫩18p少妇 | 久久精品中文字幕一区 | 亚洲精品一区三区三区在线观看 | 领导边摸边吃奶边做爽在线观看 | 曰韩少妇内射免费播放 | 中文字幕av日韩精品一区二区 | 少妇被粗大的猛进出69影院 | 人人妻人人澡人人爽精品欧美 | 野外少妇愉情中文字幕 | 欧美日韩久久久精品a片 | 亚洲中文字幕在线观看 | 无码乱肉视频免费大全合集 | 久久精品国产99久久6动漫 | 狂野欧美性猛交免费视频 | 国产精品久久久 | 亚洲人成无码网www | 老子影院午夜精品无码 | 露脸叫床粗话东北少妇 | 亚洲精品久久久久久久久久久 | 中文字幕无码日韩欧毛 | 精品成在人线av无码免费看 | 精品国产一区二区三区四区在线看 | 粗大的内捧猛烈进出视频 | 国产熟妇高潮叫床视频播放 | 国产一区二区不卡老阿姨 | 最新版天堂资源中文官网 | 久久精品国产大片免费观看 | 网友自拍区视频精品 | 欧洲精品码一区二区三区免费看 | 国产熟女一区二区三区四区五区 | 日本饥渴人妻欲求不满 | 国模大胆一区二区三区 | 亚洲热妇无码av在线播放 | 俄罗斯老熟妇色xxxx | 亚洲春色在线视频 | 日韩亚洲欧美精品综合 | 亚洲 a v无 码免 费 成 人 a v | 国产欧美熟妇另类久久久 | 男女猛烈xx00免费视频试看 | 午夜丰满少妇性开放视频 | 少妇性l交大片欧洲热妇乱xxx | 人妻有码中文字幕在线 | 久久人人爽人人爽人人片ⅴ | 国产精品久久久久无码av色戒 | 国产va免费精品观看 | 色欲综合久久中文字幕网 | 亚洲熟妇色xxxxx欧美老妇 | 久久久久se色偷偷亚洲精品av | 久久久婷婷五月亚洲97号色 | 激情五月综合色婷婷一区二区 | 亚洲精品久久久久中文第一幕 | 国产成人综合在线女婷五月99播放 | 亚洲va欧美va天堂v国产综合 | 网友自拍区视频精品 | 麻豆av传媒蜜桃天美传媒 | 国产精品人人妻人人爽 | 人妻插b视频一区二区三区 | 超碰97人人射妻 | 中文字幕无码免费久久99 | 国产精品久免费的黄网站 | 精品少妇爆乳无码av无码专区 | 十八禁视频网站在线观看 | 妺妺窝人体色www婷婷 | 亚洲欧美国产精品专区久久 | 国产高清av在线播放 | 色婷婷av一区二区三区之红樱桃 | 亚洲人成影院在线无码按摩店 | 国产性生交xxxxx无码 | 久久久久久九九精品久 | 久久视频在线观看精品 | 内射巨臀欧美在线视频 | 性色av无码免费一区二区三区 | 国产成人精品三级麻豆 | 国产精品人人妻人人爽 | 人人澡人摸人人添 | 国产精品沙发午睡系列 | 国产成人无码a区在线观看视频app | 捆绑白丝粉色jk震动捧喷白浆 | 少妇高潮一区二区三区99 | 欧美老妇与禽交 | 亚洲男人av天堂午夜在 | 亚洲日本va中文字幕 | 蜜桃无码一区二区三区 | 欧美自拍另类欧美综合图片区 | 亚洲综合在线一区二区三区 | 国产高清av在线播放 | 十八禁真人啪啪免费网站 | 丰满人妻翻云覆雨呻吟视频 | 偷窥日本少妇撒尿chinese | 中文久久乱码一区二区 | 欧美精品免费观看二区 | 国内综合精品午夜久久资源 | 国精品人妻无码一区二区三区蜜柚 | 国产精品久久福利网站 | 亚洲午夜福利在线观看 | 久久婷婷五月综合色国产香蕉 | 我要看www免费看插插视频 | 国产97人人超碰caoprom | 国产精品无套呻吟在线 | 欧美日韩视频无码一区二区三 | 国产精品第一区揄拍无码 | 国产av无码专区亚洲a∨毛片 | 精品久久久无码中文字幕 | 午夜熟女插插xx免费视频 | 性啪啪chinese东北女人 | 成人aaa片一区国产精品 | 色综合久久中文娱乐网 | 久久国产精品萌白酱免费 | 国产一区二区三区精品视频 | 中文无码伦av中文字幕 | 欧美人与牲动交xxxx | 欧美国产日韩久久mv | 欧美阿v高清资源不卡在线播放 | 99久久久无码国产aaa精品 | 麻豆国产丝袜白领秘书在线观看 | 欧美国产日韩久久mv | 欧美日韩在线亚洲综合国产人 | 久久久久国色av免费观看性色 | 2020久久香蕉国产线看观看 | 黄网在线观看免费网站 | 人人澡人人透人人爽 | 国产精品对白交换视频 | 精品厕所偷拍各类美女tp嘘嘘 | 一个人看的www免费视频在线观看 | 欧美性生交活xxxxxdddd | 中文字幕av无码一区二区三区电影 | 国产精品无码一区二区三区不卡 | 白嫩日本少妇做爰 | 国产精品沙发午睡系列 | 东北女人啪啪对白 | 日日摸天天摸爽爽狠狠97 | 中文久久乱码一区二区 | 欧美成人午夜精品久久久 | 亚洲 另类 在线 欧美 制服 | 任你躁国产自任一区二区三区 | 国产69精品久久久久app下载 | 伊在人天堂亚洲香蕉精品区 | 又湿又紧又大又爽a视频国产 | 国语自产偷拍精品视频偷 | 一本久道久久综合狠狠爱 | 性史性农村dvd毛片 | 日产国产精品亚洲系列 | 中国女人内谢69xxxx | 免费播放一区二区三区 | 无码国产乱人伦偷精品视频 | 丰满岳乱妇在线观看中字无码 | 久久久久99精品国产片 | 67194成是人免费无码 | 国产成人精品三级麻豆 | 国产精品爱久久久久久久 | 在线亚洲高清揄拍自拍一品区 | 男女猛烈xx00免费视频试看 | 精品夜夜澡人妻无码av蜜桃 | 欧美兽交xxxx×视频 | 欧美激情内射喷水高潮 | 中文字幕 人妻熟女 | 动漫av一区二区在线观看 | a片免费视频在线观看 | 风流少妇按摩来高潮 | 免费无码肉片在线观看 | 内射巨臀欧美在线视频 | 国产精品久久久久7777 | 4hu四虎永久在线观看 | 国产精品多人p群无码 | 无码av岛国片在线播放 | 国产亚av手机在线观看 | 亚洲人成影院在线观看 | 亚洲国产精品一区二区美利坚 | 又大又硬又爽免费视频 | 亚洲国产精品一区二区第一页 | 粗大的内捧猛烈进出视频 | 亚洲大尺度无码无码专区 | 丰满少妇弄高潮了www | 无码帝国www无码专区色综合 | 永久免费观看国产裸体美女 | 成人欧美一区二区三区黑人 | 无码av中文字幕免费放 | 少妇激情av一区二区 | 欧美日本精品一区二区三区 | 亚洲成a人一区二区三区 | 国产无遮挡吃胸膜奶免费看 | 国产极品视觉盛宴 | 亚洲精品一区二区三区大桥未久 | 亚洲精品一区二区三区四区五区 | 国产办公室秘书无码精品99 | 成人无码精品一区二区三区 | 国产综合色产在线精品 | 日韩精品无码一区二区中文字幕 | 婷婷综合久久中文字幕蜜桃三电影 | 99久久精品无码一区二区毛片 | 好男人社区资源 | 日日夜夜撸啊撸 | 久久久久成人片免费观看蜜芽 | 久久人人爽人人人人片 | 一本色道久久综合亚洲精品不卡 | 亚洲国产日韩a在线播放 | www国产亚洲精品久久网站 | 亚洲中文字幕无码中文字在线 | 成人女人看片免费视频放人 | 一本无码人妻在中文字幕免费 | 麻豆国产丝袜白领秘书在线观看 | 中文字幕av无码一区二区三区电影 | 亚洲精品国产品国语在线观看 | 任你躁国产自任一区二区三区 | 无码国产乱人伦偷精品视频 | 亚洲日韩乱码中文无码蜜桃臀网站 | 无码人妻精品一区二区三区下载 | 国产成人久久精品流白浆 | 草草网站影院白丝内射 | 久久精品女人的天堂av | 麻豆成人精品国产免费 | 国产乱人无码伦av在线a | 精品亚洲成av人在线观看 | 国产艳妇av在线观看果冻传媒 | 国产午夜无码精品免费看 | 色一情一乱一伦一视频免费看 | 久久久久成人精品免费播放动漫 | 国产免费无码一区二区视频 | 老子影院午夜伦不卡 | 欧美人与物videos另类 | 亚洲欧美精品伊人久久 | 国产色xx群视频射精 | 日韩无套无码精品 | 国内丰满熟女出轨videos | 亚洲精品国产品国语在线观看 | 在线播放亚洲第一字幕 | 妺妺窝人体色www在线小说 | 国内少妇偷人精品视频 | 粗大的内捧猛烈进出视频 | 日韩 欧美 动漫 国产 制服 | 波多野结衣一区二区三区av免费 | 国产午夜福利亚洲第一 | 国产精品亚洲综合色区韩国 | 亚洲中文字幕无码中文字在线 | 国产又爽又黄又刺激的视频 | 国产 浪潮av性色四虎 | 18无码粉嫩小泬无套在线观看 | 亚洲高清偷拍一区二区三区 | 国产内射爽爽大片视频社区在线 | 日日天日日夜日日摸 | 在线播放无码字幕亚洲 | 在线观看欧美一区二区三区 | 亚洲国产午夜精品理论片 | 欧美人与动性行为视频 | 亚洲国产成人av在线观看 | 成 人影片 免费观看 | 欧美日本精品一区二区三区 | 国内综合精品午夜久久资源 | 色五月五月丁香亚洲综合网 | 亚洲伊人久久精品影院 | 成人亚洲精品久久久久软件 | 国产麻豆精品精东影业av网站 | 欧美人与物videos另类 | 久久综合网欧美色妞网 | 乱中年女人伦av三区 | 亚洲国产精品一区二区第一页 | 精品偷自拍另类在线观看 | 一本久道高清无码视频 | 精品亚洲成av人在线观看 | 亚洲精品美女久久久久久久 | 亚洲综合精品香蕉久久网 | 久精品国产欧美亚洲色aⅴ大片 | 99久久精品午夜一区二区 | 午夜精品一区二区三区在线观看 | 亚洲一区二区三区偷拍女厕 | 人妻夜夜爽天天爽三区 | 美女毛片一区二区三区四区 | 国内少妇偷人精品视频 | 国语自产偷拍精品视频偷 | 欧美国产日产一区二区 | 国产成人精品三级麻豆 | 夜夜夜高潮夜夜爽夜夜爰爰 | 丰满肥臀大屁股熟妇激情视频 | 日韩精品乱码av一区二区 | 丰满少妇熟乱xxxxx视频 | 欧美真人作爱免费视频 | 日本免费一区二区三区最新 | 久久久久久久久888 | 中文无码精品a∨在线观看不卡 | 狠狠噜狠狠狠狠丁香五月 | 国产热a欧美热a在线视频 | 国产精品久久福利网站 | 2020久久香蕉国产线看观看 | 国产亚洲精品精品国产亚洲综合 | 国产成人一区二区三区在线观看 | 人人妻人人藻人人爽欧美一区 | 无套内谢的新婚少妇国语播放 | 377p欧洲日本亚洲大胆 | 中文字幕av日韩精品一区二区 | 波多野结衣高清一区二区三区 | 美女黄网站人色视频免费国产 | 天天做天天爱天天爽综合网 | 草草网站影院白丝内射 | 无码人妻出轨黑人中文字幕 | 性生交大片免费看l | 狠狠色噜噜狠狠狠7777奇米 | 亚洲精品一区二区三区婷婷月 | 67194成是人免费无码 | 人妻人人添人妻人人爱 | 国产一区二区三区四区五区加勒比 | 精品无码国产一区二区三区av | 国产成人精品优优av | 国产精品99久久精品爆乳 | 亚洲狠狠色丁香婷婷综合 | 97久久国产亚洲精品超碰热 | 伊人久久大香线蕉亚洲 | 国产av一区二区精品久久凹凸 | 亚洲精品欧美二区三区中文字幕 | 国产精品办公室沙发 | 亚洲国产精品久久人人爱 | 无码av岛国片在线播放 | 国产做国产爱免费视频 | 亚洲日韩一区二区三区 | 高潮毛片无遮挡高清免费 | 国产成人av免费观看 | 国产乱码精品一品二品 | 欧美人与禽zoz0性伦交 | 玩弄少妇高潮ⅹxxxyw | 久久无码中文字幕免费影院蜜桃 | 粗大的内捧猛烈进出视频 | 红桃av一区二区三区在线无码av | 性生交大片免费看女人按摩摩 | 国产精品igao视频网 | 又大又紧又粉嫩18p少妇 | 国产亚洲精品久久久ai换 | 国产午夜视频在线观看 | 欧美人与牲动交xxxx | www国产亚洲精品久久久日本 | 99久久99久久免费精品蜜桃 | 亚洲高清偷拍一区二区三区 | 欧美 日韩 亚洲 在线 | 久久成人a毛片免费观看网站 | 精品一区二区三区无码免费视频 | 成熟人妻av无码专区 | 无码成人精品区在线观看 | 久久精品国产99精品亚洲 | 国产乱人伦av在线无码 | av无码不卡在线观看免费 | 国产国产精品人在线视 | 欧美自拍另类欧美综合图片区 | 色欲久久久天天天综合网精品 | 激情人妻另类人妻伦 | 一本久道久久综合婷婷五月 | 青春草在线视频免费观看 | 骚片av蜜桃精品一区 | 伦伦影院午夜理论片 | 欧美第一黄网免费网站 | 婷婷六月久久综合丁香 | 亚拍精品一区二区三区探花 | 久久精品国产99久久6动漫 | 国产又爽又猛又粗的视频a片 | 人人妻人人澡人人爽欧美精品 | 老子影院午夜精品无码 | 日韩亚洲欧美精品综合 | 色综合久久久久综合一本到桃花网 | 亚洲国产精华液网站w | 午夜性刺激在线视频免费 | 亚洲国产日韩a在线播放 | 免费观看激色视频网站 | 99久久人妻精品免费一区 | 国产精品无码一区二区桃花视频 | 九月婷婷人人澡人人添人人爽 | 国产精品久久久午夜夜伦鲁鲁 | 午夜福利一区二区三区在线观看 | 亚洲综合色区中文字幕 | 日产国产精品亚洲系列 | 久久97精品久久久久久久不卡 | 欧美乱妇无乱码大黄a片 | 一本久久a久久精品vr综合 | 未满成年国产在线观看 | 亚洲精品久久久久久久久久久 | 日韩精品无码免费一区二区三区 | 亚洲成a人片在线观看无码 | 无码精品国产va在线观看dvd | 国产情侣作爱视频免费观看 | 欧美日本精品一区二区三区 | 性欧美大战久久久久久久 | 欧美国产亚洲日韩在线二区 | 99久久99久久免费精品蜜桃 | 欧美黑人巨大xxxxx | 亚洲狠狠色丁香婷婷综合 | 国产午夜福利100集发布 | 亚洲а∨天堂久久精品2021 | 久久久久久av无码免费看大片 | 国产精品人人妻人人爽 | 日本一卡二卡不卡视频查询 | 亚洲综合无码一区二区三区 | 无码人妻少妇伦在线电影 | 国产精品人妻一区二区三区四 | 久久久精品人妻久久影视 | 人妻夜夜爽天天爽三区 | 日本护士毛茸茸高潮 | 老子影院午夜精品无码 | 樱花草在线播放免费中文 | 麻豆国产人妻欲求不满谁演的 | 少妇性l交大片欧洲热妇乱xxx | 日产国产精品亚洲系列 | 久久婷婷五月综合色国产香蕉 | 欧美变态另类xxxx | 亚洲精品国产第一综合99久久 | 久久久久亚洲精品男人的天堂 | 任你躁国产自任一区二区三区 | 国产内射老熟女aaaa | 欧美一区二区三区视频在线观看 | 国产色视频一区二区三区 | 亚洲精品国产品国语在线观看 | 欧美zoozzooz性欧美 | 亚洲の无码国产の无码影院 | 国产精华av午夜在线观看 | 欧美乱妇无乱码大黄a片 | 久久久久成人片免费观看蜜芽 | 精品久久综合1区2区3区激情 | 少妇厨房愉情理9仑片视频 | 久久久婷婷五月亚洲97号色 | 欧美日韩色另类综合 | 精品成在人线av无码免费看 | 国产亚洲美女精品久久久2020 | 日本一本二本三区免费 | 国产成人亚洲综合无码 | 性欧美疯狂xxxxbbbb | 国产精品办公室沙发 | 少妇性l交大片 | 日本大乳高潮视频在线观看 | 亚洲七七久久桃花影院 | 中文字幕无码av波多野吉衣 | 精品成人av一区二区三区 | 中文字幕乱码人妻无码久久 | 亚洲aⅴ无码成人网站国产app | 女人高潮内射99精品 | 欧美亚洲日韩国产人成在线播放 | 人人爽人人澡人人高潮 | 亚洲熟妇色xxxxx欧美老妇 | 日本一区二区三区免费高清 | 亚洲国产精品美女久久久久 | 台湾无码一区二区 | 久久国产36精品色熟妇 | 国产精品高潮呻吟av久久 | 九月婷婷人人澡人人添人人爽 | 激情内射日本一区二区三区 | 久久久久久a亚洲欧洲av冫 | 99国产欧美久久久精品 | 熟妇人妻无码xxx视频 | 国产精品怡红院永久免费 | 亚洲成av人在线观看网址 | 奇米影视7777久久精品人人爽 | 波多野结衣一区二区三区av免费 | 国产婷婷色一区二区三区在线 | 国产精品人人爽人人做我的可爱 | 日韩视频 中文字幕 视频一区 | 2020最新国产自产精品 | 天堂а√在线地址中文在线 | 国产午夜无码视频在线观看 | 成人无码精品1区2区3区免费看 | 亚洲成a人片在线观看无码3d | 亚洲经典千人经典日产 | 波多野结衣av一区二区全免费观看 | 国产精品久久久午夜夜伦鲁鲁 | 久久久国产一区二区三区 | 日日摸夜夜摸狠狠摸婷婷 | 撕开奶罩揉吮奶头视频 | 在教室伦流澡到高潮hnp视频 | 欧美激情内射喷水高潮 | 精品无码国产自产拍在线观看蜜 |