Opencv中如何实现图像截取
2013-06-25 17:29
363 查看
最近看美剧 《TELL LIE TO ME》,对里边的一些东西非常感兴趣,具体就是摄像头目录然后会自动截取眼睛的图像到另外一个屏幕,想用OPENCV实现下。
自己开始使用OPENCV对很多东西都不怎么熟悉,可以使用OPENCV既有的算法检测到眼睛,然后就差截取眼睛部分的图像了,在网络上找了很多,大概只有一种可用的方法,具体如下:
使用的函数只有两个:
//
从结构arr中获取rect指向的内容,然后将这些内容复制到submat结构中,表达式采用链式表达,把内容复制到submat后,并返回submat的地址,使用过opencv的人都知道, CvArr不是一种具体的结构,可以使图像、矩阵等,具体图像位置有CvRect结构决定。
使用完cvGetSubRect()函数后,截取的图像就被复制到submat结构中了,下一步需要做的是从CvMat结构中转换数据到IPlImage类型。使用如下函数:
这同样是一个链式表达,arr参数就是使用cvGetSubRect()函数中的submat参数对应的参数,IplImage*参数就对应实际图像结构的指针,同样链式表达也会返回这个结构的指针。
使用如上的函数就可以完成图像的截取。
基于上述的链式表达,可以使用一条语句完成,如:
cvGetImage(cvGetSubRect(frame_copy,&test,Rect_eys),eye_img);
具体参数不做详细解释了。
这里需要注意一些常犯的错误:
1.CvMat* cvGetSubRect(const CvArr* arr, CvMat* submat, CvRect rect);
这个函数中的 submat,一定要申请相应的空间在传递参数,实际的数据会复制到相应指针指向的空间,这里我犯了错误。
2. CvMat* cvGetSubRect(const CvArr* arr, CvMat* submat, CvRect rect);
函数中的参数rect需要注意,它制定的复制数据的位置的大小,可能会发生数据越界,需要额外注意。比如实际图像是400x300,而你制定的起点是(350,250),而宽是100,高是100,这时候,矩形的另外一个顶点就是(450,350),实际图像数据结构中并没有这些空间,就造成越界,我这样的初学者就犯了这样的错误。
阅读(1667) | 评论(0) | 转发(0) |
0
上一篇:Qt中的QString与char*的转换
下一篇:opencv中图像缩放
相关热门文章
网站设计:复杂产品的响应式设...
万维网之父:警惕政府正在接管...
卢松松:38岁老男孩个人建站方...
江苏镇江自愿连鎖经营也“办理...
純繪本版《山海經》作者尹戈坐...
承接自动化测试培训、外包、实...
Solaris PowerTOP 1.0 发布
For STKMonitor
项目小体会
不用学的汉字输入法 智能H3输...
欢迎qq159135在ChinaUnix博客...
欢迎szhsfw在ChinaUnix博客安...
欢迎seowping在ChinaUnix博客...
欢迎QuickLock在ChinaUnix博客...
3. DB2 Control Center
给主人留下些什么吧!~~
评论热议
自己开始使用OPENCV对很多东西都不怎么熟悉,可以使用OPENCV既有的算法检测到眼睛,然后就差截取眼睛部分的图像了,在网络上找了很多,大概只有一种可用的方法,具体如下:
使用的函数只有两个:
//
CvMat* cvGetSubRect(const CvArr* arr, CvMat* submat, CvRect rect); /* arr Input array submat Pointer to the resultant sub-array header rect Zero-based coordinates of the rectangle of interest The function returns header, corresponding to a specified rectangle of the input array. In other words, it allows the user to treat a rectangular part of input array as a stand-alone array. ROI is taken into account by the function so the sub-array of ROI is actually extracted. */ |
typedef struct CvRect { int x; //矩形的起始点X坐标 int y; //矩形的起始点Y坐标 int width; //矩形的宽 int height; //矩形的高 } CvRect; |
IplImage* cvGetImage(const CvArr* arr, IplImage* imageHeader); /* arr Input array imageHeader Pointer to IplImage structure used as a temporary buffer */ |
使用如上的函数就可以完成图像的截取。
基于上述的链式表达,可以使用一条语句完成,如:
cvGetImage(cvGetSubRect(frame_copy,&test,Rect_eys),eye_img);
具体参数不做详细解释了。
这里需要注意一些常犯的错误:
1.CvMat* cvGetSubRect(const CvArr* arr, CvMat* submat, CvRect rect);
这个函数中的 submat,一定要申请相应的空间在传递参数,实际的数据会复制到相应指针指向的空间,这里我犯了错误。
2. CvMat* cvGetSubRect(const CvArr* arr, CvMat* submat, CvRect rect);
函数中的参数rect需要注意,它制定的复制数据的位置的大小,可能会发生数据越界,需要额外注意。比如实际图像是400x300,而你制定的起点是(350,250),而宽是100,高是100,这时候,矩形的另外一个顶点就是(450,350),实际图像数据结构中并没有这些空间,就造成越界,我这样的初学者就犯了这样的错误。
阅读(1667) | 评论(0) | 转发(0) |
0
上一篇:Qt中的QString与char*的转换
下一篇:opencv中图像缩放
相关热门文章
网站设计:复杂产品的响应式设...
万维网之父:警惕政府正在接管...
卢松松:38岁老男孩个人建站方...
江苏镇江自愿连鎖经营也“办理...
純繪本版《山海經》作者尹戈坐...
承接自动化测试培训、外包、实...
Solaris PowerTOP 1.0 发布
For STKMonitor
项目小体会
不用学的汉字输入法 智能H3输...
欢迎qq159135在ChinaUnix博客...
欢迎szhsfw在ChinaUnix博客安...
欢迎seowping在ChinaUnix博客...
欢迎QuickLock在ChinaUnix博客...
3. DB2 Control Center
给主人留下些什么吧!~~
评论热议
相关文章推荐
- opencv 截取轮廓中的图像——实现PS中的抠图功能 Opencv extract area circled by contour
- 如何用openCV将一副图像的部分区域截取重新建立图像啊????
- opencv如何截取子图像
- javacpp-opencv图像处理之1:实时视频添加文字水印并截取视频图像保存成图片,实现文字水印的字体、位置、大小、粗度、翻转、平滑等操作
- javacpp-opencv图像处理之1:实时视频添加文字水印并截取视频图像保存成图片,实现文字水印的字体、位置、大小、粗度、翻转、平滑等操作
- opencv 截取轮廓中的图像——实现PS中的抠图功能
- opencv 截取轮廓中的图像——实现PS中的抠图功能 Opencv extract area circled by contour
- OpenCV如何实现透明(alpha channel)图像的读取和写入
- opencv如何截取子图像
- 如何将unsigned char*(或BYTE*)图像数据封装成OpenCV中Mat类型
- VS2010实现opencv基于DCT的图像压缩
- Android 使用OPENCV实现图像实时对比
- OpenCV截取图像ROI,任意形状
- 示例程序047--用opencv的stitcher类实现图像拼接
- 图像处理中,SIFT,FAST,MSER,STAR等特征提取算法的比较与分析(利用openCV实现)
- opencv实现最基本的图像配准
- OpenCV之imgproc 模块. 图像处理(2)实现自己的线性滤波器 给图像添加边界 Sobel 导数 Laplace 算子 Canny 边缘检测
- 如何在opencv对图像中一个区域涂色呢?
- OpenCV实现图像上添加汉字 转
- 灰度图像的对数变换原理及OpenCV代码实现!