这是第五章 习题5、6的结合版,其中实现了摄像头抓拍功能,能够成功运行。

#include "stdafx.h"
#include "cv.h"
#include "highgui.h" void* getImage()
{
CvCapture* capture=cvCreateCameraCapture(0);
IplImage *img1=NULL,*img2=NULL,*img3=NULL,*frame=NULL,*ppImage=NULL;
char keycode;
cvNamedWindow("frame");
if(capture!=NULL)
{
frame=cvQueryFrame(capture); //注意任何视频(包括摄像头获取的视频的第一帧都是空帧,要从下一帧开始才是图像)
while(1)
{
frame=cvQueryFrame(capture);
cvShowImage("frame",frame);
keycode=cvWaitKey(30); if(keycode==27)
break;
//保存第一张想要保存的图像
if(keycode=='1')
{
img1=cvCreateImage(cvGetSize(frame),frame->depth,1); //将通道数为1对应灰度图像,再将frame利用cvConvertImage转换成灰度图像
cvConvertImage(frame,img1); //也可以利用cvCvtColor(frmae,img1,CV_BGR2GRAY)转成灰度图像
cvSaveImage("C:/Users/shark/Desktop/1.jpg",img1);
}
//保存第二张想要的图像:相对于第一张图像多出一个水杯之类的东西
if(keycode=='2')
{
img2=cvCreateImage(cvGetSize(frame),frame->depth,1);
cvConvertImage(frame,img2);
cvSaveImage("C:/Users/shark/Desktop/2.jpg",img2);
}
}
}
img3=cvCreateImage(cvGetSize(frame),frame->depth,1);
ppImage=cvCreateImage(cvGetSize(frame),frame->depth,1);
//差的绝对值、二值化阈值、开操作
cvAbsDiff(img1,img2,img3);
cvThreshold(img3,img1,20,255,CV_THRESH_BINARY);
cvMorphologyEx(img1,img3,NULL,NULL,CV_MOP_OPEN);
cvCopy(img3,ppImage);
cvSaveImage("C:/Users/shark/Desktop/3.jpg",ppImage);
cvReleaseImage(&img1);
cvReleaseImage(&img2);
cvReleaseImage(&img3);
cvReleaseCapture(&capture);
cvDestroyAllWindows(); return ppImage;
} bool findImage(IplImage* pImage,char nVal, CvPoint* pPos)
{
char* ptr=NULL;
if(pImage->nChannels==1)
{
ptr=pImage->imageData;
if(ptr!=NULL)
{
for(int row=0;row<pImage->height;row++)
{
for(int col=0;col<pImage->width;col++)
{
if(ptr[col]==nVal) //此处图像颜色类型为uchar
{
pPos->x=col;
pPos->y=row;
return true;
}
if(ptr[col]>150) //???
{
int x=0;
}
}
ptr+=pImage->widthStep;
}
}
}
return false;
} int main()
{
IplImage* pImg=NULL;
CvPoint oldPoint={0,0},curPoint={0,0};
int nArea=0,newArea=0;
CvConnectedComp comp;
char* szMyWin="my win"; pImg=(IplImage*)getImage();
if(pImg!=NULL)
{
do
{
if(findImage(pImg,255,&curPoint)) //找像素值为255的像素点
{
cvFloodFill(pImg,curPoint,cvScalar(100),cvScalar(0),cvScalar(0),&comp,8|CV_FLOODFILL_FIXED_RANGE);
if(comp.area<nArea)
{
if(comp.area>0)
cvFloodFill(pImg,curPoint,cvScalar(0),cvScalar(0),cvScalar(0),&comp,8|CV_FLOODFILL_FIXED_RANGE);
}
else
{
newArea=comp.area;
if(nArea>0) //此为对之前区域填充
cvFloodFill(pImg,oldPoint,cvScalar(0),cvScalar(0),cvScalar(0),&comp,8|CV_FLOODFILL_FIXED_RANGE);
memcpy(&oldPoint,&curPoint,sizeof(CvPoint));
//oldPoint=curPoint;
nArea=newArea;
}
}
else
{
cvFloodFill(pImg,oldPoint,cvScalar(255),cvScalar(0),cvScalar(0),&comp,8|CV_FLOODFILL_FIXED_RANGE); //填充最后的最大区域
break;
}
}while(true);
cvSaveImage("C:/Users/shark/Desktop/4.jpg",pImg);
cvNamedWindow(szMyWin);
cvShowImage(szMyWin,pImg);
cvWaitKey(0); cvReleaseImage(&pImg);
cvDestroyWindow(szMyWin);
}
}

  

《学习Opencv》第五章 习题6的更多相关文章

  1. 学习opencv 第六章 习题十三

    用傅里叶变换加速卷积,直接上代码,Mat版是Copy他人的. CvMat版 #include "stdafx.h" #include "cv.h" #inclu ...

  2. 统计学习导论:基于R应用——第五章习题

    第五章习题 1. 我们主要用到下面三个公式: 根据上述公式,我们将式子化简为 对求导即可得到得到公式5-6. 2. (a) 1 - 1/n (b) 自助法是有有放回的,所以第二个的概率还是1 - 1/ ...

  3. python学习心得第五章

    python学习心得第五章 1.冒泡排序: 冒泡是一种基础的算法,通过这算法可以将一堆值进行有效的排列,可以是从大到小,可以从小到大,条件是任意给出的. 冒泡的原理: 将需要比较的数(n个)有序的两个 ...

  4. Programming Entity Framework-dbContext 学习笔记第五章

    ### Programming Entity Framework-dbContext 学习笔记 第五章 将图表添加到Context中的方式及容易出现的错误 方法 结果 警告 Add Root 图标中的 ...

  5. [HeadFrist-HTMLCSS学习笔记]第五章认识媒体:给网页添加图像

    [HeadFrist-HTMLCSS学习笔记]第五章认识媒体:给网页添加图像 干货 JPEG.PNG.GIF有何不同 JPEG适合连续色调图像,如照片:不支持透明度:不支持动画:有损格式 PNG适合单 ...

  6. opencv图像处理基础 (《OpenCV编程入门--毛星云》学习笔记一---五章)

    #include <QCoreApplication> #include <opencv2/core/core.hpp> #include <opencv2/highgu ...

  7. 《Spring实战》学习笔记-第五章:构建Spring web应用

    之前一直在看<Spring实战>第三版,看到第五章时发现很多东西已经过时被废弃了,于是现在开始读<Spring实战>第四版了,章节安排与之前不同了,里面应用的应该是最新的技术. ...

  8. 【马克-to-win】学习笔记—— 第五章 异常Exception

    第五章 异常Exception [学习笔记] [参考:JDK中文(类 Exception)] java.lang.Object java.lang.Throwable java.lang.Except ...

  9. 学习笔记 第五章 使用CSS美化网页文本

    第五章   使用CSS美化网页文本 学习重点 定义字体类型.大小.颜色等字体样式: 设计文本样式,如对齐.行高.间距等: 能够灵活设计美观.实用的网页正文版式. 5.1 字体样式 5.1.1 定义字体 ...

随机推荐

  1. DateADD日期Sql

    --1.  当前系统日期.时间 select getdate() --2015-01-06 09:27:27.277   --2.时间操作 dateadd  在向指定日期加上一段时间的基础上,返回新的 ...

  2. for循环++i效率

    偶然用到for循环 注意查看了一下 ++i的速度更快 这是PHP语言独有的 其他语言不会有这种情况

  3. ELK初学搭建(elasticsearch)

    ELK初学搭建(elasticsearch) elasticsearch logstash kibana ELK初学搭建 elasticsearch 1.环境准备 centos6.8_64 mini ...

  4. sql server 获取每一个类别中值最大的一条数据

    /* 数据如下: name val memo a 2 a2(a的第二个值) a 1 a1--a的第一个值 a 3 a3:a的第三个值 b 1 b1--b的第一个值 b 3 b3:b的第三个值 b 2 ...

  5. Imatest 崩溃

    在使用Imatest时候,发现选取chart图的区域时候.Imatest停止工作,例如以下图.百度半天没有找到类似的问题,事实上这个问题在之前的公司也碰到过一回,卸载重N次,无效.如今又碰到了,问之前 ...

  6. linux lsof命令详解

    linux lsof命令详解 简介 lsof(list open files)是一个列出当前系统打开文件的工具.在linux环境下,任何事物都以文件的形式存在,通过文件不仅仅可以访问常规数据,还可以访 ...

  7. (转载)Windows 7 Ultimate(旗舰版)SP1 32/64位官方原版下载(2011年5月12日更新版)

    MSDN于2011年5月12日,最新发布简体中文Windows 7 Ultimate 旗舰版 SP1 DVD镜像安装包,分32位和64位两个版本.最新发行代号分别是:677486(32位),67740 ...

  8. block没那么难(一):block的实现

    本系列博文总结自<Pro Multithreading and Memory Management for iOS and OS X with ARC> block 顾名思义就是代码块,将 ...

  9. iOS RSA 加密解密及签名验证

    1.首先要下载openssl.这个不用说,直接官网下载或者用brew install openssl下载. 2.终端生成私钥密钥. 2.1生成私钥 openssl genrsa - 2.2生成密钥 o ...

  10. 删除右键菜单的“用阿里旺旺发送此文件”项

    在运行对话框里的输入框内输入Regedit.exe,点击确定按钮就启动了注册表编辑器程序. 在注册表编辑器窗口左侧展开HKEY_CLASSES_ROOT\CLSID{0DE1378D-F811-40E ...