Я использую 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;
}
Есть предложения о том, в чем может быть ошибка?Может быть, что-то связано с типом данных / форматом ??
Спасибо!Марио.