#include <opencv\cv.h>
#include <opencv\highgui.h>
#include <opencv2\core\core.hpp>
#include <opencv2\objdetect\objdetect.hpp>
#include <opencv2\imgproc\imgproc.hpp>
using namespace cv;
using namespace std;
int main(int argc, char** argv)
{
int i, M;
Mat ycrcb, rgb, vect, Data;
vector < String > files;
/*Names of the pictures*/
glob("C:\\Users\\lenovo\\Desktop\\cubicle\\trainning\\*.jpg", files); // M=number of training images
M = files.size();
// calculatong of the matrix Data
for (i = 0; i < M; i++)
{
// Lecture of RGB image
rgb = imread(files[i]);
namedWindow("RGB image", WINDOW_AUTOSIZE);
imshow("RGB image", rgb);
waitKey(10);
if (i == 0)
{ //for the first iteration
Mat Data(M, rgb.cols * rgb.rows * 6, CV_32FC1); //statement and allocation of matrix Data
}
rgb.convertTo(rgb, CV_32FC3, 1.0 / 255.0);
// Convert to float // Convert the RGB color space to the color space Ycrcbb*/
cvtColor(rgb, ycrcb, CV_BGR2YCrCb);
//making each image a vector line
rgb = rgb.reshape(1, rgb.total() * 3);
ycrcb = ycrcb.reshape(1, ycrcb.total() * 3);
/*Concatenate rgb and ycrcb*/
hconcat(rgb, ycrcb, vect);
fprintf(stdout,
"rgb=[%d,%d] , ycrcb=[%d,%d], vect=[%d,%d\n",
rgb.rows,
rgb.cols,
ycrcb.rows,
ycrcb.cols,
vect.rows,
vect.cols);
vect.copyTo(Data.row(i));
}
int nclusters = 35;
Mat labels, centers(nclusters, Data.cols, CV_32FC1);
/* clustering Data by kmeans*/
kmeans(Data,
nclusters,
labels,
TermCriteria(CV_TERMCRIT_ITER | CV_TERMCRIT_EPS, 0.65, 200),
3,
KMEANS_PP_CENTERS,
centers);
}
Это полный код, и я получаю ошибки:
Необработанное исключение в 0x00b85c10 в PB.exe: 0xC0000005: расположение чтения нарушения доступа 0xc35de59f.
Я ничего не знаю об OpenCV, но это выглядит сомнительно:
int main(int argc, char** argv)
{
int i, M;
Mat ycrcb, rgb, vect, Data;
Только что определенная переменная Data
типа Mat
, Совершенно разумная вещь, к сожалению, сделать
if (i == 0)
{ //for the first iteration
Mat Data(M, rgb.cols * rgb.rows * 6, CV_32FC1); //statement and allocation of matrix Data
}
сделал второй Mat Data
который скрывает предыдущий и существует только внутри границ тела if
, Вся работа по настройке этого Data
выбрасывается в закрывающей фигурной скобке, когда внутренний Data
выходит за рамки. Вне if
кузов оригинал Data
все еще активен и доступен, но никогда не был должным образом инициализирован. Использование этого несколько сомнительно, поэтому, когда
vect.copyTo(Data.row(i));
достигнуто, Data
скорее всего, не имеет строки, в которую vect
можно скопировать. Последующее использование Data
одинаково сомнительны, и любой может быть причиной ошибки сегмента.
Мое предложение состоит в том, чтобы отложить создание Data
пока все данные не будут доступны.
Поскольку у вас есть очень простая функция, изменение
Mat ycrcb, rgb, vect, Data;
в
Mat ycrcb, rgb, vect;
и замена
if (i == 0)
{ //for the first iteration
Mat Data(M, rgb.cols * rgb.rows * 6, CV_32FC1); //statement and allocation of matrix Data
}
с
static Mat Data(M, rgb.cols * rgb.rows * 6, CV_32FC1);
может быть то, что вам нужно.
Читайте о статических локальных переменных здесь.
static
локальные переменные немного странные. Они «Сорта» глобальные. Срок их службы от первого использования до завершения программы, но они видны только внутри области, которая их определяет.
Если определено в функции, которая будет вызываться несколько раз, static
переменная будет выделена и инициализирована один раз. Не один раз за звонок. Последующий вход в область видимости переменной начнется с того, что осталось последним, именно то, что требуется в этом случае. Но для более крупной программы, вызывающей функцию несколько раз, это решение следует использовать с осторожностью.
Других решений пока нет …