core: add PCABackProject() and PCAProject() functions

Signed-off-by: deadprogram <ron@hybridgroup.com>
This commit is contained in:
deadprogram
2023-10-20 19:44:03 +02:00
committed by Ron Evans
parent cf89b448fe
commit 0920808fa3
5 changed files with 97 additions and 2 deletions

View File

@@ -17,9 +17,9 @@ Your pull requests will be greatly appreciated!
- [ ] **Operations on arrays - WORK STARTED**. The following functions still need implementation: - [ ] **Operations on arrays - WORK STARTED**. The following functions still need implementation:
- [X] [Mahalanobis](https://docs.opencv.org/master/d2/de8/group__core__array.html#ga4493aee129179459cbfc6064f051aa7d) - [X] [Mahalanobis](https://docs.opencv.org/master/d2/de8/group__core__array.html#ga4493aee129179459cbfc6064f051aa7d)
- [ ] [mulTransposed](https://docs.opencv.org/master/d2/de8/group__core__array.html#gadc4e49f8f7a155044e3be1b9e3b270ab) - [ ] [mulTransposed](https://docs.opencv.org/master/d2/de8/group__core__array.html#gadc4e49f8f7a155044e3be1b9e3b270ab)
- [ ] [PCABackProject](https://docs.opencv.org/master/d2/de8/group__core__array.html#gab26049f30ee8e94f7d69d82c124faafc) - [X] [PCABackProject](https://docs.opencv.org/master/d2/de8/group__core__array.html#gab26049f30ee8e94f7d69d82c124faafc)
- [X] [PCACompute](https://docs.opencv.org/master/d2/de8/group__core__array.html#ga4e2073c7311f292a0648f04c37b73781) - [X] [PCACompute](https://docs.opencv.org/master/d2/de8/group__core__array.html#ga4e2073c7311f292a0648f04c37b73781)
- [ ] [PCAProject](https://docs.opencv.org/master/d2/de8/group__core__array.html#ga6b9fbc7b3a99ebfd441bbec0a6bc4f88) - [X] [PCAProject](https://docs.opencv.org/master/d2/de8/group__core__array.html#ga6b9fbc7b3a99ebfd441bbec0a6bc4f88)
- [ ] [PSNR](https://docs.opencv.org/master/d2/de8/group__core__array.html#ga07aaf34ae31d226b1b847d8bcff3698f) - [ ] [PSNR](https://docs.opencv.org/master/d2/de8/group__core__array.html#ga07aaf34ae31d226b1b847d8bcff3698f)
- [X] [randn](https://docs.opencv.org/master/d2/de8/group__core__array.html#gaeff1f61e972d133a04ce3a5f81cf6808) - [X] [randn](https://docs.opencv.org/master/d2/de8/group__core__array.html#gaeff1f61e972d133a04ce3a5f81cf6808)
- [X] [randShuffle](https://docs.opencv.org/master/d2/de8/group__core__array.html#ga6a789c8a5cb56c6dd62506179808f763) - [X] [randShuffle](https://docs.opencv.org/master/d2/de8/group__core__array.html#ga6a789c8a5cb56c6dd62506179808f763)

View File

@@ -516,10 +516,18 @@ void Mat_EigenNonSymmetric(Mat src, Mat eigenvalues, Mat eigenvectors) {
cv::eigenNonSymmetric(*src, *eigenvalues, *eigenvectors); cv::eigenNonSymmetric(*src, *eigenvalues, *eigenvectors);
} }
void Mat_PCABackProject(Mat data, Mat mean, Mat eigenvectors, Mat result) {
cv::PCABackProject(*data, *mean, *eigenvectors, *result);
}
void Mat_PCACompute(Mat src, Mat mean, Mat eigenvectors, Mat eigenvalues, int maxComponents) { void Mat_PCACompute(Mat src, Mat mean, Mat eigenvectors, Mat eigenvalues, int maxComponents) {
cv::PCACompute(*src, *mean, *eigenvectors, *eigenvalues, maxComponents); cv::PCACompute(*src, *mean, *eigenvectors, *eigenvalues, maxComponents);
} }
void Mat_PCAProject(Mat data, Mat mean, Mat eigenvectors, Mat result) {
cv::PCAProject(*data, *mean, *eigenvectors, *result);
}
void Mat_Exp(Mat src, Mat dst) { void Mat_Exp(Mat src, Mat dst) {
cv::exp(*src, *dst); cv::exp(*src, *dst);
} }

16
core.go
View File

@@ -1196,6 +1196,14 @@ func EigenNonSymmetric(src Mat, eigenvalues *Mat, eigenvectors *Mat) {
C.Mat_EigenNonSymmetric(src.p, eigenvalues.p, eigenvectors.p) C.Mat_EigenNonSymmetric(src.p, eigenvalues.p, eigenvectors.p)
} }
// PCABackProject reconstructs vectors from their PC projections.
//
// For further details, please see:
// https://docs.opencv.org/4.x/d2/de8/group__core__array.html#gab26049f30ee8e94f7d69d82c124faafc
func PCABackProject(data Mat, mean Mat, eigenvectors Mat, result *Mat) {
C.Mat_PCABackProject(data.p, mean.p, eigenvectors.p, result.p)
}
// PCACompute performs PCA. // PCACompute performs PCA.
// //
// The computed eigenvalues are sorted from the largest to the smallest and the corresponding // The computed eigenvalues are sorted from the largest to the smallest and the corresponding
@@ -1209,6 +1217,14 @@ func PCACompute(src Mat, mean *Mat, eigenvectors *Mat, eigenvalues *Mat, maxComp
C.Mat_PCACompute(src.p, mean.p, eigenvectors.p, eigenvalues.p, C.int(maxComponents)) C.Mat_PCACompute(src.p, mean.p, eigenvectors.p, eigenvalues.p, C.int(maxComponents))
} }
// PCAProject projects vector(s) to the principal component subspace.
//
// For further details, please see:
// https://docs.opencv.org/4.x/d2/de8/group__core__array.html#ga6b9fbc7b3a99ebfd441bbec0a6bc4f88
func PCAProject(data Mat, mean Mat, eigenvectors Mat, result *Mat) {
C.Mat_PCAProject(data.p, mean.p, eigenvectors.p, result.p)
}
// Exp calculates the exponent of every array element. // Exp calculates the exponent of every array element.
// //
// For further details, please see: // For further details, please see:

2
core.h
View File

@@ -382,7 +382,9 @@ void Mat_DFT(Mat m, Mat dst, int flags);
void Mat_Divide(Mat src1, Mat src2, Mat dst); void Mat_Divide(Mat src1, Mat src2, Mat dst);
bool Mat_Eigen(Mat src, Mat eigenvalues, Mat eigenvectors); bool Mat_Eigen(Mat src, Mat eigenvalues, Mat eigenvectors);
void Mat_EigenNonSymmetric(Mat src, Mat eigenvalues, Mat eigenvectors); void Mat_EigenNonSymmetric(Mat src, Mat eigenvalues, Mat eigenvectors);
void Mat_PCABackProject(Mat data, Mat mean, Mat eigenvectors, Mat result);
void Mat_PCACompute(Mat src, Mat mean, Mat eigenvectors, Mat eigenvalues, int maxComponents); void Mat_PCACompute(Mat src, Mat mean, Mat eigenvectors, Mat eigenvalues, int maxComponents);
void Mat_PCAProject(Mat data, Mat mean, Mat eigenvectors, Mat result);
void Mat_Exp(Mat src, Mat dst); void Mat_Exp(Mat src, Mat dst);
void Mat_ExtractChannel(Mat src, Mat dst, int coi); void Mat_ExtractChannel(Mat src, Mat dst, int coi);
void Mat_FindNonZero(Mat src, Mat idx); void Mat_FindNonZero(Mat src, Mat idx);

View File

@@ -2070,6 +2070,36 @@ func TestMatEigenNonSymmetric(t *testing.T) {
eigenvalues.Close() eigenvalues.Close()
} }
func TestPCABackProject(t *testing.T) {
data := NewMatWithSize(3, 1, MatTypeCV32F)
defer data.Close()
data.SetFloatAt(0, 0, float32(-5))
data.SetFloatAt(1, 0, float32(0))
data.SetFloatAt(2, 0, float32(-10))
mean := NewMatWithSize(1, 4, MatTypeCV32F)
defer mean.Close()
mean.SetFloatAt(0, 0, float32(2))
mean.SetFloatAt(0, 1, float32(4))
mean.SetFloatAt(0, 2, float32(4))
mean.SetFloatAt(0, 3, float32(8))
vectors := NewMatWithSizeFromScalar(NewScalar(0, 0, 0, 0), 1, 4, MatTypeCV32F)
defer vectors.Close()
vectors.SetFloatAt(0, 0, float32(0.2))
vectors.SetFloatAt(0, 1, float32(0.4))
vectors.SetFloatAt(0, 2, float32(0.4))
vectors.SetFloatAt(0, 3, float32(0.8))
result := NewMat()
defer result.Close()
PCABackProject(data, mean, vectors, &result)
if result.Empty() {
t.Error("PCABackProject should not have empty result.")
}
}
func TestPCACompute(t *testing.T) { func TestPCACompute(t *testing.T) {
src := NewMatWithSize(10, 10, MatTypeCV32F) src := NewMatWithSize(10, 10, MatTypeCV32F)
// Set some source data so the PCA is done on a non-zero matrix. // Set some source data so the PCA is done on a non-zero matrix.
@@ -2093,6 +2123,45 @@ func TestPCACompute(t *testing.T) {
eigenvalues.Close() eigenvalues.Close()
} }
func TestPCAProject(t *testing.T) {
data := NewMatWithSize(3, 4, MatTypeCV32F)
defer data.Close()
data.SetFloatAt(0, 0, float32(1))
data.SetFloatAt(0, 1, float32(2))
data.SetFloatAt(0, 2, float32(2))
data.SetFloatAt(0, 3, float32(4))
data.SetFloatAt(1, 0, float32(2))
data.SetFloatAt(1, 1, float32(4))
data.SetFloatAt(1, 2, float32(4))
data.SetFloatAt(1, 3, float32(8))
data.SetFloatAt(2, 0, float32(0))
data.SetFloatAt(2, 1, float32(0))
data.SetFloatAt(2, 2, float32(0))
data.SetFloatAt(2, 3, float32(0))
mean := NewMatWithSize(1, 4, MatTypeCV32F)
defer mean.Close()
mean.SetFloatAt(0, 0, float32(2))
mean.SetFloatAt(0, 1, float32(4))
mean.SetFloatAt(0, 2, float32(4))
mean.SetFloatAt(0, 3, float32(8))
vectors := NewMatWithSizeFromScalar(NewScalar(0, 0, 0, 0), 1, 4, MatTypeCV32F)
defer vectors.Close()
vectors.SetFloatAt(0, 0, float32(0.2))
vectors.SetFloatAt(0, 1, float32(0.4))
vectors.SetFloatAt(0, 2, float32(0.4))
vectors.SetFloatAt(0, 3, float32(0.8))
result := NewMat()
defer result.Close()
PCAProject(data, mean, vectors, &result)
if result.Empty() {
t.Error("PCABackProject should not have empty result.")
}
}
func TestMatExp(t *testing.T) { func TestMatExp(t *testing.T) {
src := NewMatWithSize(10, 10, MatTypeCV32F) src := NewMatWithSize(10, 10, MatTypeCV32F)
dst := NewMat() dst := NewMat()