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

来源:互联网 发布:靠谱买小样的淘宝店 编辑:程序博客网 时间:2024/06/11 08:47

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