/* Program: Simple Umbral Descripción: Aplicar un simple umbral a una secuencia de video Autor: FJHL Fecha Inicial: 21/Agosto/2015 Fecha Actualización: 21/Agosto/2015 */ #include void restar(cv::Mat I_r, cv::Mat I_1, cv::Mat I_2, int nFilas, int nColumnas); int main(void){ cv::Mat Image; cv::Mat I_k0; cv::Mat I_k1; cv::Mat I_k0float; cv::Mat I_k1float; cv::Mat I_r; cv::Mat I_rSuave; cv::Mat BinaryImage; cv::Mat BinaryImageWx; cv::VideoCapture capture; cv::namedWindow("Image", CV_WINDOW_NORMAL); cv::namedWindow("I_r", CV_WINDOW_NORMAL); cv::namedWindow("Binary Image", CV_WINDOW_NORMAL); capture.open("../../../videos/highway.avi"); if (!capture.isOpened()){ printf("Video no encontrado..."); exit(0); } capture >> Image; int nColumnas = Image.cols; int nFilas = Image.rows; I_k0.create(nFilas, nColumnas, CV_8UC1); I_k1.create(nFilas, nColumnas, CV_8UC1); I_r.create(nFilas, nColumnas, CV_32FC1); I_rSuave.create(nFilas, nColumnas, CV_32FC1); I_k0float.create(nFilas, nColumnas, CV_32FC1); I_k1float.create(nFilas, nColumnas, CV_32FC1); BinaryImage.create(nFilas, nColumnas, CV_8UC1); BinaryImageWx.create(nFilas, nColumnas, CV_8UC1); cv::cvtColor(Image, I_k0, CV_RGB2GRAY); I_k0.convertTo(I_k0float, CV_32FC1, 1.0, 0.0); while (1){ capture >> Image; char key = cv::waitKey(1); if (Image.data == NULL || key == 27){ break; } cv::cvtColor(Image, I_k1, CV_RGB2GRAY); I_k1.convertTo(I_k1float, CV_32FC1, 1.0, 0.0); //Calcular el residual //I_r = I_k0 - I_k1; //I_r = I_k0float - I_k1float; restar(I_r, I_k0float, I_k1float, nFilas,nColumnas); cv::pow(I_r, 2.0, I_r); cv::normalize(I_r, I_r, 255.0, 0.0, CV_MINMAX); //Aplicar umbral cv::threshold(I_r, BinaryImage, 5, 255, 0); cv::blur(I_r, I_rSuave, cv::Size(3, 3), cv::Point(-1, -1), 4); cv::normalize(I_rSuave, I_rSuave, 255.0, 0.0, CV_MINMAX); cv::threshold(I_rSuave, BinaryImageWx, 5, 255, 0); cv::imshow("Image",Image); cv::imshow("I_r", I_r); cv::imshow("Binary Image",BinaryImage); cv::imshow("Binary Image Wx", BinaryImageWx); I_k1.copyTo(I_k0); I_k1float.copyTo(I_k0float); } cv::waitKey(0); return(0); } void restar(cv::Mat I_r, cv::Mat I_1,cv::Mat I_2, int nFilas, int nColumnas){ int i, j; for (i = 0; i < nFilas; i++){ for (j = 0; j < nColumnas; j++){ I_r.at(i, j) = I_1.at(i, j) - I_2.at(i, j); } } }