2016-02-02 2 views
0
#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 ,

this is the code

+1

Я бы начал с включения прерывания доступа в элементе «Исключения» в меню «Отладка», а затем подошел к столу вызова к строке вашего кода, вызвав проблему. Также вы, вероятно, должны проверить, успешно ли загружены изображения. – drescherjm

ответ

1

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

Мое предложение состоит в том, чтобы отложить создание 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); 

может быть то, что вам нужно.

Read up on Static local variables here.

EDIT

static локальные переменные являются немного странно. Они «сорта» глобальны. Их срок службы работает от первого использования до завершения программы, но видим только внутри области, определяющей их.

Если определено в функции, которая будет вызываться несколько раз, переменная static будет назначена и инициализирована один раз. Не один раз за звонок. Последующий вход в область переменной будет начинаться с того, что осталось от последнего входа, именно в этом случае. Но для более крупной программы, вызывающей функцию несколько раз, это решение нужно использовать с осторожностью.

+0

да, спасибо, было полезно, но я, если данные не являются глобальной переменной , теперь это неизвестно для fuctions: vect.copyTo (Data.row (i)) и Kmeans. – ilyes

 Смежные вопросы

  • Нет связанных вопросов^_^