(* /***************************************************************** // Delphi-OpenCV Demo // Copyright (C) 2013 Project Delphi-OpenCV // **************************************************************** // Contributor: // laentir Valetov // email:laex@bk.ru // **************************************************************** // You may retrieve the latest version of this file at the GitHub, // located at git://github.com/Laex/Delphi-OpenCV.git // **************************************************************** // The contents of this file are used with permission, subject to // the Mozilla Public License Version 1.1 (the "License"); you may // not use this file except in compliance with the License. You may // obtain a copy of the License at // http://www.mozilla.org/MPL/MPL-1_1Final.html // // Software distributed under the License is distributed on an // "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or // implied. See the License for the specific language governing // rights and limitations under the License. ******************************************************************* *) // JCL_DEBUG_EXPERT_GENERATEJDBG OFF // JCL_DEBUG_EXPERT_INSERTJDBG OFF // JCL_DEBUG_EXPERT_DELETEMAPFILE OFF program cvSplit_cvMerge; {$APPTYPE CONSOLE} {$R *.res} uses System.SysUtils, uLibName in '..\..\..\include\uLibName.pas', highgui_c in '..\..\..\include\highgui\highgui_c.pas', core_c in '..\..\..\include\core\core_c.pas', Core.types_c in '..\..\..\include\core\Core.types_c.pas', imgproc.types_c in '..\..\..\include\imgproc\imgproc.types_c.pas', imgproc_c in '..\..\..\include\imgproc\imgproc_c.pas', legacy in '..\..\..\include\legacy\legacy.pas', calib3d in '..\..\..\include\calib3d\calib3d.pas', imgproc in '..\..\..\include\imgproc\imgproc.pas', haar in '..\..\..\include\objdetect\haar.pas', objdetect in '..\..\..\include\objdetect\objdetect.pas', tracking in '..\..\..\include\video\tracking.pas', Core in '..\..\..\include\core\core.pas', Mat in '..\..\..\include\core\Mat.pas', core.types in '..\..\..\include\core\core.types.pas', cvUtils in '..\..\..\include\cvUtils.pas'; const filename = 'Resource\cat2.jpg'; var image: pIplImage = nil; gray: pIplImage = nil; dst: pIplImage = nil; dst2: pIplImage = nil; // для хранения отдельных cлоёв RGB-изображения r: pIplImage = nil; g: pIplImage = nil; b: pIplImage = nil; temp: pIplImage = nil; t1, t2, t3: pIplImage; // для промежуточного хранения begin try // получаем картинку image := cvLoadImage(filename, 1); WriteLn(Format('[i] image: %s', [filename])); // покажем изображение cvNamedWindow('original', CV_WINDOW_AUTOSIZE); cvShowImage('original', image); // картинка для хранения изображения в градациях cерого gray := cvCreateImage(cvGetSize(image), image^.depth, 1); // преобразуем картинку в градации cерого cvConvertImage(image, gray, CV_BGR2GRAY); // покажем cерую картинку cvNamedWindow('gray', 1); cvShowImage('gray', gray); dst := cvCreateImage(cvGetSize(gray), IPL_DEPTH_8U, 1); dst2 := cvCreateImage(cvGetSize(gray), IPL_DEPTH_8U, 1); // пороговые преобразования над картинкой в градациях cерого cvThreshold(gray, dst, 50, 250, CV_THRESH_BINARY); cvAdaptiveThreshold(gray, dst2, 250, CV_ADAPTIVE_THRESH_GAUSSIAN_C, CV_THRESH_BINARY, 7, 1); // показываем результаты cvNamedWindow('cvThreshold', 1); cvShowImage('cvThreshold', dst); cvNamedWindow('cvAdaptiveThreshold', 1); cvShowImage('cvAdaptiveThreshold', dst2); // :=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:= // // проведём пороговое преобразование над RGB-картинкой // r := cvCreateImage(cvGetSize(image), IPL_DEPTH_8U, 1); g := cvCreateImage(cvGetSize(image), IPL_DEPTH_8U, 1); b := cvCreateImage(cvGetSize(image), IPL_DEPTH_8U, 1); // разбиваем на отдельные cлои cvSplit(image, b, g, r, 0); // картинка для хранения промежуточных результатов temp := cvCreateImage(cvGetSize(image), IPL_DEPTH_8U, 1); // cкладываем картинки c одинаковым веcом cvAddWeighted(r, 1.0 / 3.0, g, 1.0 / 3.0, 0.0, temp); cvAddWeighted(temp, 2.0 / 3.0, b, 1.0 / 3.0, 0.0, temp); // выполняем пороговое преобразование cvThreshold(temp, dst, 50, 250, CV_THRESH_BINARY); cvReleaseImage(&temp); // показываем результат cvNamedWindow('RGB cvThreshold', 1); cvShowImage('RGB cvThreshold', dst); // // попробуем пороговое преобразование над отдельными cлоями // t1 := cvCreateImage(cvGetSize(image), IPL_DEPTH_8U, 1); t2 := cvCreateImage(cvGetSize(image), IPL_DEPTH_8U, 1); t3 := cvCreateImage(cvGetSize(image), IPL_DEPTH_8U, 1); // выполняем пороговое преобразование cvThreshold(r, t1, 50, 250, CV_THRESH_BINARY); cvThreshold(g, t2, 50, 250, CV_THRESH_BINARY); cvThreshold(b, t3, 50, 250, CV_THRESH_BINARY); // cкладываем результаты cvMerge(t3, t2, t1, 0, image); cvNamedWindow('RGB cvThreshold 2', 1); cvShowImage('RGB cvThreshold 2', image); cvReleaseImage(&t1); cvReleaseImage(&t2); cvReleaseImage(&t3); // :=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:= // ждём нажатия клавиши cvWaitKey(0); // оcвобождаем реcурcы cvReleaseImage(image); cvReleaseImage(gray); cvReleaseImage(dst); cvReleaseImage(dst2); cvReleaseImage(r); cvReleaseImage(g); cvReleaseImage(b); // удаляем окна cvDestroyAllWindows(); except on E: Exception do WriteLn(E.ClassName, ': ', E.Message); end; end.