opencv c++ (3):像素操作1

1. 像素的遍历

这里提供常用的两种方法,一种是at方法,一种是ptr指针方法
具体看代码

//图像的基本操作
//1. 遍历像素
#include <iostream>
#include<opencv.hpp>
#include<opencv2\highgui\highgui.hpp>

using namespace std;
using namespace cv;

int main()
{
    
    	
	Mat src;
	src = imread("src.jpg");

    //这里要用.size(),而不是.size, .size()返回的是cv::Size,而.size返回的是MatSize
	Mat dst1 = Mat::zeros(src.size(), src.type());
	Mat dst2 = Mat::zeros(src.size(), src.type());
	
	// 1.at 遍历
	for (int i = 0; i < src.rows; i++)
	{
    
    

		for (int j = 0; j < src.cols; j++)
		{
    
    
			if (src.channels() == 1)
				dst1.at<uchar>(i, j) = 255 - src.at<uchar>(i, j);
			else if (src.channels() == 3)
			{
    
    
				dst1.at<Vec3b>(i, j)[0] = 255 - src.at<Vec3b>(i, j)[0]; //B
				dst1.at<Vec3b>(i, j)[1] = 255 - src.at<Vec3b>(i, j)[1]; //G
				dst1.at<Vec3b>(i, j)[2] = 255 - src.at<Vec3b>(i, j)[2]; //R
			}
		}
	}

	// 2. ptr指针
	for (int i = 0; i < src.rows; i++)
	{
    
    
		uchar* src_row = src.ptr<uchar>(i);
		uchar* dst2_row = dst2.ptr<uchar>(i);
		for (int j = 0; j < src.cols; j++)
		{
    
    
			if (src.channels() == 1)
				*dst2_row++ = 255 - *src_row++;
			else if (src.channels() == 3)
			{
    
    
				*dst2_row++ = 255 - *src_row++; //B
				*dst2_row++ = 255 - *src_row++; //G
				*dst2_row++ = 255 - *src_row++; //R
			}

		}
	}


	//cout << "size" << src.size << src.size();
	//cout << dst1;
	imshow("src", src);
	imshow("dst1", dst1);
	imshow("dst2", dst2);
	waitKey(0);
	destroyAllWindows();
	return 0;
}

两种得到的结果是一致的,指针方法更考验c++指针的语法,仔细感受一下,这里不在多说语法,有问题可以评论区留言。

猜你喜欢

转载自blog.csdn.net/m0_59156726/article/details/134163855
今日推荐