这是第五章 习题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. Inheritance - SGU 129(线段与多边形相交的长度)

    题目大意:给一个凸多边形(点不是按顺序给的),然后计算给出的线段在这个凸多边形里面的长度,如果在边界不计算. 分析:WA2..WA3...WA4..WA11...WA的无话可说,总之细节一定考虑清楚, ...

  2. hdoj 2277 Change the ball【找规律】

    Change the ball Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)T ...

  3. Nginx系列~负载均衡服务器与WWW服务器的实现

    上两讲主要是关于Nginx的环境的介绍,没有涉及到真正环境的开发,这次我们以一个实现的例子,来说明一下负载均衡服务器与WWW服务器的Nginx是如何配置的,并最终如何实现的. 如下是一个实际场景,一台 ...

  4. 支持MySql的数据库自动分表工具DBShardTools发布

    支持MySql的数据库自动分表工具DBShardTools发布 前段时间参与了公司的一个项目,这个项目的特点是数据量.访问量都比较大,考虑使用数据库水平分表策略,Google了大半天,竟然没有找到分表 ...

  5. android 09

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools=&q ...

  6. Java语言基础(四)

    Java语言基础(四) 一.基本数据类型(8) byte  8位  使用较少,一般用于网络传输: -128-+127 short  16位 不常用 -32768-+32767 int  32位 常用  ...

  7. Google代码实验室

    https://code.google.com/p/google-styleguide/

  8. viewpager+fragment学习笔记

    有暇,总结一下viewpager+fragment的使用. 先来看看效果图: 有三个标题,三个fragment,滑动时标题的颜色会随着变化. MainActivity.java public clas ...

  9. PhalGo-介绍

    PhalGo-介绍 phalgo是一个Go语言的一体化开发框架,主要用于API开发应为使用ECHO框架作为http服务web程序一样可以使用,牛顿曾经说过"如果我比别人看得远,那是因为我站在 ...

  10. windows10UWP:Segoe MDL2 图标指南

    windows10 UWP 开发中,图标的使用非常广泛.为此,微软建议大家使用 Segoe MDL2 Assets 字体来获取图标.Segoe MDL2 Assets 包括了哪里图标,微软在 http ...