增城市网站建设,php网站开发项目,做内部优惠券网站赚钱吗,甘肃一建考试最新消息实验基础本次实验通过一个简短的例子#xff0c;主要来说明下面4个问题#xff1a; 1. 坐标体系中的零点坐标为图片的左上角#xff0c;X轴为图像矩形的上面那条水平线#xff1b;Y轴为图像矩形左边的那条垂直线。该坐标体系在诸如结构体Mat,Rect,Point中都是适用的。…实验基础本次实验通过一个简短的例子主要来说明下面4个问题 1. 坐标体系中的零点坐标为图片的左上角X轴为图像矩形的上面那条水平线Y轴为图像矩形左边的那条垂直线。该坐标体系在诸如结构体Mat,Rect,Point中都是适用的。OpenCV中有些数据结构的坐标原点是在图片的左下角可以设置的。 2. 在使用image.atTP(x1, x2)来访问图像中点的值的时候x1并不是图片中对应点的x轴坐标而是图片中对应点的y坐标。因此其访问的结果其实是访问image图像中的Point(x2, x1)点即与image.atTP(Point(x2, x1))效果相同。 3. 如果所画图像是多通道的比如说image图像的通道数时n则使用Mat::at(x, y)时其x的范围依旧是0到image的height而y的取值范围则是0到image的width乘以n因为这个时候是有n个通道所以每个像素需要占有n列。但是如果在同样的情况下使用Mat::at(point)来访问的话则这时候可以不用考虑通道的个数因为你要赋值给获取Mat::at(point)的值时都不是一个数字而是一个对应的n维向量。 4. 多通道图像在使用minMaxLoc()函数是不能给出其最大最小值坐标的因为每个像素点其实有多个坐标所以是不会给出的。因此在编程时这2个位置应该给NULL。 实验代码及注释 main.cpp:
#include iostream
#include opencv2/core/core.hpp
#include opencv2/highgui/highgui.hppusing namespace std;
using namespace cv;int main()
{Mat image, image_3c;image.create(Size(256, 256), CV_8UC1);image_3c.create(Size(256, 256), CV_8UC3); //3通道的图像image.setTo(0);image_3c.setTo(0);image.atuchar(10, 200) 255; //使用at函数的地方用的是10,200Point point(20, 100);image.atuchar(point) 250;//使用at函数的地方用的是Point(10,200)image_3c.atuchar(10, 300) 255;image_3c.atuchar(10, 302) 254;Point point_3c(20, 200);image_3c.atuchar(point_3c) 250;double maxVal 0; //最大值一定要赋初值否则运行时会报错Point maxLoc;minMaxLoc(image, NULL, maxVal, NULL, maxLoc);cout 单通道图像最大值 maxVal endl;double min_3c, max_3c;//注意多通道在使用minMaxLoc()函数是不能给出其最大最小值坐标的因为每个像素点其实有多个坐标所以是不会给出的minMaxLoc(image_3c, min_3c, max_3c, NULL, NULL);cout 3通道图像最大值: max_3c endl;imshow(image, image);imshow(image_3c, image_3c);waitKey(0);return 0;
} 实验结果 单通道图像的输出结果如下所示 由上图可以看出黑色的图像中有2个白色的点(读者可以仔细看下由于只有1个像素点所以需要自己找下呵呵)的位置是不同的因此可以证明Mat::at(x,y)和Mat::at(Point(x, y))是有区别的。 3通道图像的输出结果如下所示 由上图可以看出3通道的图像也是有2个点的但是程序中在使用Mat::at(x, y)其y的值为300和302这已经超出了图像的宽度256。这同时证明了实验基础中的第3点。 后台输出结果如下 实验总结由此可见平时一定要注意一些细节上的东西。 顶0