#include <opencv\cv.h>
#include <opencv\highgui.h> // x/i/cols/n
#include <cstdlib> // y/j/rows/m
#include <iostream>
using namespace cv;
using namespace std;
#define TRUE 1
#define FALSE 0
#define YES 1
#define NO 0
#define ON YES
#define OFF NO
#define RED_COLOR_POS 1
#define GREEN_COLOR_POS 2
#define BLUE_COLOR_POS 3
#define BLACK_COLOR 0
#define WHITE_COLOR 255
int main(){
Mat imagenOri, imagenUmbral;
imagenOri = imread("D:\\a vision artificial\\images\\rombo0.jpg");
int imageOriRows = imagenOri.rows; // Extrae el valor del numero de filas
int imageOriCols = imagenOri.cols; // Extrae el valor del numero de columnas
int imageOriRows0 = imageOriRows-1; // En base 0
int imageOriCols0 = imageOriCols-1; // En base 0
const unsigned int rows = 14; //imageOriRows; // ojo
int arrayInfo[rows][3]; //Row0...14 (0:rowY, 1:leftX, 2:rightX, 3:xValue) // for arrayInfo[13][3]
int arrayMaxCoo[2][4]; //Row0 (0:rowY, 1:leftBlkPxlPos, 2:rightBlkPxlPos, 3:xValue) // for arrayMaxCoo[2][4]
// Row1 (0:colX, 1:upBlkPxlPos, 2:downBlkPxlPos, 3:xValue)
//#define ASIZE dimArrayCoo
printf("Tama\xA4o del Arreglo de la imagen (Filas #%d, Columnas #%d)\n\n", imageOriRows, imageOriCols);
// 1: Crea un espacio de memoria o imagenOri sin datos, pero con el alto, ancho especificado y resolucion en amplitud de 8 bits (256 valores) 1 canal(8 bits por pixel)
imagenUmbral.create(imageOriRows, imageOriCols, CV_8UC1); // Define imagenSalida vacia de 1 CANAL de tamaño (rxc).
//imagenUmbral = imagenOri;
cvtColor(imagenOri, imagenUmbral, CV_RGB2GRAY); // Crea una imagen en escala de grises en imagenUMbral
threshold(imagenUmbral, imagenUmbral, 128, 255, CV_THRESH_BINARY);
namedWindow("Entrada", 1); // Genera una ventana llamada 'entrada'
namedWindow("Salida1", 1); // Genera una ventana llamada 'salida1' /!\ sin espacios el nombre
//imshow("Entrada", imagenOri);
//imshow("Salida1", imagenUmbral);
imwrite("imagenUmbral.jpg", imagenUmbral);
waitKey(1000);
int MaxValX = 0;
/////////// FILAS ///////////
for (int rowJ = 0; rowJ<=imageOriRows0; rowJ++){// recorrer filas j -->
//uchar *pOriRowJ = imagenOri.ptr<uchar>(rowJ); // puntero secuencial por filas hacia la imagen original
uchar *pResRowJ = imagenUmbral.ptr<uchar>(rowJ); // puntero secuencial por filas hacia la imagen resultado
int xTotalValue = 0;
int leftBlkPxlFlag = 0;
int rightBlkPxlFlag = 0;
int leftBlkPxlPos = 0;
int rightBlkPxlPos = 0;
/////////// COLUMNAS ///////////
for (int colI = 0, colRightI = imageOriCols0; colI< (imageOriCols / 2)+1; colI++, colRightI--){ // recorrer cols i |
// [ col0:pixel0(BGR), col1:pixel1(BGR), ... colI:pixelI(BGR) ]
// [ px0:{0,1,2}, px1:{3,4,5}, px2{6,7,8}, px3{9,10,11}, px4{12,13,14}, ....
// 3*0 =0, 3*1 =3, 3*2 =6 <= 3*colI // Extrae el color BLUE
// 3*0+1=1, 3*1+1=4, 3*2+1=7 <= 3*colI+1 // Extrae el color GREEN
// 3*0+2=2, 3*1+2=5, 3*2+2=8 <= 3*colI+2 // Extrae el color RED
[ row0-col0:pixel0(BGR), row0-col1:pixel1(BGR), row0-col2:pixelI(BGR)][ row1-col0:pixel0(BGR), row1-col1:pixel1(BGR), row2-col2:pixelI(BGR) ]
/*
int skipCol = 3 * colI;
int posRed = skipCol + 2;
int posGreen = skipCol + 1;
int posBlue = skipCol + 0;
*/
[ row0-col0:pixel0, row0-col1:pixel1, row0-col2:pixelI, row1-col0:pixel0, row1-col1:pixel1, row2-col2:pixelI; ] // 2 bits
printf("\nLeftCoo(Fila #%d, Columna #%d)=%d\n", rowJ, colI, pResRowJ[colI]);
//printf("pixel valor 3 canales= %d,%d,%d \n\n", pResRowJ[posBlue], pResRowJ[posGreen], pResRowJ[posRed]);
printf("RightCoo(Fila #%d, Columna #%d)=%d\n", rowJ, colRightI, pResRowJ[colRightI]);
system("PAUSE");
// Row0...14 (0:rowY, 1:leftX, 2:rightX, 3:xValue) // for arrayInfo[0...14][3]
arrayInfo[rowJ][0] = rowJ;
/////////// COLUMNAS LADO IZQUIERDO ///////////
if (leftBlkPxlFlag == OFF){ // No se a encontrado el primer pixel negro de izq a derecha
if (pResRowJ[colI] == BLACK_COLOR){
leftBlkPxlFlag = ON;
printf("Hay un pixel negro del lado izquierdo en (Fila #%d, Columna #%d) \n\n", rowJ, colI);
system("PAUSE");
leftBlkPxlPos = colI;
arrayInfo[rowJ][1]=colI;
}
}
/////////// COLUMNAS LADO DERECHO ///////////
if (rightBlkPxlFlag == OFF){ // No se a encontrado el primer pixel negro de izq a derecha
if (pResRowJ[colRightI] == BLACK_COLOR){
rightBlkPxlFlag = ON;
printf("Hay un pixel negro del lado derecho en (Fila #%d, Columna #%d) \n\n", rowJ, colRightI);
system("PAUSE");
rightBlkPxlPos = colRightI;
arrayInfo[rowJ][2] = colRightI;
}
}
if (rightBlkPxlFlag && leftBlkPxlFlag == ON){
printf("Se activaron los flags\n\n");
break;
}
}//End for cols
if (rightBlkPxlFlag || leftBlkPxlFlag == ON){ // Se activo algun flag
xTotalValue = (rightBlkPxlPos - leftBlkPxlPos) + 1;// mas uno por que se incia a contar desde 0
arrayInfo[rowJ][3] = xTotalValue;
printf("Valor en x = (xf:%d - xi:%d =%d)+1, para la Fila #%d\n", rightBlkPxlPos, leftBlkPxlPos, xTotalValue, rowJ);
if (MaxValX < xTotalValue){
MaxValX = xTotalValue;
//Row0 (0:rowY, 1:leftBlkPxlPos, 2:rightBlkPxlPos, 3:xValue) // for arrayMaxCoo[2][4]
//Row1 (0:colX, 1:upBlkPxlPos, 2:downBlkPxlPos, 3:xValue)
arrayMaxCoo[0][0] = rowJ;
arrayMaxCoo[0][1] = leftBlkPxlPos;
arrayMaxCoo[0][2] = rightBlkPxlPos;
arrayMaxCoo[0][3] = xTotalValue;
}
printf("\nValor maximo acumulado en x =%d, \n\n", MaxValX);
}
else{
arrayInfo[rowJ][3] = xTotalValue; // debe ser cero
}
}//End for rows
printf("\nValor maximo x = %d\n", arrayMaxCoo[0][3]);
printf("entre coo (y:%d xi:%d)\n", arrayMaxCoo[0][0], arrayMaxCoo[0][1]);
printf("y coo (y:%d xf:%d)\n", arrayMaxCoo[0][0], arrayMaxCoo[0][2]);
////////////////