使用指针的方式遍历图像数据

来源:互联网 发布:可以写小说的软件 编辑:程序博客网 时间:2024/04/20 13:15
/***********************************************第四讲  使用指针的方式遍历图像************************************************/#include "cv.h"#include "highgui.h"#include <time.h>using namespace cv;using namespace std;/***遍历图像的每一个像素并将图像设置为白色***/void setAllWhite(Mat& image){int x, y;/*********第一种方式************///for (y = 0; y < image.rows; y++)//{//uchar* data = image.ptr<uchar>(y);//获取图像数据的指针,image有一个模板类////参数y说明,取的是图像的行指针////此时的data指向的是图像数据的第一行//for (x = 0; x < image.cols; x++)//{//data[0] = 255;//由于对于三通道图像,每个像素有三个灰度值//data[1] = 255;//因此在这里是分别对各个像素值的三通道灰度值//data[2] = 255;//分别设定为白色//data = data + 3;//完成一个像素值设定之后,要进行该行的下一个////灰度值的设定的话指针需要调到下一个像素的开始位置////此时指针需要偏置3个位置。//}//}/*********第二种方式***************///int rowLength = image.cols*image.channels();//for (y = 0; y < image.rows; y++)//{//uchar* data = image.ptr<uchar>(y);//获取图像数据的指针,image有一个模板类////参数y说明,取的是图像的行指针////此时的data指向的是图像数据的第一行//for (x = 0; x < rowLength; x++)//{//data[0] = 255;//由于对于三通道图像,每个像素有三个灰度值////data[1] = 255;//因此在这里是分别对各个像素值的三通道灰度值////data[2] = 255;//分别设定为白色//data++;//完成一个像素值设定之后,要进行该行的下一个////灰度值的设定的话指针需要调到下一个像素的开始位置////此时指针需要偏置3个位置。////*data++=255;//两种方式都可以//}//}/********第三种方式 单层循环遍历图像数据*********///注意能使用单层循环的原因,其本质还是图像数据在内存中的存储方式//一般情况,图像数据在内存中都是连续存储的,但有时候行与行之间会//有一些预留空间,这样在存储图像数据时,行与行之间的内存地址就//不是连续的(在内存是否连续存储可以用isContinuous()来判断)。单层循环效率更高//int x;int length = image.cols*image.channels()*image.rows;uchar* data = image.ptr<uchar>(0);for (x = 0; x < length; x++){data[x] = 255;}}int main(int argc, char** argv){Mat src;src = imread("G:/Learning/Machine_version/Photo/1.png");namedWindow("SRC");setAllWhite(src);imshow("SRC", src);waitKey(0);system("pause");return 0;}

0 0
原创粉丝点击