Необработанное исключение в … Место чтения нарушения прав доступа

#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.

это код

0

Решение

Я ничего не знаю об 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 переменная будет выделена и инициализирована один раз. Не один раз за звонок. Последующий вход в область видимости переменной начнется с того, что осталось последним, именно то, что требуется в этом случае. Но для более крупной программы, вызывающей функцию несколько раз, это решение следует использовать с осторожностью.

1

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

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector