《学习Opencv》第 2 章笔记及示例程序

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/CV2017/article/details/82683805

开发环境及工具:Opencv1.0 + vs2010 + win7

例2-1 从磁盘加载并在屏幕上显示一副图像的简单 Opencv 程序   例2.1跑程序参考链接

  • cvLoadImage() 函数通过文件名确定被加载文件的格式,并且该函数自动分配图像数据结构所需的内存,该函数执行完后返回一个指针,此指针指向一块描述该图像文件的数据结构(IplImage)而分配的内存块
  • cvNameWindow() 函数由 HighGUI 库提供,用于在屏幕上创建一个窗口,将被显示的图像包含于该窗口中,函数的第一个参数指定了该窗口的窗口标题,作为一个与其他函数交互的参数,第二个参数定义了窗口的属性,CV_WINDOW_AUTOSIZE 表示窗口根据图像的实际大小自动进行拉伸或缩放以容纳图像
  • cvShowImage() 显示图像,第一个参数确定在哪个窗口显示,第二个参数表示显示哪副图像数据
  • cvWaitKey() 函数的功能是是程序暂停,等待用户触发一个按键操作。如果将该函数参数设置为一个正数,则程序将暂停一段时间,时间长为该整数值个毫秒单位,然后继续执行程序,即使用户没有按下任何键。当该函数参数设置为 0 或 负数时,程序将一直等待用户触发按键操作
  • cvReleaseImage() 一旦用完加载到内存的图像文件,就应该释放为该图像文件所分配的内存,执行完后,指针被设置为 NULL
  • cvDestoryWindow() 销毁显示图像文件的窗口,同时释放为该窗口所分配的所有内存

例2-2

例2-3

例2-4 载入一副图像进行平滑处理

#include<highgui.h>
#include<cv.h>

int main(int argc ,char **argv)
{
	IplImage *imgIn = cvLoadImage("C:\\1.png");
	cvNamedWindow("in");
	cvNamedWindow("out");
	cvShowImage("in", imgIn);

	IplImage *imgOut = cvCreateImage(cvGetSize(imgIn), IPL_DEPTH_8U, 3);
	cvSmooth(imgIn, imgOut, CV_GAUSSIAN, 3, 3);
	cvShowImage("out",imgOut);

	cvWaitKey(0);
	cvReleaseImage(&imgIn);
	cvReleaseImage(&imgOut);
	cvDestroyWindow("in");
	cvDestroyWindow("out");

	return 0;
}

例2-5 使用 cvPyrDown() 创建一副宽度和高度为输入图像一半尺寸的图像

#include<highgui.h>
#include<cv.h>

IplImage* doPyrDown(IplImage *in, int filter = IPL_GAUSSIAN_5x5)
{
	assert(in->width%2 == 0 && in->height%2 == 0);
	IplImage* out = cvCreateImage(cvSize(in->width/2, in->height/2), in->depth, in->nChannels);
	cvPyrDown(in, out);
	return(out);
	cvReleaseImage(&out);
}

int main(int argc ,char **argv)
{
	IplImage *imgIn = cvLoadImage("C:\\1.png");
	cvNamedWindow("in");
	cvNamedWindow("out");
	cvShowImage("in", imgIn);

	cvShowImage("out",doPyrDown(imgIn, IPL_GAUSSIAN_5x5));

	cvWaitKey(0);
	cvReleaseImage(&imgIn);
	cvDestroyWindow("in");
	cvDestroyWindow("out");

	return 0;
}

例2-6 Canny 边缘检测将输出一个单通道(灰度级)图像

#include<highgui.h>
#include<cv.h>

IplImage* doCanny(IplImage* in, double lowThresh, double highThresh, double aperture)
{
	if (in->nChannels != 1)
	{
		return 0;
	}

	IplImage* out = cvCreateImage(cvGetSize(in), IPL_DEPTH_8U, 1);
	cvCanny(in, out, lowThresh, highThresh, aperture);
	return(out);
	//cvReleaseImage(&out);
}

int main(int argc ,char **argv)
{
	IplImage *imgIn = cvLoadImage("C:\\1.png", CV_LOAD_IMAGE_GRAYSCALE);
	cvNamedWindow("in");
	cvNamedWindow("out");
	cvShowImage("in", imgIn);

	cvShowImage("out",doCanny(imgIn, 50, 150, 3));

	cvWaitKey(0);
	cvReleaseImage(&imgIn);
	cvDestroyWindow("in");
	cvDestroyWindow("out");

	return 0;
}
  • Canny only handles gray scale images

例2-7 在一个简单的图像处理流程中进行两次缩放处理与 Canny 边缘检测

#include<highgui.h>
#include<cv.h>

IplImage* doPyrDown(IplImage *in, int filter = IPL_GAUSSIAN_5x5)
{
	assert(in->width%2 == 0 && in->height%2 == 0);
	IplImage* out = cvCreateImage(cvSize(in->width/2, in->height/2), in->depth, in->nChannels);
	cvPyrDown(in, out);
	return(out);
	cvReleaseImage(&out);
}

IplImage* doCanny(IplImage* in, double lowThresh, double highThresh, double aperture)
{
	if (in->nChannels != 1)
	{
		return 0;
	}

	IplImage* out = cvCreateImage(cvGetSize(in), IPL_DEPTH_8U, 1);
	cvCanny(in, out, lowThresh, highThresh, aperture);
	return(out);
	cvReleaseImage(&out);
}



int main(int argc ,char **argv)
{
	IplImage *imgIn = cvLoadImage("C:\\1.png", CV_LOAD_IMAGE_GRAYSCALE);
	cvNamedWindow("in");
	cvNamedWindow("out");
	cvShowImage("in", imgIn);

	IplImage *img1 = doPyrDown(imgIn, IPL_GAUSSIAN_5x5);
	IplImage *img2 = doPyrDown(img1, IPL_GAUSSIAN_5x5);
	cvShowImage("out",doCanny(img2, 50, 150, 3));

	cvWaitKey(0);
	cvReleaseImage(&imgIn);
	cvReleaseImage(&img1);
	cvReleaseImage(&img2);
	cvDestroyWindow("in");
	cvDestroyWindow("out");

	return 0;
}

例2-8 

例2-9

例2-10

猜你喜欢

转载自blog.csdn.net/CV2017/article/details/82683805