openCV-基础

来源:互联网 发布:centos 6 ssh拒绝访问 编辑:程序博客网 时间:2024/05/25 21:32
#include<opencv2/core/core.hpp>#include<opencv2/imgproc/imgproc.hpp>#include<opencv2/highgui/highgui.hpp>#include<iostream>int main(){//******1.显示图片******///*cv::Mat srcImage = cv::imread("Z:\\openCV_test\\I1.jpg");if (!srcImage.data)return 1;cv::imshow("scrImage", srcImage);*///******2.创建图像(矩阵)******///*cv::Mat image1;cv::Mat image2(6, 6, CV_8UC1);//创建一个大小为7*7类型为8位3通道矩阵cv::Mat image3(7, 7, CV_8UC3);//创建一个大小为8*8类型为8位2通道矩阵cv::Mat image4(cv::Size(8,8), CV_32FC2,cv::Scalar(1,3));//创建一个8*8用1、2、3填充的3通道矩阵cv::Mat image5(cv::Size(9, 9), CV_8UC3, cv::Scalar(1, 2,3));//将image2赋值给image6,共用数据对象cv::Mat image6(image2);std::cout << image1 << std::endl;std::cout << image2 << std::endl;std::cout << image3 << std::endl;std::cout << image4 << std::endl;std::cout << image5 << std::endl;std::cout << image6 << std::endl;*///******3.Mat类常用函数******///*cv::Mat Image1(10, 8, CV_8UC1, cv::Scalar(5));//获取矩阵行列数std::cout << "Image row:" << Image1.rows << std::endl;std::cout << "Image col:" << Image1.cols << std::endl;//获取指定行列元素std::cout << Image1.rowRange(1,3) << std::endl;//左开右闭,即获取第2行到第3行的数据std::cout << Image1.colRange(2,4) << std::endl;//同上std::cout << Image1.col(4) << std::endl;//创建2通道矩阵cv::Mat Image2(8, 8, CV_32FC2,cv::Scalar(1, 5));//利用create方法重新创建10*10的8位无符号3通道矩阵Image2.create(10, 10, CV_8UC3);std::cout << "Image2 channels:" << Image2.channels() << std::endl;//转换数据类型Image2.convertTo(Image2, CV_32F);std::cout << "Image2 depth:" << Image2.depth() << std::endl;//zeros创建cv::Mat Image3 = cv::Mat::zeros(Image2.rows, Image2.cols, CV_8UC1);//srcImage1的第4行元素变换成srcImage1的第5行元素乘2Image1.row(4) = Image1.row(5) * 2;std::cout << Image1 << std::endl;//将srcImage4矩阵赋值为srcImage1的第4列cv::Mat Image4 = Image1.col(4);std::cout << Image4 << std::endl;//将srcImage1矩阵的第一列复制到srcImage4中Image1.col(1).copyTo(Image4);std::cout << Image4 << std::endl;*///******4.图像读取显示保存操作******///*cv::Mat srcImage = cv::imread("Z:\\openCV_test\\I1.jpg");if (srcImage.empty())return -1;//转为灰度图像cv::Mat srcGray;cv::cvtColor(srcImage, srcGray, CV_RGB2GRAY);cv::imshow("srcGray", srcGray);//均值平滑cv::Mat blurDstImage;blur(srcGray, blurDstImage, cv::Size(5, 5), cv::Point(-1, -1));cv::imshow("blurDstImage", blurDstImage);//写入图像文件cv::imwrite("blurDstImage.png", blurDstImage);*///******5.图像几何变换-重映射******//
//功能作用:不修改像素值,而是把每个像素的位置重新映射到新的位置/*cv::Mat srcImage = cv::imread("Z:\\openCV_test\\I1.jpg");if (!srcImage.data)  //srcImage.data是指向图像矩阵(data)第一个数据的地址,若读取文件失败,函数会返回一个空矩阵,那么srcImage.data的值是NULL.return -1;//定义输出矩阵,大小、类型同源矩阵cv::Mat resultImage(srcImage.size(), srcImage.type());//定义沿x和y方向作对称变换的变换矩阵cv::Mat xMapImage(srcImage.size(), CV_32FC1);cv::Mat yMapImage(srcImage.size(), CV_32FC1);//取图像的宽和高int rows = srcImage.rows;int cols = srcImage.cols;for (int j = 0; j < rows;j++)for (int i = 0; i < cols; i++){xMapImage.at<float>(j, i) = cols - i; //这一句执行完后实现了xMapImage中存储了原图像中像素(i,j)映射到新图像中的x坐标值//yMapImage.at<float>(j, i) = rows - j; //这一句执行完后实现了xMapImage中存储了原图像中像素(i,j)映射到新图像中的y坐标值,y方向作对称变换yMapImage.at<float>(j, i) = j; //这一句执行完后实现了xMapImage中存储了原图像中像素(i,j)映射到新图像中的y坐标值,y方向不作变换}//重映射remap(srcImage, resultImage, xMapImage, yMapImage, CV_INTER_LINEAR, cv::BORDER_CONSTANT, cv::Scalar(0, 0, 0));//输出结果cv::imshow("srcImage", srcImage);cv::imshow("resultImage", resultImage);*///******6.Mat类的内存管理机制(create、copyTo、clone、covertTo)******////cv::Mat有两个组成部分:一个头部和一个数据块。头部包含了矩阵的所有相关信息(大小、通道数量、数据类型等);数据块包含了图像中所有像素的值。//头部有一个指向数据块的指针,及data属性。cv::Mat有一个很重要的属性,即在有明确要求时,内存块才会被复制,实际上,大多数操作仅仅复制了cv::Mat的头部,因此多个对象会指向同一个数据块。/*//定义图像窗口cv::namedWindow("Image1");cv::namedWindow("Image2");cv::namedWindow("Image3");cv::namedWindow("Image4");cv::namedWindow("Image5");cv::namedWindow("Image");//创建一个240*320的图像cv::Mat image1(240, 320, CV_8U, 100);cv::imshow("Image", image1);cv::waitKey(0);//重新分配一个新的对象image1.create(200, 200, CV_8U);//create方法分配或重新分配图像的数据块,如果图像已经分配,首先其原来的内容会被释放。注意:如果新的图像的大小和类型与原来的相同,就不会重新分配内存。image1 = 200;cv::imshow("Image", image1);cv::waitKey(0);//创建一个红色的图像cv::Mat image2(240, 320, CV_8UC3, cv::Scalar(0, 0, 255));//注意:通道次序为BGR//或者://cv::Mat image2(240, 320, CV_8UC3, cv::Scalar(0, 0, 255));//注意:通道次序为BGR//image2 = cv::Scalar(0, 0, 255);cv::imshow("Image", image2);cv::waitKey(0);//读入一幅图像cv::Mat image3 = cv::imread("Lisar.jpg");//下面的图像都指向同一个数据块,对其中任意一幅图像进行修改都会影响到其他图像。cv::Mat image4(image3);image1 = image3;//下面的图像都是源图像的副本图像,对其中image2、image3或image5的修改不会影响到其他图像image3.copyTo(image2);cv::Mat image5 = image3.clone();//翻转图像用来测试cv::flip(image3, image3, 1);//0垂直翻转(沿X轴翻转);>0水平翻转(沿Y轴翻转);<0水平垂直翻转(先沿X轴翻转,再沿Y轴翻转,等价于旋转180°)//检查哪些图像在处理过程中受到了影响cv::imshow("Image3", image3);cv::imshow("Image1", image1);cv::imshow("Image2", image2);cv::imshow("Image4", image4);cv::imshow("Image5", image5);cv::waitKey(0);//读入灰度图像image1 = cv::imread("Lisar.jpg", CV_LOAD_IMAGE_GRAYSCALE);image1.convertTo(image2, CV_32F,  1/255.0, 0.0);//当要转换图像的数据类型不同时,使用converTo函数;而copyTo和clone是完全复制源图像,目标图像与源图像大小、类型都相同cv::waitKey(0); *///******7.定义感兴趣区域ROI******//cv::Mat image = cv::imread("Lisar.jpg");cv::Mat logo = cv::imread("..\\logo.jpg");//在图像的右下角定义一个ROI,image为源图像cv::Mat imageROI(image, cv::Rect(image.cols - logo.cols, //ROI左上角坐标 image.rows - logo.rows,  logo.cols, logo.rows));//ROI大小//ROI还可以这样定义//cv::Mat imageROI;//imageROI = image(cv::Range(image.rows - logo.rows, image.rows), cv::Range(image.cols - logo.cols, image.cols));//插入标志logo.copyTo(imageROI);cv::imshow("ROI", image);cv::waitKey(0);return 0;}

0 0
原创粉丝点击