PCA в OpenCV с использованием нового интерфейса C ++
-
10-10-2019 - |
Вопрос
Кроме того: извинения, если я наводнись так с вопросами OpenCV: P
В настоящее время я пытаюсь портировать портировать мой старый C-код, чтобы использовать новый интерфейс C ++, и я попал в точку, где я просматриваю свой класс распознавания лицевых веществ.
Mat img = imread("1.jpg");
Mat img2 = imread("2.jpg");
FaceDetector* detect = new HaarDetector("haarcascade_frontalface_alt2.xml");
// convert to grey scale
Mat g_img, g_img2;
cvtColor(img, g_img, CV_BGR2GRAY);
cvtColor(img2, g_img2, CV_BGR2GRAY);
// find the faces in the images
Rect r = detect->getFace(g_img);
Mat img_roi = g_img(r);
r = detect->getFace(g_img2);
Mat img2_roi = g_img2(r);
// create the data matrix for PCA
Mat data;
data.create(2,1, img2_roi.type());
data.row(0) = img_roi;
data.row(1) = img2_roi;
// perform PCA
Mat averageFace;
PCA pca(data, averageFace, CV_PCA_DATA_AS_ROW, 2);
//namedWindow("avg",1); imshow("avg", averageFace); - causes segfault
//namedWindow("avg",1); imshow("avg", Mat(pca.mean)); - doesn't work
Я пытаюсь создать пространство PCA, а затем посмотреть, работает ли он, отображая вычисленное среднее изображение. Есть ли другие шаги к этому?
Возможно, мне нужно проецировать изображения на подпространство PCA в первую очередь?
Решение
Ваша ошибка, вероятно, здесь:
Mat data;
data.create(2,1, img2_roi.type());
data.row(0) = img_roi;
data.row(1) = img2_roi;
PCA ожидает матрицы с векторами данных как строки. Тем не менее, вы никогда не масштабируете изображения к тому же размеру, чтобы у них было одинаковое количество пикселей (поэтому размерность такой же), также data.create(2,1,...)
- то 1
Нужно быть измерением вашего вектора, то есть количество ваших пикселей. Затем скопируйте пиксели от урожая в вашу матрицу.