cvGet2D()和cvSet2D()对像素点进行处理

来源:互联网 发布:淘宝详情页顺序 编辑:程序博客网 时间:2024/06/14 01:32

找到一篇讲解的很好地博客,网址为:OpenCV像素点处理
同时写了一点自己的理解。

获得像素点的值便可以更加灵活的进行图像处理,在OpenCV里可以通过cvGet2D()和cvSet2D()两个函数加上一个CvScalar结构体做到。
opencv中,CvScalar结构为:

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

4个double型变量,其中.val[0],.val[1],.val[2]分别表示BGR值,是我们常用的,算法处理时不至于被强制类型转换而降低精度了。

再来看读写函数的定义:

cvGet2D 获得某个像素点的值, idx0=hight,表示行值, idx1=width,表示列值。

CVAPI(CvScalar) cvGet2D( const CvArr* arr, int idx0, int idx1 );

cvSet2D 给某个像素点赋值。将value 写入到图像arr的第i行第j列的像素。下面添加两个自己写的例子

CVAPI(void) cvSet2D( CvArr* arr, int idx0, int idx1, CvScalar value );

示例:
(1)
s2 = cvGet2D(&tmp_src, i, j);//获取图像tmp_src的第i行第j列的像素值

(2)

cvSet2D(&dst_src, i, j, s3);//将s3中的像素值写入到图像dst_src中,

由上可见,cvGet2D的返回类型和cvSet2D中value的类型都是CvScalar,这样定义一个CvScalar变量再调用函数就OK了。
要注意函数的返回值。

opencv中读取每个像素点的例子:

int main(int argc, char **argv){    IplImage *img = cvLoadImage(argv[1], 1);    CvScalar pixel;    for (int i = 0; i < img->height; ++i)    {        for (int j = 0; j < img->width; ++j)        {            //获得像素的RGB值并显示, 注意内存中存储顺序是BGR            pixel = cvGet2D(img, i, j);            printf("B=%f,G=%f,R=%f/t", pixel.val[0], pixel.val[1], pixel.val[2]);            //修改各点的值            pixel.val[0] = 0;            pixel.val[1] = 0;            pixel.val[2] = 0;            cvSet2D(img, i, j, pixel);        }    }    cvNamedWindow("image", 1);    cvShowImage("image", img);    cvWaitKey(0);    cvDestroyWindow("image");    cvReleaseImage(&img);    return 0;}
原创粉丝点击