版权声明:本文为博主原创文章,未经博主允许不得转载。 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