Потеря данных в матрице opencv после операции между матрицами - PullRequest
0 голосов
/ 23 сентября 2019

Я использую opencv 4 для создания приложения, которое берет блоки пикселей из изображения и обрабатывает их для вычисления различных HEP (гистограмм эквивалентных шаблонов) из каждого блока.Дело в том, что когда я беру некоторую смещенную матрицу из входной матрицы для выполнения вычитания, данные из матрицы opencv исчезают, как я показываю на изображениях.

Субтекстовая матрица1005 * fI128 = {cv :: Mat} step = {cv :: MatStep} cols = {int} 62 datastart = {const uchar * |0x61dd700} "" allocator = {cv :: MatAllocator * |0x0} NULL flags = {int} 1124024320 data = {uchar * |0x61dd700} "" rows = {int} 62 dataend = {const uchar * |0x61de604} 0x61de604 "\ r \ 360 \ 255 \ 272 \ r \ 360 \ 255 \ 272 \ r \ 360 \ 255 \ 272 \ r \ 360 \ 255 \ 272 \ r \ 360 \ 255 \ 272 \ r \ 360 \ 255\ 272 \ 253 \ 253 \ 253 \ 253 \ 253 \ 253 \ 253 \ 253 \ 253 \ 253 \ 253 \ 253 \ 253 \ 253 \ 253 \ 253 \ 356 \ 376 ", dims = {int} 2 size = {cv:: MatSize}
u = {cv :: UMatData * |0x2e5edd0} 0x2e5edd0 datalimit = {const uchar * |0x61de604} 0x61de604 "\ r \ 360 \ 255 \ 272 \ r \ 360 \ 255 \ 272 \ r \ 360 \ 255 \ 272 \ r \ 360 \ 255 \ 272 \ r \ 360 \ 255 \ 272 \ r \ 360 \ 255\ 272 \ 253 \ 253 \ 253 \ 253 \ 253 \ 253 \ 253 \ 253 \ 253 \ 253 \ 253 \ 253 \ 253 \ 253 \ 253 \ 253 \ 356 \ 376 ",

Вводматрица:

step = {cv :: MatStep} allocator = {cv :: MatAllocator * |0x0} NULL datastart = {const uchar * |0x870600} "\ 207 \ 207 \ 207 \ 207 \ 207 \ 207 \ 207 \ 207 \ 206 \ 207 \ 210 \ 211 \ 212 \ 213 \ 215 \ 215 \ 215 \ 215 \ 213 \ 213 \ 213 \ 213 \ 213 \213 \ 213 \ 213 \ 213 \ 213 \ 213 \ 213 \ 213 \ 213 \ 212 \ 212 \ 212 \ 212 \ 212 \ 212 \ 212 \ 212 \ 212 \ 212 \ 212 \ 212 \ 212 \ 212 \ 212 \ 212 \212 \ 212 \ 212 \ 212 \ 212 \ 212 \ 212 \ 212 \ 212 \ 212 \ 212 \ 212 \ 212 \ 212 \ 212 \ 212 \ 207 \ 207 \ 207 \ 207 \ 207 \ 207 \ 207 \ 207 \ 207 \207 \ 210 \ 211 \ 213 \ 213 \ 215 \ 215 \ 215 \ 215 \ 213 \ 213 \ 213 \ 213 \ 213 \ 213 \ 213 \ 213 \ 213 \ 213 \ 213 \ 213 \ 213 \ 213 \ 212 \ 212 \212 \ 212 \ 212 \ 212 \ 212 \ 212 \ 212 \ 212 \ 212 \ 212 \ 212 \ 212 \ 212 \ 212 \ 212 \ 212 \ 212 \ 212 \ 212 \ 212 \ 212 \ 212 \ 212 \ 212 \ 212 \212 \ 212 \ 212 \ 212 \ 212 \ 207 \ 207 \ 207 \ 207 \ 207 \ 207 \ 207 \ 207 \ 207 \ 210 \ 211 \ 211 \ 213 \ 213 \ 215 \ 215 \ 215 \ 215 \ 213 \ 213 \213 \ 213 \ 213 \ 213 \ 213 \ 213 \ 213 \ 213 \ 213 \ 213 \ 213 \ 213 \ 212 \ 212 \ 212 \ 212 \ 212 \ 212 \ 212 \ 212 \ 212 \ 212 \ 212 \ 212 \ 212 \212 \ 212 \ 212 \ 212 \ 212 \ 212 \ 212 \ 212 \ 212 \ 212 \ 212 \ 212 \ 212 \ 212 \ 212 \ 212 \ 212 \ 212 \ 212 \ 207 \ 207 \ 207 \ 207 \ 207 \ 207 \207 \ 207 \ 210 \ 210 \ 211 \ 212 \ 213 \ 213 \ 215 \ 215 \ 215 \ 215 \ 213 \ 213 \ 213 \ 213 \ 213 \ 213 \ 213 \ 213 \ 213 \ 213 \ 213 \ 213 \ 213 \213 \ 212 \ 212 \ 212 \ 212 \ 212 \ 212 \ 212 \ 212 \ 212 \ 212 \ 212 \ 212 \ 212 \ 212 \ 212 \ 212 \ 212 \ 212 \ 212 \ 212 \ 212 \ 212 \ 212 \212 \ 212 \ 21 flags = {int} 1124024320 u = {cv :: UMatData * |0x2e5ecb0} 0x2e5ecb0 cols = {int} 64 data = {uchar * |0x870600} "\ 207 \ 207 \ 207 \ 207 \ 207 \ 207 \ 207 \ 207 \ 206 \ 207 \ 210 \ 211 \ 212 \ 213 \ 215 \ 215 \ 215 \ 215 \ 213 \ 213 \ 213 \ 213 \ 213 \213 \ 213 \ 213 \ 213 \ 213 \ 213 \ 213 \ 213 \ 213 \ 212 \ 212 \ 212 \ 212 \ 212 \ 212 \ 212 \ 212 \ 212 \ 212 \ 212 \ 212 \ 212 \ 212 \ 212 \ 212 \212 \ 212 \ 212 \ 212 \ 212 \ 212 \ 212 \ 212 \ 212 \ 212 \ 212 \ 212 \ 212 \ 212 \ 212 \ 212 \ 207 \ 207 \ 207 \ 207 \ 207 \ 207 \ 207 \ 207 \ 207 \207 \ 210 \ 211 \ 213 \ 213 \ 215 \ 215 \ 215 \ 215 \ 213 \ 213 \ 213 \ 213 \ 213 \ 213 \ 213 \ 213 \ 213 \ 213 \ 213 \ 213 \ 213 \ 213 \ 212 \ 212 \212 \ 212 \ 212 \ 212 \ 212 \ 212 \ 212 \ 212 \ 212 \ 212 \ 212 \ 212 \ 212 \ 212 \ 212 \ 212 \ 212 \ 212 \ 212 \ 212 \ 212 \ 212 \ 212 \ 212 \ 212 \212 \ 212 \ 212 \ 212 \ 212 \ 207 \ 207 \ 207 \ 207 \ 207 \ 207 \ 207 \ 207 \ 207 \ 210 \ 211 \ 211 \ 213 \ 213 \ 215 \ 215 \ 215 \ 215 \ 213 \ 213 \213 \ 213 \ 213 \ 213 \ 213 \ 213 \ 213 \ 213 \ 213 \ 213 \ 213 \ 213 \ 212 \ 212 \ 212 \ 212 \ 212 \ 212 \ 212 \ 212 \ 212 \ 212 \ 212 \ 212 \ 212 \212 \ 212 \ 212 \ 212 \ 212 \ 212 \ 212 \ 212 \ 212 \ 212 \ 212 \ 212 \ 212 \ 212 \ 212 \ 212 \ 212 \ 212 \ 212 \ 207 \ 207 \ 207 \ 207 \ 207 \ 207 \207 \ 207 \ 210 \ 210 \ 211 \ 212 \ 213 \ 213 \ 215 \ 215 \ 215 \ 215 \ 213 \ 213 \ 213 \ 213 \ 213 \ 213 \ 213 \ 213 \ 213 \ 213 \ 213 \ 213 \ 213 \213 \ 212 \ 212 \ 212 \ 212 \ 212 \ 212 \ 212 \ 212 \ 212 \ 212 \ 212 \ 212 \ 212 \ 212 \ 212 \ 212 \ 212 \ 212 \ 212 \ 212 \ 212 \ 212 \ 212 \212 \ 212 \ 21 datalimit = {const uchar * |0x871600} 0x871600 "\ r \ 360 \ 255 \ 272 \ r \ 360 \ 255 \ 272 \ r \ 360 \ 255 \ 272 \ r \ 360 \ 255 \ 272 \ r \ 360 \ 255 \ 272 \ r \ 360 \ 255\ 272 \ г \ 360 \ 255 \ 272 \ г \ 360 \ 255 \ 272 \ г \ 360 \ 255 \ 272 \ г \ 360 \ 255 \ 272 \ г \ 360 \ 255 \ 272 \ г \ 360 \ 255 \ 272\ г \ 360 \ 255 \ 272 \ г \ 360 \ 255 \ 272 \ 253 \ 253 \ 253 \ 253 \ 253 \ 253 \ 253 \ 253 \ 253 \ 253 \ 253 \ 253 \ 253 \ 253 \ 253 \ 253 \ 356\ 376 \ 356 \ 376 \ 356 \ 376 ", size = {cv :: MatSize} input = {cv :: Mat} rows = {int} 64 dataend = {const uchar * |0x871600} 0x871600«\ Г \ 360 \ 255 \ 272 \ г \ 360 \ 255 \ 272 \ г \ 360 \ 255 \ 272 \ г \ 360 \ 255 \ 272 \ г \ 360 \ 255 \ 272 \ г \ 360 \ 255 \ 272 \г \ 360 \ 255 \ 272 \ г \ 360 \ 255 \ 272 \ г \ 360 \ 255 \ 272 \ г \ 360 \ 255 \ 272 \ г \ 360 \ 255 \ 272 \ г \ 360 \ 255 \ 272 \ г \360 \ 255 \ 272 \ г \ 360 \ 255 \ 272 \ 253 \ 253 \ 253 \ 253 \ 253 \ 253 \ 253 \ 253 \ 253 \ 253 \ 253 \ 253 \ 253 \ 253 \ 253 \ 253 \ 356 \ 376 \356 \ 376 \ 356 \ 376 ", dims = {int} 2

КОД:

list<double> calculateBGC1(Mat input){
    /*
     * Binary Gradient Countours son una familia de descriptores basada en una comparación por pares de píxeles adyacentes pertenecientes a uno o más caminos cerrados (closed path).
     * Se obtiene un Binary Pattern por cada camino cerrado, asignando a cada par de píxeles adyacentes (i,j) el valor binario de la función BinaryTrasholding(Ij - Ii)
     * En el caso del BGC1, está basado en un único camino cerrado, y los píxeles que lo definen son: {0, 1, 2, 3, 4, 5, 6, 7, 0}
     * (A. Fernandez) - Resumido y traducido desde Matlab por M. Ingles
     */
//Definimos imágenes desplazadas
    int filas = input.rows;
    int cols = input.cols;
    int colInicio, colFin, filaInicio, filaFin, k;
    Mat I7 = Mat::zeros(filas, cols, CV_8UC1), I6, I5, I4, I3, I2, I1, I0 = Mat::zeros(filas, cols, CV_8UC1), fI, fI128, fI64, fI32, fI16, fI8, fI4, fI2, fI1, fIn;
    Rect roi;
    //I7
    colInicio = 0;
    filaInicio = 0;

    roi = Rect(colInicio, filaInicio, cols - 2, filas - 2);
    input(roi).copyTo(I7);
    //I6
    colInicio = 1;
    filaInicio = 0;
    colFin = cols - 1 - 1;
    filaFin = filas - 2 - 1;

    roi = Rect(colInicio, filaInicio, cols - 2, filas - 2);
    input(roi).copyTo(I6);
    //I5
    colInicio = 2;
    filaInicio = 0;
    colFin = cols - 1;
    filaFin = filas - 2 - 1;

    roi = Rect(colInicio, filaInicio, cols - 2, filas - 2);
    input(roi).copyTo(I5);
    //I4
    colInicio = 1;
    filaInicio = 1;
    colFin = cols - 1 - 1;
    filaFin = filas - 1 - 1;

    roi = Rect(colInicio, filaInicio, cols - 2, filas - 2);
    input(roi).copyTo(I4);
    //I3
    colInicio = 2;
    filaInicio = 2;
    colFin = cols  - 1;
    filaFin = filas - 1;

    roi = Rect(colInicio, filaInicio, cols - 2, filas - 2);
    input(roi).copyTo(I3);
    //I2
    colInicio = 1;
    filaInicio = 2;
    colFin = cols  - 1 - 1;
    filaFin = filas - 1;

    roi = Rect(colInicio, filaInicio, cols - 2, filas - 2);
    input(roi).copyTo(I2);
    //I1
    colInicio = 0;
    filaInicio = 2;
    colFin = cols  - 2 - 1;
    filaFin = filas - 1;

    roi = Rect(colInicio, filaInicio, cols - 2, filas - 2);
    input(roi).copyTo(I1);
    //I0
    colInicio = 0;
    filaInicio = 1;
    colFin = cols - 2 - 1;
    filaFin = filas -1 - 1;

    roi = Rect(colInicio, filaInicio, cols - 2, filas - 2);
    I0 = input(roi);

    //Definimos dimension del espacio de features
    k = pow(2, 8) -1;

    fI128 = cv::Mat(I7.size(), CV_8UC1);
    int mari;
    mari = I7.channels();
    mari = input.channels();
    Mat scalar;
    scalar = I7 != I0;
    mari = cv::countNonZero(scalar);
    if(I7.type()==I0.type()){
        int mario = 0;

    }
    if(I7.dims == I0.dims){
        int mario =1;
    }
    if(I7.size == I0.size){
        int mmario = 3;
    }
    Mat mask = Mat::ones(filas, cols, CV_8UC1);
    //Calculamos las diferencias entre píxeles
    //cv::subtract(I7, I0, fI128);
    cv::absdiff(I7, I0, fI128);
    //fI128 = I7 - I0;
    cv::subtract(I6, I7, fI64);
    cv::subtract(I5, I6, fI32);
    cv::subtract(I4, I5, fI16);
    cv::subtract(I3, I4, fI8);
    cv::subtract(I2, I3, fI4);
    cv::subtract(I1, I2, fI2);
    cv::subtract(I0, I1, fI1);


    //fI = 128*fI128 + 64*fI64 + 32*fI32 + 16*fI16 + 8*fI8 + 4*fI4 + 2*fI2 + fI1 - 1;
    cv::addWeighted(fI128, 128, fI64, 64, -1, fI, -1);
    cv::addWeighted(fI, 1, fI32, 32, 0, fI, -1);
    cv::addWeighted(fI, 1, fI16, 16, 0, fI, -1);
    cv::addWeighted(fI, 1, fI8, 8, 0, fI, -1);
    cv::addWeighted(fI, 1, fI4, 4, 0, fI, -1);
    cv::addWeighted(fI, 1, fI2, 2, 0, fI, -1);
    cv::add(fI, fI1, fI, Mat(), -1);

    //Se computa el histograma y se normaliza
    double size = (double) fI.cols*fI.rows;
    std::list<double> h = getHistogram(fI, k, size);
    //NORMALIZAR:
    //TODO normalizar. Para esto igual hay que pasar el array a double??    normaliza(h, size);

    return h;

}

Есть предложения о том, в чем может быть ошибка?Может быть, что-то связано с типом данных / форматом ??

Спасибо!Марио.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...