opencv C++极坐标变换

#include<opencv2/core/core.hpp>
#include<opencv2/highgui/highgui.hpp>
#include<opencv2/imgproc/imgproc.hpp>
#include<iostream>

// center:极坐标的变换中心
// minr:变换中心的最小距离
// mintheta:最小距离
// thetaStep:角度的变换步长
// rStep:距离的变换步长
cv::Mat polar(cv::Mat I,cv::Point2f center,cv::Size size,float minr=0,float mintheta=0,float thetaStep=1.0/4,float rStep=1.0){
    cv::Mat ri=cv::Mat::zeros(cv::Size(1,size.height),CV_32FC1);
    for(int i=0;i<size.height;++i)
        ri.at<float>(i,0)=minr+i*rStep;
    cv::Mat r=cv::repeat(ri,1,size.width);
    cv::Mat thetaj=cv::Mat::zeros(cv::Size(size.width,1),CV_32FC1);
    for(int i=0;i<size.width;++i)
        thetaj.at<float>(0,i)=mintheta+i*thetaStep;
    cv::Mat theta=cv::repeat(thetaj,size.height,1);
    cv::Mat x,y;
    cv::polarToCart(r,theta,x,y,true);
    x+=center.x;
    y+=center.y;
    cv::Mat dst =125*cv::Mat::ones(size,CV_8UC1);
    for(int i=0;i<size.height;++i){
        for(int j=0;j<size.width;++j){
            float xij=x.at<float>(i,j);
            float yij=y.at<float>(i,j);
            int nearestx=int(round(xij));
            int nearesty=int(round(yij));
            if((0<=nearestx&&nearestx<I.cols)&&(0<=nearesty&&nearesty<I.rows))
                dst.at<uchar>(i,j)=I.at<uchar>(nearesty,nearestx);
        }
    }
    return dst;
}

int main(){
    cv::Mat I=cv::imread("/home/nan/图片/openimage/circleWithText.jpg",cv::IMREAD_GRAYSCALE);
    if(!I.data) return -1;
    float thetaStep=1.0/4;  // thetaStep=0.25代表整个圆环,thetaStep=0.5代表半个圆环,thetaStep=1代表1/4个圆环。
    float minr=55;
    cv::Size size (int(360/thetaStep),50);  //50:圆环文字的大致高度。
    // 圆环角度范围为(0,360),输出圆环图像的宽度为(360/thetaStep):
    cv::Mat dst=polar(I,cv::Point2f(110,109),size,minr);
    //cv::imshow("极坐标变换0:",dst);
    cv::flip(dst,dst,0);  // 0 meansflipping around the x-axis and positive value (for example, 1) means
    // flipping around y-axis. Negative value (for example, -1) means flipping around both axes.
    cv::imshow("I",I);
    cv::imshow("最近邻插值极坐标变换:",dst);

    cv::linearPolar(I,dst,cv::Point2f(110,109),100,cv::INTER_LINEAR);
    cv::imshow("线性插值极坐标变换:",dst);

    cv::logPolar(I,dst,cv::Point2f(110,109),40,cv::WARP_FILL_OUTLIERS);
    cv::imshow("对数极坐标变换:",dst);
    //cv::InterpolationFlags
    cv::waitKey(0);
    return 0;
}

原文地址:https://www.cnblogs.com/ligei/p/11529031.html

时间: 2024-10-23 02:10:03

opencv C++极坐标变换的相关文章

OpenCV仿射变换+投射变换+单应性矩阵

本来想用单应性求解小规模运动的物体的位移,但是后来发现即使是很微小的位移也会带来超级大的误差甚至错误求解,看起来这个方法各种行不通,还是要匹配知道深度了以后才能从三维仿射变换来入手了,纠结~ estimateRigidTransform():计算多个二维点对或者图像之间的最优仿射变换矩阵 (2行x3列),H可以是部分自由度,比如各向一致的切变. getAffineTransform():计算3个二维点对之间的仿射变换矩阵H(2行x3列),自由度为6. warpAffine():对输入图像进行仿射

opencv::基于距离变换与分水岭的图像分割

什么是图像分割 图像分割(Image Segmentation)是图像处理最重要的处理手段之一 图像分割的目标是将图像中像素根据一定的规则分为若干(N)个cluster集合,每个集合包含一类像素. 根据算法分为监督学习方法和无监督学习方法,图像分割的算法多数都是无监督学习方法 - KMeans 距离变换常见算法有两种 - 不断膨胀/腐蚀得到 - 基于倒角距离 分水岭变换常见的算法 - 基于浸泡理论实现 cv::distanceTransform( InputArray src, OutputAr

常用的OpenCV函数速查

常用的OpenCV函数速查 1.cvLoadImage:将图像文件加载至内存: 2.cvNamedWindow:在屏幕上创建一个窗口: 3.cvShowImage:在一个已创建好的窗口中显示图像: 4.cvWaitKey:使程序暂停,等待用户触发一个按键操作: 5.cvReleaseImage:释放图像文件所分配的内存: 6.cvDestroyWindow:销毁显示图像文件的窗口: 7.cvCreateFileCapture:通过参数设置确定要读入的AVI文件: 8.cvQueryFrame:用

基于OpenCV进行图像拼接原理解析和编码实现(提纲 代码和具体内容在课件中)

一.背景 1.1概念定义 我们这里想要实现的图像拼接,既不是如题图1和2这样的"图片艺术拼接",也不是如图3这样的"显示拼接",而是实现类似"BaiDU全景"这样的全部的或者部分的实际场景的重新回放. 对于图像拼接的流程有很多定义方式,本教程中主要介绍实现主流方法,总结梳理如下: 图像采集->投影变换->特征点匹配->拼接对准->融合->反投影 图像采集不仅仅指的是普通的图像数据的获取.为了能够拼接过程能够顺利进行.

《OpenCV:基础知识》

一.基础操作1. 数据类型 数据结构了解   图像相关:cvArr  cvMat IplImage      数据数组的维数, 与数据的通道数 见P46 (76) 2. 常见的矩阵操作熟悉   3. 数据的保存和读取 4. 图像的加载和显示 5. 视频的操作 6. 内存与序列   a. 内存存储器      CvMemStorage 双向链表  动态对象(cvSeq  cvSet)的内存      cvCreateMemStorage      cvReleaseMemStorage      

OpenCV &mdash;&mdash; 图像变换

将一副图像转变成另一种表现形式 ,比如,傅里叶变换将图像转换成频谱分量   卷积 -- 变换的基础 cvFilter2D  源图像 src 和目标图像 dst 大小应该相同 注意:卷积核的系数应该是浮点类型的,必须用 CV_32F 来初始化矩阵 cvFilter2D 函数内部处理边界 -- cvCopyMakeBorder (将特定的图像轻微变大,然后以一种方式填充图像边界)   梯度和Sobel导数 sobel 算子包含任意阶的微分以及融合偏导   大核对导数有更好的逼近,小核对噪声更加敏感

OpenCv结构和内容

OpenCv的结构和内容 OpenCv源码组成结构其中包括cv, cvauex, cxcore, highgui, ml这5个模块 CV:图像处理和视觉算法 MLL:统计分类器 HighGui:GUI,图像和视频输入输出 CVCORE:包含Opencv的一些基本结构和相关函数 CVAUEX:该模块一般用于存放即将被淘汰的算法和函数,同时也包含一些新出现的实验性的函数和算法 常用OpenCv函数 1.cvLoadImage:将图像文件加载至内存: 2.cvNamedWindow:在屏幕上创建一个窗

图像处理和图像识别中常用的OpenCV函数

1.   cvLoadImage:将图像文件加载至内存: 2.   cvNamedWindow:在屏幕上创建一个窗口: 3.   cvDestroyWindow:销毁显示图像文件的窗口: 4.   cvDestroyAllWindows:销毁显示图像文件的所有窗口: 5.   cvShowImage:在一个已创建好的窗口中显示图像: 6.   cvWaitKey:使程序暂停,等待用户触发一个按键操作: 7.   cvReleaseImage:释放图像文件所分配的内存: 8.   cvCreate

Opencv 函数

1.cvLoadImage:将图像文件加载至内存: 2.cvNamedWindow:在屏幕上创建一个窗口: 3.cvShowImage:在一个已创建好的窗口中显示图像: 4.cvWaitKey:使程序暂停,等待用户触发一个按键操作: 5.cvReleaseImage:释放图像文件所分配的内存: 6.cvDestroyWindow:销毁显示图像文件的窗口: 7.cvCreateFileCapture:通过参数设置确定要读入的AVI文件: 8.cvQueryFrame:用来将下一帧视频文件载入内存: