opencv_c++学习(三)

这篇具有很好参考价值的文章主要介绍了opencv_c++学习(三)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、获取图像像素指针

CV Assert(mylmage.depth() == CV 8U);
CV_Assert()函数判断图像数据的类型是否为uchar类型,不满足则抛出异常。
Mat.ptr(int i=0)获取像素矩阵的指针,索引i表示第几行,从0开始计行数。
Mat.ptr(int i=0)获取像素矩阵的指针,索引i表示第几行,从0开始计行数。
获取当前像素点P(row, col)的像素值p(row, col) =current[col]

像素范围处理
saturate_cast
saturate_cast ( -100 ),返回0
saturate_cast ( 288 ) ,返回255
saturate_cast ( 100 ) ,返回100
这个函数的功能是确保RGB值得范围在0~255之间

二、矩阵的掩膜操作

下面我们实现一个滤波器为下图的掩膜操作;
opencv_c++学习(三)

#include<opencv2/opencv.hpp>
#include<iostream>
using namespace cv;

int main12(int arge, char** argv) {
	//加载图像,使用默认加载方式
	Mat src = imread("图片1.png");
	if (src.empty())
	{
		printf("不能打开空图片");
		return -1;
	}
	//显示原始图像
	namedWindow("demo", CV_WINDOW_AUTOSIZE);
	imshow("demo", src); 

	//显示转换后的图像
	namedWindow("UOTPUT", CV_WINDOW_AUTOSIZE);
	Mat output_image;

	//开始转换,将原始图像转为灰度图
	cvtColor(src, output_image, CV_RGB2HLS);
	imshow("UOTPUT", output_image);

	//保存图片
	imwrite("./1.tif", output_image);
	waitKey(0);
	return 0;
}

int main() {

	Mat src, det;

	//读取图片
	src = imread("图片1.png");
	if (!src.data)
	{
		printf("不能打开空图片");
		return -1;
	}

	//显示图片
	namedWindow("INPUT", CV_WINDOW_AUTOSIZE);
	imshow("INPUT", src);

	//获取高度和宽度
	int cols = (src.cols - 1) * src.channels();
	int rows = src.rows;
	int offsets = src.channels();

	//定义一个与原始图像大小一致的全零矩阵
	det = Mat::zeros(src.size(), src.type());

	for (int row = 1; row < rows - 1; row++)
	{
		//获取像素的指针
		//第一行的指针
		const uchar* previous = src.ptr<uchar>(row - 1);

		//第二行的指针
		const uchar* current = src.ptr<uchar>(row);

		//第三行的指针
		const uchar* next = src.ptr<uchar>(row + 1);

		uchar* output = det.ptr<uchar>(row);
		for (int col = offsets; col < cols; col++)
		{
			output[col] = saturate_cast <uchar>(5 * current[col] - (current[col - offsets] + current[col + offsets] + previous[col] + next[col]));
		}
	}

	//显示图片
	namedWindow("OUTPUT", CV_WINDOW_AUTOSIZE);
	imshow("OUTPUT", det);

	waitKey(0);
	return 0;
}

这里好多同学有疑问,为什么列宽为int cols = (src.cols - 1) * src.channels();,这里做一个简单的解释。
在opencv的处理中,三通道的图像矩阵如下:
opencv_c++学习(三)
一个像素需要多个矩阵元素来保存,矩阵中的列会包含多个子列,且子列数和通道数相等,就如上图所示。具体来说就是图像左上角的一个像素是包含三个小子列的,而这三个小子列就是我们RGB格式图片的三通道。文章来源地址https://www.toymoban.com/news/detail-437942.html

到了这里,关于opencv_c++学习(三)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • opencv_c++学习(三)

    CV Assert(mylmage.depth() == CV 8U); CV_Assert()函数判断图像数据的类型是否为uchar类型,不满足则抛出异常。 Mat.ptr(int i=0)获取像素矩阵的指针,索引i表示第几行,从0开始计行数。 Mat.ptr(int i=0)获取像素矩阵的指针,索引i表示第几行,从0开始计行数。 获取当前像素点P(row, col)的像素值

    2024年02月03日
    浏览(32)
  • opencv_c++学习(六)

    对以上实例解释如下: 若读取的为本地视频,则filename为视频名称,若读取的是摄像头数据,则为int类型的摄像头id。 视频属性可以通过get()函数获取。 见文末案例 对以上实例进行解释: filename:保存视频的地址和文件名,包含视频格式; fourcc:压缩帧的4字符编解码器代码,

    2024年02月03日
    浏览(37)
  • opencv_c++学习(十三)

    trackbarname:滑动条的名称。 winname:创建滑动条窗口的名称。 value:指向整数变量的指针,该指针指向的值反映滑块的位置,创建后,滑块位置由此变量定义。 count:滑动条的最大取值。 onChange:每次滑块更改位置时要调用的函数的指针。该函数应该原型为void Foo (int,void *) ;,其中

    2024年02月05日
    浏览(87)
  • opencv_c++学习(三十)

    model:模型文件名称 config:配置文件名称 framework:框架种类 Net类中的函数名称以及作用: 向网络层中添加数据: blob:新的输入数据,数据类型为CV_32F或CV_8U。 name:输入网络层的名称。 scalefactor:可选的标准化比例(尺寸缩放)。 mean:可选的减数数值(平移)。 opencv调用深度学习模

    2024年02月06日
    浏览(39)
  • opencv_c++学习(二十三)

    拟合含义如上图,即为通过已知点去拟合一条直线或者一个多边形。 直线拟合函数: points:输入待拟合直线的2D或者3D点集。 line:输出描述直线的参数,2D点集描述参数为Vec4f类型,3D点集描述参数为Vec6f类型。 distType: M-estimator算法使用的距离类型标志。 param:某些类型距离的数

    2024年02月06日
    浏览(37)
  • opencv_c++学习(二十八)

    如上图所示,根据图像的情况反推相机的运动情况。 如实现上述功能则需要拍摄当前物体的图像,然后拍摄一段时间之后物体的图像,然后联合两张图像则可以获取两个时刻的相机位姿关系。 位姿估计函数: objectPoints:前一时刻世界坐标系中的3D点的三维坐标。 imagePoints: 3

    2024年02月07日
    浏览(44)
  • opencv_c++学习(二十七)

    上图为针孔相机成像原理,蓝色坐标中的O即为镜头光心。成像原理与小孔成像相同。 单目相机映射关系如下: 将上式进行变换,就可以从三位空间映射到2维平面的公式。 相机的畸变公式如下: objectPoints:世界坐标系中3D点的三维坐标。 rvec:世界坐标系变换到相机坐标系的旋

    2024年02月06日
    浏览(52)
  • opencv_c++学习(二十五)

    1、海瑞斯角点不可能出现在图像平滑的区域(上图1); 2、图像边缘的支线出不可能出现海瑞斯角点(上图2); 3、海瑞斯角点会出现在顶点处。(上图3); 上图中的下半部分红色圆圈内就是海瑞斯角点常出现的地方。 如上图第一个式子,海瑞斯角点就是将窗口移动后的数

    2024年02月07日
    浏览(38)
  • opencv_c++学习(二十二)

    图中左侧为边缘检测的效果,中间为图像经过二值化的效果,右图为凸包检测效果。 points:输入的2D点集。 hull:输出凸包的顶点。 clockwise:方向标志,当参数为true时,凸包顺序为顺时针方向,否则为逆时针方向。 returnPoints:输出数据的类型标志,当参数为true时第二个参数输出的

    2024年02月06日
    浏览(69)
  • opencv_c++学习(二十一)

    轮廓检测函数: image:输入图像,数据类型为CV_8U的单通道灰度图像或者二值化图像。contours:检测到的轮廓,每个轮廓中存放着像素的坐标。 mode:轮廓检测模式标志。 method:轮廓逼近方法标志。 offset:每个轮廓点移动的可选偏移量。这个函数主要用在从ROI图像中找出的轮廓并基于

    2024年02月06日
    浏览(44)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包