欢迎访问 生活随笔!

生活随笔

当前位置: 首页 > 编程资源 > 编程问答 >内容正文

编程问答

OpenCV:OpenCV图像旋转的代码

发布时间:2023/12/31 编程问答 47 豆豆
生活随笔 收集整理的这篇文章主要介绍了 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。怎么改进?




创作挑战赛新人创作奖励来咯,坚持创作打卡瓜分现金大奖

总结

以上是生活随笔为你收集整理的OpenCV:OpenCV图像旋转的代码的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。