加快opencv图像Map

j8ag8udp  于 2023-04-21  发布在  其他
关注(0)|答案(1)|浏览(126)

我有一个大小为256x507的矩形输入图像,我希望将其Map到1920x1080图像,但以扇区的形式。

  • 输入的y与输出图像中的距离成比例
  • 输入的x与输出图像中中心线的Angular 成比例

我已经写了一个代码,它可以做我想要的:

cv::Mat sector_image=cv::Mat::zeros(1080, 1920, CV_8UC1);
int cx=888;
int cy=1080-949;
int rx=1687;
int ry=1080-575;
int lx=89;
int ly=1080-575;
float r= distance(cx, cy, lx,ly);
 float pi = 2 * asin(1.0);
float src_angl=130*pi/180;
//std::cout<<"angle(lx,ly,cx,cy,rx,ry);"<<angle(lx,ly,cx,cy,rx,ry)<<std::endl;
//std::cout<<"src_angl"<<src_angl<<std::endl;
for (int y = 0; y < sector_image.rows; y += 1)
{
    for (int x = 0; x < sector_image.cols; x += 1)
    {
         float dist=  distance(cx, cy, x,y);
         int px=0;int py=0;
         px=r*(x-cx)/dist + cx;
         py=r*(y-cy)/dist + cy;
         if ((px>=lx)&&(px<=rx)&&(dist<=r)&&(y>=cy)){
            float angl= angle(lx,ly,cx,cy,x,y);
            angl=angl-65*pi/180;
            //std::cout<<"angl"<<angl<<std::endl;
            int srcy = (int)((dist/r)*my_mat.rows);
            int srcx = (int)(sin(angl)/sin(65*pi/180)*128+127.5);
            if(srcx==-1){
                srcx=0;
            }
            else if(srcx==256){
                srcx=255;
            }
            if((srcx>=0)&&(srcy>=0)&&(srcx<=my_mat.cols)&&(srcy<=my_mat.rows))
           {
                sector_image.at<uchar>(y,x) = my_mat.at<uchar>(srcy,srcx);
                //std::cout<<x<<" "<<y<<" "<<angl<<std::endl;

            }

        }
    }
}

但是这个代码很慢。有没有办法使用矢量化的numpy操作来加速它?或者使用GPU会更好。

pbgvytdp

pbgvytdp1#

我在开始时生成了一次map,然后使用了cv::remap。感谢所有的评论

相关问题