• OpenCV:OpenCV图像旋转的代码


    OpenCV图像旋转的代码

    cv::transpose( bfM, bfM )
    前提:使用两个矩阵Mat型进行下标操作是不行的,耗费的时间太长了。直接使用两个指针对拷贝才是王道。不知道和OpenCV比较效果如何。


    贴出下面的代码:  C++    

        //图像旋转
        cv::Mat Transpose(cv::Mat &inMat)  
        {
            cv::Mat outMat( inMat.cols, inMat.rows, inMat.type() );
            const int L = inMat.cols;
            std::vector<unsigned char*>  headers(L);
    
            for ( int x=0; x< inMat.cols; ++x )
            {
                //
                unsigned char* ptrB = ( unsigned char* )(outMat.data + x * outMat.step) ;
                headers[x] = ptrB;
            }
    
    
            for ( int y=0 ;y < inMat.rows; ++y )
            {
                unsigned char* ptrA = ( unsigned char* )( inMat.data + y * inMat.step );
                for ( int x=0; x< inMat.cols; ++x )
                {
                    *headers[x]= *ptrA;
    
                    ++(headers[x]);
                    ++ptrA;
                }
            }
    
            return outMat;
        }//cv::Mat  Transpose(cv::Mat &inMat)  
    


    效果图:

           原始图像:爱德华.蒙克的《星夜》(Edvard Munch  《Starry Night 》. 1893. 135.6 × 140 cm.J. Paul Getty Museum.)

          


    测试结果1:

           很遗憾,图像336*400,速度是为使用OpenCV库的1/20,3.167s。怎么改进?0.166s。


    改进一下:

    	void cvWish::transpose( unsigned char* data, size_t step, int col )
    	{
    		int i, j;
    		for( i = 0; i < col; i++ )
    		{
    			unsigned char* row   = (unsigned char*)(data + step*i);
    			unsigned char* dataR = data + i*sizeof(unsigned char);
    			for( j = i+1; j < col; j++ )
    				std::swap( row[j], *( unsigned char* )( dataR + step*j ) );
    		}
    	}
    
        int Transpose( cv::Mat &inMat, cv::Mat &outMat )  
        {
            outMat = inMat.clone();
            size_t step = inMat.step;
            int col  = inMat.cols;
            cvWish::transpose( outMat.data,step, col );
    
            return 1;
        }
    

    测试结果2:

           很遗憾,图像336*400,速度依然是为使用OpenCV库的1/6, 0.947s。怎么改进?




  • 相关阅读:
    vue2.0 微信分享
    小程序开发:canvas在画布上滑动,页面跟着滑动问题
    前端AES解密
    vue2上传图片到OSS
    vue给不同环境配置不同打包命令
    vue页面绑定数据,渲染页面时会出现页面闪烁
    解决微信浏览器无法使用window.location.reload刷新页面
    vue列表拖拽组件 vue-dragging
    千万别在Java类的static块里写会抛异常的代码!
    linux shell的一些配置
  • 原文地址:https://www.cnblogs.com/wishchin/p/9199979.html
Copyright © 2020-2023  润新知