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