opencv三种遍历像素及两种截取图片方法

1.最简单也是最基本的for循环

for(int i=0;i<img.rows;++i)
    for(int j=0;j<img1.cols;++j)
    {
        Vec3b pelex;
        pelex[0] = 0;
        pelex[1] = 0;
        pelex[2] = 255;
        img1.at(i, j) = pelex;
    }

at()方法是用于读取或者修改像素点的方法

2.迭代器迭代法

int i=0;
MatIterator imgit,imgend;  //MatIterator是Mat类型的迭代器
//就是将高维的矩阵转换为一维矩阵,以我的理解就是一个暂存像素的容器
for(imgit=img.begin(),imgend=img.end();imgit0]=i%255;
    imgit[1]=i%255;
    imgit[2]=i%255;
}

3.指针方法遍历像素

for(int i=0;iuchar *p=img.ptr<uchar>(i); //获取第i行第一个像素的指针
    for(int j=0;j0] = (i) % 255;
        p[j][1] = (j) % 255;
        p[j][2] = (i + j) % 255;
    }

指针方法与上述的for方法区别在于不用再调用at()方法,在处理大量数据的时候速度回大大加快

//截取图像区域方法
1.Range()方法
使用Range()方法可以方便地截取图片上的某一部分
注意使用时不要超出原图片的像素范围

Mat cut=img(Range(50,100),Range(50,100));
//还有一个all()方法
Mat cut1=img(Range::all(),Range(100,200));
//这两种方式都可以从原图上截取对应的图像部分

经过代码实验,截取出来的图像也是指向原图像的内存区域
Mat cut = img1(Range(100, 200), Range::all());
for(int i=100;i<200;++i)
    for (int j = 100; j < 200; ++j)
    {
        Vec3b pilex;
        pilex[0] = 0;
        pilex[1] = 0;
        pilex[2] = 0;
        img1.at(i, j) = pilex;
    }
imshow("cut",cut);
imshow("img1", img1);

opencv三种遍历像素及两种截取图片方法_第1张图片

2.感兴趣区域Rect()
Rect()的四个参数分别是图像左上点坐标和长宽

Mat temp(img(Rect(10,10,200,200)));
//或
Mat temp1=img(Rect(10,10,100,100));

你可能感兴趣的:(opencv,计算机视觉,初学者)