Delphi-OpenCV/samples/LibTest/cvSplit_cvMerge/cvSplit_cvMerge.dpr
Laex fde0aa2f53 Add samples
LibTest
[+] cv_CalcOpticalFlowPyrLK
[+] cv_SnakeImage
MultiDemo
[+] CameraShift
[+] Squares

Signed-off-by: Laex <laex@bk.ru>
2013-04-05 15:36:47 +04:00

134 lines
3.6 KiB
ObjectPascal
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

// 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,
{$I ..\..\uses_include.inc}
;
const
filename = 'Resource\cat2.jpg';
Var
image: pIplImage = nil;
gray: pIplImage = nil;
dst: pIplImage = nil;
dst2: pIplImage = nil;
// для хранения отдельных слоёв 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);
// картинка для хранения изображения в градациях серого
gray := cvCreateImage(cvGetSize(image), image^.depth, 1);
// преобразуем картинку в градации серого
cvConvertImage(image, gray, CV_BGR2GRAY);
// покажем серую картинку
cvNamedWindow('gray', 1);
cvShowImage('gray', gray);
dst := cvCreateImage(cvGetSize(gray), IPL_DEPTH_8U, 1);
dst2 := cvCreateImage(cvGetSize(gray), IPL_DEPTH_8U, 1);
// пороговые преобразования над картинкой в градациях серого
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);
// разбиваем на отдельные слои
cvSplit(image, b, g, r, 0);
// картинка для хранения промежуточных результатов
temp := cvCreateImage(cvGetSize(image), IPL_DEPTH_8U, 1);
// складываем картинки с одинаковым весом
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);
//
// попробуем пороговое преобразование над отдельными слоями
//
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);
// складываем результаты
cvMerge(t3, t2, t1, 0, image);
cvNamedWindow('RGB cvThreshold 2', 1);
cvShowImage('RGB cvThreshold 2', image);
cvReleaseImage(&t1);
cvReleaseImage(&t2);
cvReleaseImage(&t3);
// :=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=
// ждём нажатия клавиши
cvWaitKey(0);
// освобождаем ресурсы
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.