| 2064 | |
| 2065 | |
| 2066 | cv::Mat cv::Mat::cross(InputArray _m) const |
| 2067 | { |
| 2068 | Mat m = _m.getMat(); |
| 2069 | int tp = type(), d = CV_MAT_DEPTH(tp); |
| 2070 | CV_Assert( dims <= 2 && m.dims <= 2 && size() == m.size() && tp == m.type() && |
| 2071 | ((rows == 3 && cols == 1) || (cols*channels() == 3 && rows == 1))); |
| 2072 | Mat result(rows, cols, tp); |
| 2073 | |
| 2074 | if( d == CV_32F ) |
| 2075 | { |
| 2076 | const float *a = (const float*)data, *b = (const float*)m.data; |
| 2077 | float* c = (float*)result.data; |
| 2078 | size_t lda = rows > 1 ? step/sizeof(a[0]) : 1; |
| 2079 | size_t ldb = rows > 1 ? m.step/sizeof(b[0]) : 1; |
| 2080 | |
| 2081 | c[0] = a[lda] * b[ldb*2] - a[lda*2] * b[ldb]; |
| 2082 | c[1] = a[lda*2] * b[0] - a[0] * b[ldb*2]; |
| 2083 | c[2] = a[0] * b[ldb] - a[lda] * b[0]; |
| 2084 | } |
| 2085 | else if( d == CV_64F ) |
| 2086 | { |
| 2087 | const double *a = (const double*)data, *b = (const double*)m.data; |
| 2088 | double* c = (double*)result.data; |
| 2089 | size_t lda = rows > 1 ? step/sizeof(a[0]) : 1; |
| 2090 | size_t ldb = rows > 1 ? m.step/sizeof(b[0]) : 1; |
| 2091 | |
| 2092 | c[0] = a[lda] * b[ldb*2] - a[lda*2] * b[ldb]; |
| 2093 | c[1] = a[lda*2] * b[0] - a[0] * b[ldb*2]; |
| 2094 | c[2] = a[0] * b[ldb] - a[lda] * b[0]; |
| 2095 | } |
| 2096 | |
| 2097 | return result; |
| 2098 | } |
| 2099 | |
| 2100 | |
| 2101 | ////////////////////////////////////////// reduce //////////////////////////////////////////// |