《学习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 定义字体 ...
随机推荐
- 炮兵阵地 - POJ 1185(状态压缩)
分析:先枚举出来所有的合法状态(当N=10的时候合法状态最多也就60种),用当前状态匹配上一行和上上一行的状态去匹配,看是否可以.....复杂度100*60*60*60,也可以接受. 代码如下: == ...
- 【Lucene3.6.2入门系列】第15节_SolrJ高亮
package com.jadyer.solrj; import java.util.ArrayList; import java.util.List; import java.util.Map; i ...
- 月見(つきみ) 夕(ゆう) SumiHui.墨虺
造影早迎中秋,自己通过word设计的
- mysql中group_concat函数用法
该函数返回带有来自一个组的连接的非NULL值的字符串结果.该函数是一个增强的Sybase SQL Anywhere支持的基本LIST()函数. 语法结构: GROUP_CONCAT([DISTINCT ...
- DOS命令创建以日期为文件名的任务计划TXT文件
因为每天早上都要做计划,所以做了个批处理文件来创建任务计划TXT文件 文件内容展示如下: 2013/07/09 周二 今日任务: 1. 2. 待办任务: 1. 2. 出现问题: 解决办法: 出现问题: ...
- hibernate之自定义持久化实现
- iOS View的Frame和bounds之区别,setbounds使用(深入探究)
前言: 在ios开发中经常遇到两个词Frame和bounds,本文主要阐述Frame和bound的区别,尤其是bound很绕,较难理解. 一.首先,看一下公认的资料: 先看到下面的代码你肯定就明白了一 ...
- css 权威指南笔记(二)元素
替换元素 用来替换元素内容的部分并非有文档内容直接表示. img input 非替换元素 其内容由用户代理(通常是一个浏览器)在元素本身生成的框中显示. 块级元素 块级元素生成一个 元素框,(默认)会 ...
- python - 操作RabbitMQ
python - 操作RabbitMQ 介绍 RabbitMQ是一个在AMQP基础上完整的,可复用的企业消息系统.他遵循Mozilla Public License开源协议.MQ全称为Mess ...
- java InputStream
java InputStream 当为网络数据流是,不能以read为-1作为数据结束的尾. 而用下列案例获取数据. Log.v(TAG, "==========start========== ...