专注收集记录技术开发学习笔记、技术难点、解决方案
网站信息搜索 >> 请输入关键词:
您当前的位置: 首页 > 图形/图像

5.使用OpenCv操作图像上每一个像素点

发布时间:2011-06-27 19:50:23 文章来源:www.iduyao.cn 采编人员:星星草
五.使用OpenCv操作图像上每一个像素点

        本文记录使用OpenCv操作图像上每一个像素点,用摄像头采集(拍照)或者直接加载一副图像后,树莓派系统会在内存中为这幅图像分配内存空间,通过定义的IplImage结构体指针指向这块内存空间就方便可以操控它。因为IplImage结构体中定义了很多内部变量,代表图像的属性,具体如下:


1.IplImage结构具体定义如下:
typedef struct _IplImage
{
int nSize; /* IplImage大小 */
int ID; /* 版本 (=0)*/
int nChannels; /* 大多数OPENCV函数支持1,2,3 或 4 个通道 */
int alphaChannel; /* 被OpenCV忽略 */
int depth; /* 像素的位深度,主要有以下支持格式: IPL_DEPTH_8U, IPL_DEPTH_8S, IPL_DEPTH_16U,IPL_DEPTH_16S,                                                                                 IPL_DEPTH_32S,IPL_DEPTH_32F 和IPL_DEPTH_64F */
char colorModel[4]; /* 被OpenCV忽略 */
char channelSeq[4]; /* 同上 */
int dataOrder; /* 0 - 交叉存取颜色通道, 1 - 分开的颜色通道.只有cvCreateImage可以创建交叉存取图像 */
int origin; /*图像原点位置: 0表示顶-左结构,1表示底-左结构 */
int align; /* 图像行排列方式 (4 or 8),在 OpenCV 被忽略,使用 widthStep 代替 */
int width; /* 图像宽像素数 */
int height; /* 图像高像素数*/
struct _IplROI *roi; /* 图像感兴趣区域,当该值非空时,只对该区域进行处理 */
struct _IplImage *maskROI; /* 在 OpenCV中必须为NULL */
void *imageId; /* 同上*/
struct _IplTileInfo *tileInfo; /*同上*/
int imageSize; /* 图像数据大小(在交叉存取格式下ImageSize=image->height*image->widthStep),单位字节*/
char *imageData; /* 指向排列的图像数据 */
int widthStep; /* 排列的图像行大小,以字节为单位 */
int BorderMode[4]; /* 边际结束模式, 在 OpenCV 被忽略*/
int BorderConst[4]; /* 同上 */
char *imageDataOrigin; /* 指针指向一个不同的图像数据结构(不是必须排列的),是为了纠正图像内存分配准备的 */
} IplImage;

IplImage结构体是整个OpenCV函数库的基础,在定义该结构变量时可以用函数cvCreatImage,变量定义方法如下:
IplImage* src=cvCreateImage(cvSize(400,300), IPL_DEPTH_8U,3);
上句定义了一个IplImage指针变量src,图像的大小是400×300,图像颜色深度8位,3通道图像。

2.再看一个结构体CvScalar:

CvScalar就是一个包含四个元素的结构体变量。

CvScalar定义可存放1—4个数值的数值,其结构如下。

typedef struct CvScalar
    {
         double val[4];
    }CvScalar;

================================================================

CvScalar pt;

如果使用的图像是1通道的,则pt.val[0]中存储数据

如果使用的图像是3通道的,则pt.val[0],pt.val[1],pt.val[2]中存储数据

===============================================================

使用cvGet2D 函数获得某个点的值, idx0=hight 行值, idx1=width 列值。
      CVAPI(CvScalar) cvGet2D( const CvArr* arr, int idx0, int idx1 );

   使用cvSet2D 函数给某个点赋值。
      CVAPI(void) cvSet2D( CvArr* arr, int idx0, int idx1, CvScalar value );
 -----------------------------------------------
由上可见,cvGet2D的返回类型和cvSet2D中value的类型都是CvScalar


下面是利用IplImage这个结构体内部变量的一个例子,目的:改变一个图像的中间一行为白色
#include <stdio.h>
#include <stdlib.h>
#include "opencv/cv.h"
#include "opencv/highgui.h"

int main()
{
	int i,j;
	CvScalar pixel;

	IplImage* img = cvLoadImage("test.jpg", 
		CV_LOAD_IMAGE_ANYDEPTH | CV_LOAD_IMAGE_ANYCOLOR);//我打开的图像为3通道

	for(i=0; i<img->width; i++)
	{
		pixel = cvGet2D(img, (img->height)/2, i);//中间一行
		pixel.val[0] = 255;//255是白色
		pixel.val[1] = 0;
		pixel.val[2] = 0;
		cvSet2D(img, (img->height)/2, i, pixel);//cvSet2D设置像素点
	}

	printf("Height:%d  Width:%d\n", img->height, img->width);

	cvSaveImage("tmp.jpg", img, 0);
	cvReleaseImage(&img);

	return 0;
}

运行后发现图像中间有一行变为全白色。


友情提示:
信息收集于互联网,如果您发现错误或造成侵权,请及时通知本站更正或删除,具体联系方式见页面底部联系我们,谢谢。

其他相似内容:

热门推荐: