关闭

opencv学习笔记(十六)利用cvGetSubRect截取图像

标签: opencv
1037人阅读 评论(0) 收藏 举报
分类:

16.0cvGetSubRect()

该函数的定义是:
CvSize cvGetSubRect(//返回选择区域的尺寸
const CvArr* arr,//目标矩阵
CvArr* submat,//矩阵指针
CvRect rect//选择区域
);
其中CvRect见上一篇博客。
ps:切勿在使用submat前初始化变量,不然会造成内存溢出。
实例代码:

#include <cv.h>
#include <highgui.h>

int main() 
{ 
    IplImage *res;
    int subX = 0;
    int subY = 0;

    res = cvLoadImage("a.jpg",-1);

    subX = res->width / 2;
    subY = res->height / 2;
    CvMat *pMat = cvCreateMatHeader(subX, subY,CV_8UC3);  
    //创建一个长宽均是原图像的1/2的矩阵头
    CvRect rect = cvRect(0, 0, subX, subY);  
    //要截取的区域与创建的矩阵大小一样
    cvGetSubRect(res, pMat, rect);  
    //res为指向图像的指针,pMat指向存储所截图像的矩阵,返回值和pMat相等
    IplImage *pSubImg = cvCreateImageHeader(cvSize(subX, subY), 8, 1); 
    //创建一个长宽均是原图像的1/2的图像头 
    cvGetImage(pMat, pSubImg); 
    //pMat为存储数据的矩阵,pSubImg指向图像,返回值与pSubImg相等
    cvShowImage("所截图像",pSubImg);
    cvShowImage("原图像", res);
    cvWaitKey(0);
    return 0;
}

16.1 cvGetImage

定义:
IplImage* cvGetImage( const CvArr* arr, IplImage* image_header )
作用:
可以把刚才存入矩阵的数据转存为图像。把CvMat *传给arr;image_header只需为图像头就行,不用分配数据存储空间 ;返回所存图像的指针。

16.2 cvCreateMatHeader()

定义:
CvMat* cvCreateMatHeader( int rows, int cols, int type );
rows
矩阵行数。
cols
矩阵列数。
type
矩阵元素类型。
通常以 CV_<比特数>(S|U|F)C<通道数>型式描述, 例如:
CV_8UC1 意思是一个8-bit 无符号单通道矩阵, CV_32SC2 意思是一个32-bit 有符号二个通道的矩阵。
作用:
创建CvMat结构,不为数据分配内存。

程序理解

IplImage *pSubImg = cvCreateImageHeader(cvSize(subX, subY), 8, 1);
其中的cvCreateImageHeader是创建一个图像头,不为数据分配内存。
CvMat *pMat = cvCreateMatHeader(subX, subY,CV_8UC3);
是创建一个矩阵头。

然后发现一个事儿,创建图像头和矩阵头时,不需要和Load的图像的通道数和位数以及大小一致,而且,图像头和矩阵头的大小以及通道数和位数都不需要一致。但是最后显示的图像大小就是我们所截取的图像。
个人感觉可能是因为创建的都是“头”,不需要为分配空间存储数据,所以这些都无所谓了。
然后我把
cvCreateMatHeader改成了cvCreateMat
cvCreateImageHeader改成了cvCreateImage
上述结果一样成立。
——呵呵。
别管为什么了。

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:20717次
    • 积分:673
    • 等级:
    • 排名:千里之外
    • 原创:49篇
    • 转载:0篇
    • 译文:0篇
    • 评论:2条
    文章分类