缩放处理函数:函数cvPyrDown使用Gaussian金字塔分解对输入图像向下采样。
cvPyrDown--------------为openCV中的一个函数。
功能:函数cvPyrDown使用Gaussian金字塔分解对输入图像向下采样。对图像进行缩放处理。
格式:void cvPyrDown(const CvArr*src,CvArr*dst,int filter=CV_GAUSSIAN_5x5);
参数:src 输入图像。
dst 输出图像,其宽度和高度应是输入图像的一半。
filter 卷积滤波器类型,目前仅支持CV_GAUSSIAN_5x5。
代码:
#include "cv.h"
#include "highgui.h"
//filter 卷积滤波器类型,目前仅支持
IplImage *doPyrDown(IplImage*in,int filter = CV_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);
cvNamedWindow("suofang", 0);
cvShowImage("suofang", out);
cvWaitKey(0);
cvReleaseImage(&out);
cvDestroyWindow("suofang");
return (out);
}
结果:
doCanny()函数说明:
函数原型:void cvCanny( const CvArr* image,CvArr* edges,double threshold1,double threshold2,int aperture_size=3);
第一个参数表示输入图像,必须为单通道灰度图。
第二个参数表示输出的边缘图像,为单通道黑白图。
第三个参数和第四个参数表示阈值,这二个阈值中当中的小阈值用来控制边缘连接,大的阈值用来控制强边缘的初始分割即如果一个像素的梯度大与上限值,则被认为是边缘像素,如果小于下限阈值,则被抛弃。如果该点的梯度在两者之间则当这个点与高于上限值的像素点连接时我们才保留,否则删除。
第五个参数表示Sobel 算 子大小,默认为3即表示一个3*3的矩阵。Sobel 算子与高斯拉普拉斯算子都是常用的边缘算子
代码:
IplImage* doCanny(IplImage * in,double lowThresh,double highThresh,double aperture){
if (in->nChannels != 1)
//如果不是单通道图像,就返回0.即:只能处理单通道图像
return (0);
IplImage*out = cvCreateImage(cvSize(in->width, in->height), IPL_DEPTH_8U, 1);
//将单通道图像的通道数置为1,深度8位
cvCanny(in, out, lowThresh, highThresh, aperture);
//函数的第二及第三个参数为两个阈值。小阈值用来控制边缘连接,大的阈值用来控制强边缘的初始分割
cvNamedWindow("canny", 1);
cvShowImage("canny", out);
cvWaitKey(0);
cvReleaseImage(&out);
cvDestroyWindow("canny");
return (out);
}
int main(int argc, char **argv)
{
IplImage * image = cvLoadImage("D:\\vcWorkPlace\\lenna.jpg");
cvShowImage("original", image);
doPyrDown(image);
IplImage *img = cvLoadImage("D:\\vcWorkPlace\\lenna.jpg", 0);//读取灰度图像
doCanny(img, 10, 100, 3);
cvReleaseImage(&image);
cvReleaseImage(&img);
return 0;
}
cvLoadImage()---------同 imread()
函数原型:IplImage* cvLoadImage( const char* filename, int flags=CV_LOAD_IMAGE_COLOR );
参数一(filename) :要被读入的文件的文件名(包括后缀);
参数二(flags) :指定读入图像的颜色和深度:指定的颜色可以将输入的图片转为
3信道(CV_LOAD_IMAGE_COLOR),
单信道(CV_LOAD_IMAGE_GRAYSCALE),
保持不变(CV_LOAD_IMAGE_ANYCOLOR)。
深度指定输入的图像是否转为每个颜色信道每象素8位,或者同输入的图像一样保持不变。选中CV_LOAD_IMAGE_ANYDEPTH,则输入图像格式可以为8位无符号,16位无符号,32位有符号或者32位浮点型。如果输入有冲突的标志,将采用较小的数字值。如果想要载入最真实的图像,选择CV_LOAD_IMAGE_ANYDEPTH | CV_LOAD_IMAGE_ANYCOLOR。
函数cvLoadImage从指定文件读入图像,返回读入图像的指针。目前支持如下文件格式:
Windows位图文件- BMP, DIB;JPEG文件- JPEG, JPG, JPE;便携式网络图片- PNG; 便携式图像格式- PBM,PGM,PPM;Sun rasters - SR,RAS;TIFF文件- TIFF,TIF;OpenEXR HDR 图片 - EXR;JPEG 2000 图片- jp2。
cvSaveImage()函数保存图像到文件:int cvSaveImage( const char* filename, const CvArr* image );
filename:文件名。
image:要保存的图像。只有8位单通道或者3通道(通道顺序为'BGR' )可以使用这个函数保存。如果格式,深度或者通道不符合要求,请先用cvCvtScale 和cvCvtColor转换;或者使用通用的cvSave保存图像为XML或者YAML格式。此函数读取TIFF图片可能会失败。
cvLoadImage函数使用方法
cvLoadImage( filename, -1 ); 默认读取图像的原通道数
cvLoadImage( filename, 0 ); 强制转化读取图像为灰度图
cvLoadImage( filename, 1 ); 读取彩色图
//函数 cvCanny 采用 CANNY 算法发现输入图像的边缘而且在输出图像中标识这些边缘。
//threshold1和threshold2 当中的小阈值用来控制边缘连接,大的阈值用来控制强边缘的初始分割。
//需要注意的是,cvCanny只接受单通道图像作为输入。
#include "cv.h"
#include "highgui.h"
//------------------Canny边缘检测算法----------------
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);
//将单通道图像的通道数置为1,深度8位
cvCanny(in, out, lowThresh, highThresh, aperture);
//单通道输入图像 单通道存储边缘的输出图像 第一个阈值 第二个阈值 Sobel算子内核大小
return out;
}
int main() {
CvCapture* capture = cvCreateFileCapture("D:\\vcWorkPlace\\Wildlife.wmv");
//显示原始视频
cvNamedWindow("window", CV_WINDOW_NORMAL);
//显示灰色视频
cvNamedWindow("window_gray", CV_WINDOW_NORMAL);
//显示边缘检测之后的灰色视频
cvNamedWindow("window_Canny", CV_WINDOW_NORMAL);
IplImage* frame;
//************注意:要初始化!
IplImage* frame_gray = cvCreateImage(cvSize((int)cvGetCaptureProperty(capture, CV_CAP_PROP_FRAME_WIDTH),(int)cvGetCaptureProperty(capture, CV_CAP_PROP_FRAME_HEIGHT)),IPL_DEPTH_8U,1);
IplImage* frame_Canny = cvCreateImage(
cvSize((int)cvGetCaptureProperty(capture,CV_CAP_PROP_FRAME_WIDTH),(int)cvGetCaptureProperty(capture,CV_CAP_PROP_FRAME_HEIGHT)),IPL_DEPTH_8U,1);
while (1) {
frame = cvQueryFrame(capture);
if (!frame) {
break;
}
//将彩色图像转化为灰色图像
cvCvtColor(frame, frame_gray, CV_RGB2GRAY);
frame_Canny = doCanny(frame_gray, 10, 100, 3);
cvShowImage("window", frame);
cvShowImage("window_gray", frame_gray);
cvShowImage("window_Canny", frame_Canny);
if (cvWaitKey(33) == 27) {//每秒显示30帧
break;
}
}
cvReleaseCapture(&capture);
cvDestroyWindow("window");
cvDestroyWindow("window_gray");
cvDestroyWindow("window_Canny");
}