opencv 形状变换 图像阈值 仿射变换

来源:互联网 发布:上海萌神网络 编辑:程序博客网 时间:2024/05/16 14:07
#include "stdafx.h"#include "Opencv_ImageTransformations.h"using namespace cv;Opencv_ImageTransformations::Opencv_ImageTransformations(){}Opencv_ImageTransformations::~Opencv_ImageTransformations(){}void Opencv_ImageTransformations::Opencv_convertMaps(Mat map1, Mat map2, Mat &dstmap1, Mat &dstmap2){//  将图像从一种数据类型转换到另一种数据类型// 输入的map1的数据类型必须是:CV_16SC2, CV_32FC1, or CV_32FC2 . // 输入的map2的数据类型必须是:CV_16UC1, CV_32FC1或者是一个空矩阵. // dstmap1type 第一个输出的map的数据类型是:CV_16SC2, CV_32FC1, or CV_32FC2 convertMaps(map1, map2, dstmap1, dstmap2, CV_32FC1);}void Opencv_ImageTransformations::Opencv_getAffineTransform(Mat map1, Mat &dstmap1, bool bRotate){if (bRotate){Point2f srcTri[3];Point2f dstTri[3];srcTri[0] = Point2f(0, 0);srcTri[1] = Point2f(map1.cols - 1, 0);srcTri[2] = Point2f(0, map1.rows - 1);dstTri[0] = Point2f(map1.cols*0.0, map1.rows*0.33);dstTri[1] = Point2f(map1.cols*0.85, map1.rows*0.25);dstTri[2] = Point2f(map1.cols*0.15, map1.rows*0.7);Mat  dstmap = getAffineTransform(srcTri, dstTri);warpAffine(map1, dstmap1, dstmap, map1.size());}else{Mat  dstmap = getRotationMatrix2D(Point(map1.cols / 2, map1.rows/2), 270, 1);warpAffine(map1, dstmap1, dstmap, map1.size());}}void Opencv_ImageTransformations::Opencv_getDefaultNewCameraMatrix(){}void Opencv_ImageTransformations::Opencv_getPerspectiveTransform(Mat map1, Mat &dstmap1){Point2f srcTri[4];Point2f dstTri[4];srcTri[0] = Point2f(0, 0);srcTri[1] = Point2f(map1.cols - 1, 0);srcTri[2] = Point2f(0, map1.rows - 1);srcTri[3] = Point2f(map1.cols, map1.rows);dstTri[0] = Point2f(map1.cols, map1.rows);dstTri[1] = Point2f(0, map1.rows * 0.5);dstTri[2] = Point2f(map1.cols *0.5, 0);dstTri[3] = Point2f(0, 0);Mat  dstmap = getPerspectiveTransform(srcTri, dstTri);warpPerspective(map1, dstmap1, dstmap, map1.size());}void Opencv_ImageTransformations::Opencv_getRectSubPix(Mat map1, Mat &dstmap1){// 根据指点区域的大小和中心点裁剪一副图像,边缘是亚像素精度级的// 矩形的中心必须在图像上// 注:如果矩形边界超出了图像范围,会自动以 BorderTypes 中的类型填充边界getRectSubPix(map1, Size(map1.cols / 2, map1.rows / 2), Point2f(map1.cols / 3, map1.rows / 3), dstmap1, -1);}void Opencv_ImageTransformations::Opencv_getRotationMatrix2D(Mat map1, Mat &dstmap1){// 获取一个具有缩放和旋转的二位矩阵,用于仿射变换// center 旋转的轴心// angle 旋转的角度// scale 对旋转后的图像进行缩放的大小,1表示不进行缩放。Mat  dstmap = getRotationMatrix2D(Point(map1.cols / 2, map1.rows / 2), 270, 1);warpAffine(map1, dstmap1, dstmap, map1.size());}void Opencv_ImageTransformations::Opencv_initUndistortRectifyMap(){// 图像矫正的本质,其实就是重投影的过程,即【像素坐标→物理坐标→像素坐标】的过程//正向矫正的流程为:畸变像素坐标→畸变物理坐标→标准物理坐标→标准像素坐标//逆向矫正的流程为:标准像素坐标→标准物理坐标→畸变物理坐标→畸变像素坐标// initUndistortRectifyMap执行的是逆向矫正过程}void Opencv_ImageTransformations::Opencv_initWideAngleProjMap(){}void Opencv_ImageTransformations::Opencv_invertAffineTransform(Mat map1, Mat &dstmap1){// 获取一个具有缩放和旋转的二位矩阵,用于仿射变换// center 旋转的轴心// angle 旋转的角度// scale 对旋转后的图像进行缩放的大小,1表示不进行缩放。Mat  dstmap = getRotationMatrix2D(Point(map1.cols / 2, map1.rows / 2), 270, 1);Mat dstMap;// 对放射变换矩阵进行翻转invertAffineTransform(dstmap, dstMap);warpAffine(map1, dstmap1, dstMap, map1.size());}void Opencv_ImageTransformations::Opencv_linearPolar(Mat map1, Mat &dstmap1){// 极坐标换: 功能有点类似将一个圆周展开成直线// center 图像在直角坐标系中的圆心坐标// maxRadius 逆向变换中的最大变径// InterpolationFlags 差值类型linearPolar(map1, dstmap1, Point2f(map1.cols / 2, map1.rows / 2), map1.cols, INTER_LINEAR + WARP_FILL_OUTLIERS);}void Opencv_ImageTransformations::Opencv_logPolar(Mat map1, Mat &dstmap1){// 极坐标换: 功能有点类似将一条直线转换成圆// center 图像在直角坐标系中的圆心坐标// maxRadius 逆向变换中的最大变径// InterpolationFlags 差值类型logPolar(map1, dstmap1, Point2f(map1.cols / 2, map1.rows / 2), 50, WARP_INVERSE_MAP + INTER_LINEAR);}void Opencv_ImageTransformations::Opencv_remap(){}void Opencv_ImageTransformations::Opencv_resize(){// 改变图像的大小,没有平滑效果,与金字塔层积不一样}void Opencv_ImageTransformations::Opencv_undistort(){}void Opencv_ImageTransformations::Opencv_undistortPoints(){// 从观察点坐标计算理想的点坐标。}void Opencv_ImageTransformations::Opencv_warpAffine(){}void Opencv_ImageTransformations::Opencv_warpPerspective(){}// Miscellaneous Image Transformationsvoid Opencv_ImageTransformations::Opencv_adaptiveThreshold(Mat map1, Mat &dstmap1,const int adaptiveType, int thresholdType){// 自适应阈值// maxValue 满足非零条件的像素最大输出值// blockSize 邻域的大小,越大丢失的细节越多// C 邻域内的加权平均要减去的偏移量,C值越大,得到的图像越白adaptiveThreshold(map1, dstmap1, 255, adaptiveType, thresholdType, 9, 2);}void Opencv_ImageTransformations::Opencv_cvtColor(Mat map1, Mat &dstmap1,int colorCode){// 颜色变换// code 要转换的颜色空间类型// dstcn 转换后的图像通道数cvtColor(map1, dstmap1, colorCode, 3);}void Opencv_ImageTransformations::Opencv_distanceTransform(Mat map1, Mat &dstmap1){// 距离变换,用于查找物体的质心或者细化边缘// 以下代码是检测物体的质心Mat dst, matThresh;Mat _map1;cvtColor(map1, _map1, CV_BGR2GRAY);GaussianBlur(_map1, dst, Size(5, 5), 2);threshold(dst, matThresh, 0, 120, THRESH_BINARY);Mat imageThin(matThresh.size(), CV_32FC1);distanceTransform(matThresh, imageThin, CV_DIST_L2, 3);float maxDistance = 0.0;Point pt;for (int i = 0; i < imageThin.rows; i++){for (int j = 0; j < imageThin.cols; j++){if (imageThin.at<float>(i, j) > maxDistance){maxDistance = imageThin.at<float>(i, j);pt = Point(j, i);}}}circle(map1, pt, 100, Scalar(0,0,255));dstmap1 = map1;}void Opencv_ImageTransformations::Opencv_floodFill(Mat map1, Mat &dstmap1){// 漫水填充分割图像Mat matThresh;threshold(map1, matThresh, 50, 220, THRESH_BINARY);Rect *rect = new  Rect(matThresh.cols / 3, matThresh.rows / 3, 50, 50);floodFill(matThresh, Point(matThresh.cols / 3, matThresh.rows / 3), Scalar(0, 0, 125), rect);dstmap1 = matThresh;}void Opencv_ImageTransformations::Opencv_grabCut(Mat map1, Mat &dstmap1, Mat &dstmap2){// 图像分割,功能类似PS里的抠图功能,选定区域,将区域内的目标提取出来// mask 为rect区域分割出来的目标// itrCount 为迭代次数,次数越多耗时越久Mat mask;grabCut(map1, mask, Rect(38, 27, 420, 420), dstmap1, dstmap2, 3,GrabCutModes::GC_INIT_WITH_RECT);compare(mask, cv::GC_PR_BGD, mask, cv::CMP_EQ);imshow("Mask", mask);}void Opencv_ImageTransformations::Opencv_integral(Mat map1, Mat &dstmap1, Mat &dstmap2, Mat &dstmap3){// 对图像进行积分运算// sum 原图的和的积分图像// sqsum 原图的平方和的积分图像// tilted 原图旋转45度后的和的积分图像// 注:得到的结果图像常常用于快速计算原图某个区域内的像素值的和,平方和,旋转45度后的图像的和// 以下程序需要完善dstmap1 = Mat(map1.rows, map1.cols, CV_32FC1);integral(map1, dstmap1, dstmap2, dstmap3, CV_32FC1);}void Opencv_ImageTransformations::Opencv_threshold(Mat map1, Mat &dstmap1){// 对图像进行阈值二值化分割// thresh 要分割的阈值大小// maxval 二值化的最大值,如果该值设置为 120,那么二值化后的最大值就是120.threshold(map1, dstmap1, 20, 255, THRESH_BINARY);}void Opencv_ImageTransformations::Opencv_watershed(Mat map1, Mat &dstmap1){// 使用分水岭算法对图像进行标记// 以下程序需要完善Mat mapdst(map1.rows, map1.cols, CV_32S);Mat mat,edge;GaussianBlur(map1, mat, Size(3, 3), 2);imshow("GaussianBlur", mat);Canny(mat, edge, 80, 150);imshow("Canny", edge);std::vector<std::vector<Point>> contours;std::vector<Vec4i> hierarchy;findContours(edge, contours, hierarchy, RETR_TREE, CHAIN_APPROX_SIMPLE, Point());dstmap1 = edge;//int index = 0;//int compCount = 0;//Mat imageContours = Mat::zeros(map1.size(), CV_8UC1);  //轮廓  //for (; index = hierarchy[index][0]; compCount++)//{//drawContours(mapdst, contours, index, Scalar::all(compCount + 1), 1, 8, hierarchy);//drawContours(imageContours, contours, index, Scalar(255), 1, 8, hierarchy);//}//imshow("Contours", imageContours);//Mat marksShows;//convertScaleAbs(mapdst, marksShows);//imshow("marksShows", imageContours);//watershed(map1, mapdst);}

原创粉丝点击