opencv学习-1.2-环境准备 &&
1.2.2 创建一幅宽度和高度为输入图像一半尺寸的图像 &&
1.2.1 播放AVI和控制AVI 后面做一个加强就是怎么处理鼠标右键,好像还没法子关联
改天在看贴实际代码
这几个比较相近写在一起好了,
这个周末加班,项目比较敢,耽误了一点点进度,但是不影响学习笔记更新
家里的台灯有点暗,的买一个台灯
我所有的Demo都是在我当前的环境下完成的
Windows XP SP3
VS2008 SP1
OpenCV-2.2.0
cmake-2.8.4-win32-x86.exe
有这些基本可以开工了,还好前面写的比较详细,这里可以一笔带过
接下来我们开始继续coding旅行:
1.2.1 图像平滑处理 -- 算法描述和代码写在一起了
#include "stdafx.h"
#include "cv.h"
#include "highgui.h"
/*
对于我这个算法盲人,我还是先学习
图像处理:柔化(平滑)处理
算法说明:
柔化(平滑)处理是将原图像的每个像素的颜色值用与其相邻的n*n个像素的平均值来代替,
可利用算术平均值或加权平均值来计算。
例如*3的点阵,设源图像某像素的值为f(i,j):
f(i-1,j-1) f(i-1,j) f(i-1,j+1)
f(i,j-1) f(i,j) f(i,j+1)
f(i+1,j-1) f(i+1,j) f(i+1,j+1)
a.加权平均值与算术平均值:
**加权平均值:
将各数值乘以相应的单位数,然后加总求和得到总体值,再除以总的单位数;
平均数的大小不仅取决于总体中各单位的标志值(变量值)的大小,而且取决于各标志值出现的次数(频数);
由于各标志值出现的次数对其在平均数中的影响起着权衡轻重的作用,因此叫做权数或权重。
**算术平均值:
(a1+a2+……an)/n为这几个数的算术平均值
**举例:
下面是一个同学的某一科的考试成绩:平时测验80,期中90,期末95 。
学校规定的科目成绩的计算方式是:平时测验占20%;期中成绩占30%;期末成绩占50%;
加权平均值= (80*20% + 90*30% + 95*50%)/(20%+30%+50%) = 90.5
算数平均值= (80 + 90 + 95)/3 = 88.3
b.高斯模版:
3*3高斯模版:
1 2 1
2 4 2 *(/16)
1 2 1
*/
void showImage(IplImage *image)
{
cvNamedWindow("w-in");
cvNamedWindow("w-out");
cvShowImage("w-in", image);
IplImage *out = cvCreateImage(cvGetSize(image), IPL_DEPTH_8U, 3);
//do the smooth
cvSmooth(image, out, CV_GAUSSIAN, 3, 3);
cvShowImage("w-out", out);
cvReleaseImage(&out);
cvWaitKey(0);
cvDestroyWindow("w-in");
cvDestroyWindow("w-out");
}
int _tmain(int argc, _TCHAR* argv[])
{
char *path = "F://devCenter_B//OpenCV//src//LoadImage//Debug//lena.jpg";
IplImage *img;
img = cvLoadImage(path, 1);
showImage(img);
return 0;
}
1.2.2 创建一幅宽度和高度为输入图像一半尺寸的图像
#include "stdafx.h"
#include "cv.h"
#include "highgui.h"
// 创建一副宽度和高度为输入图像一半尺寸的图像
// 这个地方很多帖子有错误,书中写错了 int filter = CV_GAUSSIAN_5x5 用这个就好
// 多看看代码还是有好处地
IplImage *doPyDown(IplImage *in, int filter = CV_GAUSSIAN_5x5)
{
IplImage *out= cvCreateImage(cvSize( in->width/2, in->height/2 ), in->depth, in->nChannels);
cvPyrDown(in, out);
return out;
}
void showImage(IplImage *image)
{
cvNamedWindow("w-in");
cvNamedWindow("w-out");
cvShowImage("w-in", image);
IplImage *out = cvCreateImage(cvGetSize(image), IPL_DEPTH_8U, 3);
//do the smooth
cvSmooth(image, out, CV_GAUSSIAN, 3, 3);
//add by eagle for doPyDown working
//cvShowImage("w-out", out);
cvShowImage("w-out", doPyDown(out));
//add end-==================================
cvReleaseImage(&out);
cvWaitKey(0);
cvDestroyWindow("w-in");
cvDestroyWindow("w-out");
}
int _tmain(int argc, _TCHAR* argv[])
{
char *path = "F://devCenter_B//OpenCV//src//LoadImage//Debug//lena.jpg";
IplImage *img;
img = cvLoadImage(path, 1);
showImage(img);
return 0;
}
//
1.2.3 显示图像,例子我就不做了
CvNameWindow
cvShowImage
1.2.3 播放AVI和控制AVI 后面做一个加强就是怎么处理鼠标右键,好像还没法子关联
改天在看贴实际代码
#include "stdafx.h"
#include "cv.h"
#include "highgui.h"
int g_slider_position = 0;
CvCapture * g_capture = NULL;
void onTrackbarSlide(int pos)
{
cvSetCaptureProperty(g_capture, CV_CAP_PROP_POS_FRAMES,pos);
}
void on_mouse(int event, int x, int y, int flags, void* param)
{
switch(event)
{
case CV_EVENT_LBUTTONDOWN:
::MessageBox(NULL, _T("good"), _T("Leftbuttoon"), MB_OK);
break;
}
}
int _tmain(int argc, _TCHAR* argv[])
{
cvNamedWindow("Avi Demo", CV_WINDOW_AUTOSIZE);
//Avi : http://www.cnblogs.com/embed/archive/2004/07/19/25615.html
g_capture = cvCreateFileCapture("F://devCenter_B//OpenCV//src//PlayAVIExDemo//Debug//prison.break.101.hdtv-lol.avi");
int frames = (int)cvGetCaptureProperty(g_capture, CV_CAP_PROP_FRAME_COUNT);
if(frames != 0)
{
// 回调方式
cvCreateTrackbar ("Position", "Avi Demo", &g_slider_position, frames, onTrackbarSlide );
cvSetMouseCallback("Avi Demo", on_mouse, 0);
}
IplImage *frame;
while(1)
{
// 读Avi文件,将下一帧数据载入内存,实际上是更新到结构体里面去
frame = cvQueryFrame( g_capture );// 这个API结构体返回内存底层已经申请好了,偶们就不用管理了
if(!frame)
{
break;
}
cvShowImage("Avi Demo", frame);
char c= cvWaitKey(33); // 等待33毫秒
if( c == 27)
{
break;
}
}
cvReleaseCapture( &g_capture );
cvDestroyWindow("Avi Demo");
return 0;
}