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

OPencv图像处理基本操作

2014-12-26 16:58 477 查看
1. 矩阵数据类型

通用矩阵数据类型:

CV_<bit_depth>(S|U|F)C<number_of_channels>

其中,S表示带符号整数;

U表示无符号整数;

F表示浮点数;

例如:CV_8UC1 表示8位无符号单通道矩阵;

   CV_32FC2 表示32位浮点数双通道矩阵;

2. 图像数据类型

通用图像数据类型为:

   IPL_DEPTH_<bit_depth>(S|U|F)

如:IPL_DEPTH_8U 表示8位无符号整数图像;

  IPL_DEPTH_32F 表示32位浮点数图像;

3. 分配和释放图像

3.1 分配一幅图像


  IpIImage * cvCreateImage(cvSize size, int depth, int channels);

其中size可以用cvSize(width, height)得到。

depth为像素的单位,包括:

IPL_DEPTH_8U

IPL_DEPTH_8S

IPL_DEPTH_16U

IPL_DEPTH_16S

IPL_DEPTH_32S

IPL_DEPTH_32F

IPL_DEPTH_64F

channels为每个像素的通道数,可以是1,2,3或4。通道是交叉排列的,一幅彩色

图像的通常的排列顺序是:

b0 g0 r0 b1 g1 r1 ...

例如:分配一个单通道单字节图像的语句是:

IpIImage* img1 = cvCreateImage(cvSize(640, 480), IPL_DEPTH_8U, 1);

分配一个三通道浮点数图像语句是:

IpIImage* img2 = cvCreateImage(cvSize(640, 480), IPL_DEPTH_32F, 3);

3.2 释放图像

void cvReleaseImage(IpIImage **);

3.3 复制一幅图像

IpIImage* cvCloneImage(IpIImage *);

如:

IpIImage* img1 = cvCreateImage(cvSize(640, 480), IPL_DEPTH_8U, 1);

IpIImage* img2;

img2 = cvCloneImage(img1);

3.4 设置或得到感兴趣区域ROI

void cvSetImageROI(IpIImage* image, cvRect rect);

void cvResetImageROI(IpIImage* image);

vRect cvGetImageROI(const IpIImage* image);

4. 图像的读写

4.1 从文件中获取图像

从文件中读取图像可以采用下面的语句:

IpIImage* img = 0;

img = cvLoadImage(filename);

if (!img)

printf("Could not load image file: %s\n", filename);

默认为读取三通道图像。如果改变设置则采用如下的方式:

img = cvLoadImage(filename, flag);

当flag > 0时,表示载入图像为3通道彩色图像;

当flag = 0时,表示载入图像为单通道灰色图像;

当flag < 0时,表示载入图像由文件中的图像通道数决定。

5. 图像转换

5.1 将灰度图像转换为彩色图像


cvConvertImage(src, dst, flags = 0);

其中,src表示浮点(单字节)灰度(彩色)图像;

dst表示单字节灰度(彩色)图像;

flags表示

+--- CV_CVTIMG_FLIP, 垂直翻转

flags = |

+--- CV_CVTIMG_SWAP_RB, 交换R和B通道

5.2 将彩色图像转换为灰度图像

cvCvtColor(cimg, gimg, CV_RGB2GRAY);

5.3 彩色空间的转换

cvCvtColor(src, dst, code);

其中code为:CV_<X>2<Y>,而<X>,<Y> = RGB, BGR, GRAY, HSV, YCrCb, XYZ, Lab, Luv, HLS。

6. 绘制命令

绘图语句为:

cvRectangle, cvCircle, cvLine, cvPolyLine, cvFillPoly, cvInitFont, cvPutText。

//灰度化

IplImage *img_color = [self CreateIplImageFromUIImage:imageView.image];

IplImage *img = cvCreateImage(cvGetSize(img_color), IPL_DEPTH_8U, 1);

cvCvtColor(img_color, img, CV_BGR2GRAY);

cvReleaseImage(&img_color);

/* //二值化

IplImage *img2 = cvCreateImage(cvGetSize(img), IPL_DEPTH_8U, 1);

cvThreshold(img,img2,10.0,255,CV_THRESH_OTSU);

//cvThreshold(img,img2,128.0,255,CV_THRESH_OTSU);

cvReleaseImage(&img);*/

// Detect edge

IplImage *img2 = cvCreateImage(cvGetSize(img), IPL_DEPTH_8U, 1);

cvCanny(img, img2, 64, 128, 3);

cvReleaseImage(&img);

/*// Scaling down 放大图片

IplImage *img2 = cvCreateImage(cvSize(img_color->width/2,img_color->height/2), IPL_DEPTH_8U, 3);

cvPyrDown(img_color, img2, CV_GAUSSIAN_5x5);

cvReleaseImage(&img_color);*/

/*//高斯

IplImage *img2 = cvCreateImage(cvGetSize(img5),IPL_DEPTH_8U, 1);

cvSmooth(img5, img2,CV_GAUSSIAN,3,0,0,0);

cvReleaseImage(&img5);*/

// Convert black and whilte to 24bit image then convert to UIImage to show

IplImage *image = cvCreateImage(cvGetSize(img2), IPL_DEPTH_8U, 3);

for(int y=0; y<img2->height; y++) {

for(int x=0; x<img2->width; x++) {

char *p = image->imageData + y * image->widthStep + x * 3;

*p = *(p+1) = *(p+2) = img2->imageData[y * img2->widthStep + x];

}

}

cvReleaseImage(&img2);

图像的剪切有多种方法,其中一种是使用ROI的方法

第一步:将需要剪切的图像图像不部分设置为ROI

cvSetImageROI(src , cvRect(x,y,width,height));

第二步:新建一个与需要剪切的图像部分同样大小的新图像

cvCreateImage(cvSize(width,height),IPL_DEPTH,nchannels);

第三步:将源图像复制到新建的图像中

cvCopy(src,dst,0);

第四步:释放ROI区域

cvResetIamgeROI(src);

IplImage *img_color11 = [self CreateIplImageFromUIImage:imageView.image];

cvSetImageROI(img_color11 , cvRect(_nOrignX,_nOrignY,_nWidth,_nHeight));

IplImage *image4 = cvCreateImage(cvSize(_nWidth,_nHeight), IPL_DEPTH_8U, 3);

cvCopy(img_color11, image4, 0);

imageView.image = [self UIImageFromIplImage:image4];

cvReleaseImage(&img_color11);
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: