您的位置:首页 > 运维架构

OpenCv基础学习笔记之一[core_c.h]

2014-08-06 11:35 405 查看
EX01

#include "cv.h"
#include "highgui.h"
int main()
{
IplImage    *dstImage1, *dstImage2, *dstImage3;
dstImage1 = cvCreateImage(cvSize(512, 512), IPL_DEPTH_8U, 3);
dstImage2 = cvCreateImage(cvSize(512, 512), IPL_DEPTH_8U, 3);
dstImage3 = cvCreateImage(cvSize(512, 512), IPL_DEPTH_8U, 3);
cvSet(dstImage1, cvScalar(255, 0, 0));
cvSet(dstImage2, CV_RGB(0, 0, 255));
cvSetZero( dstImage3);

cvShowImage("dstImage1", dstImage1);
cvShowImage("dstImage2", dstImage2);
cvShowImage("dstImage3", dstImage3);
cvWaitKey();
cvDestroyAllWindows();
cvReleaseImage(&dstImage1);
cvReleaseImage(&dstImage2);
cvReleaseImage(&dstImage3);
return 0;
}
结果



cvCreateImage

说明:创建首地址并分配存储空间

函数结构 IplImage* cvCreateImage( CvSize size, int depth, int channels );

size : 图像宽、高.

depth : OpenCV的图象类型

IPL_DEPTH_8U 8bit unsigned integer (0 ~ 255)
IPL_DEPTH_8S
8bit signed integer (-128 ~ 127)
 IPL_DEPTH_16U 
16bit unsigned integer 
IPL_DEPTH_16S
16bit signed integer 
IPL_DEPTH_32S 
32bit signed integer
IPL_DEPTH_32F
32bit floating - point number
IPL_DEPTH_64F
64bit floating - point number

channels: 每个元素(像素)通道号.可以是 1, 2, 3 或 4.通道是交叉存取的,例如通常的彩色图像数据排列是:b0 g0 r0 b1 g1 r1 ... 虽然通常 IPL 图象格式可以存贮非交叉存取的图像,并且一些OpenCV 也能处理他, 但是这个函数只能创建交叉存取图像. 

内联函数

CV_INLINE CvSize cvSize( int width, int height )
{
CvSize s;

s.width = width;
s.height = height;

return s;
}
CVAPI(CvSize) cvGetSize( const CvArr* arr );

IplImage    *dstImage;
dstImage = cvCreateImage(cvSize(512, 512),IPL_DEPTH_8U, 3);


cvSet 

说明:用给定值初始化数组 

函数结构 void cvSet(CvArr* arr,CvScalar value, const CvArr* mask=Null)

这些函数能将数组的所有通道的所有值设置为指定的参数value。该cvSet()函数接受一个可选的参数:如果提供参数,那么只有那些与参数mask中非0值对应的像素将被设置为指定的值。如果数组 
arr
 是 
IplImage
 类型,
那么就会使用ROI,但 COI不能设置 

cvScalar[types_c.h]里面。

IplImage    *dstImage1, *dstImage2;
dstImage1 = cvCreateImage(cvSize(512, 512), IPL_DEPTH_8U, 3);
dstImage2 = cvCreateImage(cvSize(512, 512), IPL_DEPTH_8U, 3);
cvSet(dstImage1, cvScalar(255, 0, 0));
cvSet(dstImage2, CV_RGB(0, 0, 255));
cvShowImage("dstImage1", dstImage1);
cvShowImage("dstImage2", dstImage2);
内涵函数

inline CvScalar cvScalar( double val0, double val1=0,double val2=0, double val3=0 ); 解释为cvScalar((b),(g),(r),0)

cvSet(dstImage1, cvScalar(255, 0, 0));
inline CvScalar cvRealScalar( double val0 ); :赋予1通道的值。

cvSet(dstImage1, cvRealScalar(0));


inline CvScalar cvScalarAll( double val0123 ); :所有值赋予一样的值。

cvSet(dstImage2, cvScalarAll(0));


#define CV_RGB(r,g,b); :等于cvScalar((b),(g),(r),0) 如果CV_RGB(0, 0, 255)是蓝色同样cvScalar(255, 0, 0); 也是蓝色。

cvSet(dstImage2, CV_RGB(0, 0, 255));


cvSetZero 

说明:将数组中所有元素初始化为0 

函数结构 void cvSetZero(CvArr* arr);

数cvSetZero()仅仅是cvSet(0.0)别名。cvSetZero( dstImage3);等于cvSet(CvArr*, cvScalarAll(0))或者cvSet(CvArr*,
cvScalar(0,0,0))等等。

IplImage   *dstImage3;
dstImage3 = cvCreateImage(cvSize(512, 512), IPL_DEPTH_8U, 3);
cvSetZero( dstImage3);

cvShowImage("dstImage3", dstImage3);


cvCloneImage

说明:将整个IplImage结构复制到新的IplImage中 

函数结构 IplImage* cvCloneImage( const IplImage* image );

在使用函数之前,不用开辟内存。该函数会自己开一段内存,然后复制好image里面的数据,然后把这段内存中的数据返回给你。

clone是把所有的都复制过来,也就是说不论你是否设置Roi,Coi等影响copy的参数,clone都会原封不动的克隆过来。

copy就不一样,只会复制ROI区域等。用clone复制之后,源图像在内存中消失后,复制的图像也变了,而用copy复制,源图像消失后,复制的图像不变

IplImage *srcImage;
if ((srcImage = cvLoadImage("lena.jpg")) == NULL)
return -1;

IplImage *dstImage1;
dstImage1 = cvCloneImage(srcImage);

cvCopy
说明: 把数组中的值复制到另一个数组中 

函数结构  void cvCopy( const CvArr* src, CvArr* dst, const CvArr* mask=NULL );

src : 输入数组。Dst : 输出数组。 

mask :操作掩码是8比特单通道的数组,它指定了输出数组中被改变的元素。 

clone是把所有的都复制过来,也就是说不论你是否设置Roi,Coi等影响copy的参数,clone都会原封不动的克隆过来。

copy就不一样,只会复制ROI区域等。用clone复制之后,源图像在内存中消失后,复制的图像也变了,而用copy复制,源图像消失后,复制的图像不变 

cvCopy(srcImage, dstImage2);


cvSetReal*D

说明:

函数结构 CVAPI(void) cvSetReal1D( CvArr* arr, int idx0,
4000
double value );

函数结构 CVAPI(void) cvSetReal2D( CvArr* arr, int idx0, int idx1, double value );

函数结构 CVAPI(void) cvSetReal3D( CvArr* arr, int idx0, int idx1, int idx2, double value );

函数结构 CVAPI(void) cvSetRealND( CvArr* arr, const int* idx, double value );
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: