Как использовать ocl :: KnearestNeigbhour с массивом изображений

Я пытаюсь выполнить KNN для классификации изображений с использованием OpenCV и OpenCL. Модуль ocl в OpenCV обеспечивает именно это с помощью класса ocl :: KnearestNeigbhour. Однако я имею дело с изображением, которое может быть довольно большим. Это приводит к прерыванию процесса, поскольку Windows требует, чтобы ядро, входящее в состав графического процессора, отвечающее за отображение экрана, не занимало более 2 секунд (см. WDDM TDR).

Чтобы избежать этой проблемы, я разделил изображение на серию меньших изображений и классифицировал их итеративно, используя цикл for. При использовании класса CvKNearest, не относящегося к gpu, он работает как шарм. К сожалению, когда я использую класс ocl :: KnearestNeighbour, результат первого изображения повторяется снова и снова для всех других изображений в серии.

Вот код, который я использую:

cv::Mat mResult(mImgLab.rows, mImgLab.cols, CV_32FC1);

cv::ocl::KNearestNeighbour knn;
knn.train(mtrainData, mlabels);

for (int i = 0; i * ROW_NUMBER < mImgLab.rows; i++)
{
int iStart = i * ROW_NUMBER;
int iStop = std::min(mImgLab.rows, iStart + ROW_NUMBER);
int iSpan = iStop - iStart;

int iRows = iSpan * mImgLab.cols;

cv::ocl::oclMat mOclSample(mImgLab.rowRange(iStart, iStop).reshape(1, iRows));
cv::ocl::oclMat mOclKnn(iRows, 1, CV_32FC1);
knn.find_nearest(mOclSample, K, mOclKnn);
cv::Mat mKnn = mOclKnn;

mKnn = mKnn.reshape(0, iSpan);

mKnn.copyTo(mResult.rowRange(iStart, iStop));
}

Итак, мой вопрос, как я могу разделить изображение, чтобы мои ядра на GPU не были слишком большими?

1

Решение

Задача ещё не решена.

Другие решения


По вопросам рекламы [email protected]