搞图像处理早已对opencv有所了解,一直想用opencv来进行日常编程,由于导师的缘故一直让用matlab,说来的比较快(发论文赶时间),但是师兄多次深深告诫,多用C/C++,因为很少有公司做产品用matlab,否则找工作时会比较麻烦。为了就业为了体验飞快的处理速度,和opencv新版本的可以和matlab媲美的C++接口特性,更为了今后的工作,决定开始少用matlab,多用CC++,深知自己水平有限,但要不断尝试,不断练习。此处先用opencv2.3.1+vs2010来体验一把。当然这里临模仿了牛人成果,在此致以歉意!
我本菜鸟,在安装和调试opencv过程中遇到很多这样那样的问题,在百度中搜索一个个一步步得到了解决,谢谢前辈!
比如:opencv路径问题,包含库问题,调试过程中的问题等等。#include "stdafx.h"
#include "opencv2/imgproc/imgproc.hpp"
#include "opencv2/highgui/highgui.hpp"
#include "cv.h"
#include"highgui.h"
#include "iostream"
//采用cv命名空间和标准命名空间
using namespace std;
using namespace cv;
//定义全局变量
int DELAY_CAPTION=1500; //显示标题时延时至少1.5s
int DELAY_BLUR=100; //显示每次滤波时延时0.1s
int MAX_KERNEL_LENGTH=31;//最大的滤波核长度为31
Mat src,dst;
//函数说明
int display_caption(char *caption);
int display_dst(int delay);
//主函数
int main(int argc, _TCHAR* argv[])
{
namedWindow(window_name,CV_WINDOW_AUTOSIZE);//建立一个窗口
//将lena图片读写到矩阵src
src = imread("D:\\lena.jpg",1);
//将Origin Image单词显示在dst图片中,并在窗口中显示1.5s
if(display_caption("origin image")!=0){return 0;}//在窗口中间位置显示单词
dst=src.clone();//将src复制到dst中去;
if( display_dst(DELAY_CAPTION)!=0){return 0;}//显示dst(原图)1.5s
if(display_caption("jun zhi filter")!=0){return 0;}//显示单词
//对图像进行滤波处理并显示,
int i;
for(i=1;i<MAX_KERNEL_LENGTH;i=i+2)//不断改变滤波核的大小显示观察效果
{
blur(src,dst,Size(i,i),Point(-1,-1));
if(display_dst(DELAY_BLUR)){return 0;}
}
if(display_caption("GAUSS")!=0){return 0;}//显示单词
for(i=1;i<MAX_KERNEL_LENGTH;i=i+2)
{
GaussianBlur(src,dst,Size(i,i),0,0);
if(display_dst(DELAY_BLUR)){return 0;}
}
}
//中间显示标题,没有按键触发时返回0
int display_caption(char *caption)
{
dst=Mat::zeros(src.size(),src.type());
putText(dst,caption,Point(src.cols/4,src.rows/2),CV_FONT_HERSHEY_SCRIPT_SIMPLEX,1,(0,0,255));
imshow(window_name,dst);
int c=waitKey(DELAY_CAPTION);
if(c>=0)
return -1;//若有按键按下返回-1;否则返回0
return 0;
/*
//功能:初始化字体结构体
//原型:void cvInitFont(
CvFont* font, //被初始化的字体结构体
int font_face,//字体名称标识符
$ CV_FONT_HERSHEY_SIMPLEX - 正常大小无衬线字体。
$ CV_FONT_HERSHEY_PLAIN - 小号无衬线字体。
$ CV_FONT_HERSHEY_DUPLEX - 正常大小无衬线字体。( 比CV_FONT_HERSHEY_SIMPLEX更复杂)
$ CV_FONT_HERSHEY_COMPLEX - 正常大小有衬线字体。
$ CV_FONT_HERSHEY_TRIPLEX - 正常大小有衬线字体 ( 比CV_FONT_HERSHEY_COMPLEX更复杂)
$ CV_FONT_HERSHEY_COMPLEX_SMALL - CV_FONT_HERSHEY_COMPLEX 的小译本。
$ CV_FONT_HERSHEY_SCRIPT_SIMPLEX - 手写风格字体。
$ CV_FONT_HERSHEY_SCRIPT_COMPLEX - 比CV_FONT_HERSHEY_SCRIPT_SIMPLEX更复杂。
//这个参数能够由一个值和可选择的CV_FONT_ITALIC字体标记合成,就是斜体字
double hscale,//字体宽度。
//如果等于1.0f,字符的宽度是最初的字体宽度。如果等于0.5f,字符的宽度是最初的字体宽度的一半
double vscale,//字体高度。
double shear=0,//字体的斜度。
//当值为0时 ,字符不倾斜;当值为1.0f时,字体倾斜≈45度,等等。厚度让字母着重显示。函数cvLine用于绘制字母
int thickness=1, //字体笔划的粗细程度
int line_type=8 //字体笔划的类型
);
//--------------------------------------------*/
//opencv2.3.1中往图片上加字用putText函数,大家一看就应该知道参数是什么意思了
//延时1.5s,注意在c++中是waitKey,该函数参数如果是非正数的话就直接停止在该位
//置等待按键触发,否则延时至少参数时长ms
}
//显示dst,delay,时间
int display_dst(int delay)
{
imshow(window_name,dst);
int c=waitKey(delay);
if(c>=0)
return -1;
return 0;
}