《学习Opencv》第五章 习题6
这是第五章 习题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的更多相关文章
- 学习opencv 第六章 习题十三
用傅里叶变换加速卷积,直接上代码,Mat版是Copy他人的. CvMat版 #include "stdafx.h" #include "cv.h" #inclu ...
- 统计学习导论:基于R应用——第五章习题
第五章习题 1. 我们主要用到下面三个公式: 根据上述公式,我们将式子化简为 对求导即可得到得到公式5-6. 2. (a) 1 - 1/n (b) 自助法是有有放回的,所以第二个的概率还是1 - 1/ ...
- python学习心得第五章
python学习心得第五章 1.冒泡排序: 冒泡是一种基础的算法,通过这算法可以将一堆值进行有效的排列,可以是从大到小,可以从小到大,条件是任意给出的. 冒泡的原理: 将需要比较的数(n个)有序的两个 ...
- Programming Entity Framework-dbContext 学习笔记第五章
### Programming Entity Framework-dbContext 学习笔记 第五章 将图表添加到Context中的方式及容易出现的错误 方法 结果 警告 Add Root 图标中的 ...
- [HeadFrist-HTMLCSS学习笔记]第五章认识媒体:给网页添加图像
[HeadFrist-HTMLCSS学习笔记]第五章认识媒体:给网页添加图像 干货 JPEG.PNG.GIF有何不同 JPEG适合连续色调图像,如照片:不支持透明度:不支持动画:有损格式 PNG适合单 ...
- opencv图像处理基础 (《OpenCV编程入门--毛星云》学习笔记一---五章)
#include <QCoreApplication> #include <opencv2/core/core.hpp> #include <opencv2/highgu ...
- 《Spring实战》学习笔记-第五章:构建Spring web应用
之前一直在看<Spring实战>第三版,看到第五章时发现很多东西已经过时被废弃了,于是现在开始读<Spring实战>第四版了,章节安排与之前不同了,里面应用的应该是最新的技术. ...
- 【马克-to-win】学习笔记—— 第五章 异常Exception
第五章 异常Exception [学习笔记] [参考:JDK中文(类 Exception)] java.lang.Object java.lang.Throwable java.lang.Except ...
- 学习笔记 第五章 使用CSS美化网页文本
第五章 使用CSS美化网页文本 学习重点 定义字体类型.大小.颜色等字体样式: 设计文本样式,如对齐.行高.间距等: 能够灵活设计美观.实用的网页正文版式. 5.1 字体样式 5.1.1 定义字体 ...
随机推荐
- UBUNTU 札记(53条经验)
adobe_pdf 菜单栏 /etc/profile 是一个global config file,会影响系统全局用户,如果你只想对single user生效的话,可以修改vi ~/.bash_prof ...
- Cookie及App登陆的原理
1.Cookie Cookie意为"甜饼",是由W3C组织提出的.目前Cookie已经成为标准.由于HTTP是一种无状态的协议,服务器单从网络连接上无从知道客户身份.怎么办呢?就给 ...
- POJ1330Nearest Common Ancestors——近期公共祖先(离线Tarjan)
http://poj.org/problem? id=1330 给一个有根树,一个查询节点(u,v)的近期公共祖先 836K 16MS #include<iostream> #includ ...
- Apache + Tomcat集群配置详解 (1)
一.软件准备 Apache 2.2 : http://httpd.apache.org/download.cgi,下载msi安装程序,选择no ssl版本 Tomcat 6.0 : http://to ...
- [转] react-native 之布局篇
PS: 苹果使用的宽度单位是为了设计开发者在应用上使用接近的数值.比如宽度范围都在320-414之间.但是宽度对应到像素是有一个转换比例的,对于背景图尤其要准备足够像素的图片.这个足够像素可以通过公式 ...
- [转] 学习使用:before和:after伪元素
http://www.w3cplus.com/css3/learning-to-use-the-before-and-after-pseudo-elements-in-css.html 如果你一直密切 ...
- Java中获得程序当前路径的4中方法
Java中获得程序当前路径的4中方法: 在Application中: import java.util.*; public class TestUserDir { public static void ...
- URAL 2032 - Conspiracy Theory and Rebranding【本源勾股数组】
[题意] 给出三角形的三个边长,均是10^7以内的整数,问三角形的三个角的坐标是否能均是整数,输出其中任意一个解. [题解] 一开始想的是枚举一条边的横坐标,然后通过勾股定理以及算角度求出其他点的坐标 ...
- Python之路【第十四篇】:AngularJS --暂无内容-待更新
Python之路[第十四篇]:AngularJS --暂无内容-待更新
- 关于promise
后来发现promise是解决异步的一个链式调用的好的方法,避免了所谓的回调的监狱, 它有三个状态,未作为,已经完成和已经失败,起始是未作为,然后有了动作总会有个结果, 分成resolve,已经顺利ok ...