我不太熟悉Java API,这段代码是用C++开发的。
逻辑应该是相同的,使用转置+翻转来旋转图像,角度为90n(n属于N=-int的最小值,......,-3,-2,-1,0,1,2,3,......,int的最大值)。
void rotate_image_90n(cv::Mat &src, cv::Mat &dst, int angle)
{
if(src.data != dst.data){
src.copyTo(dst);
}
angle = ((angle / 90) % 4) * 90;
bool const flip_horizontal_or_vertical = angle > 0 ? 1 : 0;
int const number = std::abs(angle / 90);
for(int i = 0; i != number; ++i){
cv::transpose(dst, dst);
cv::flip(dst, dst, flip_horizontal_or_vertical);
}
}
修改:改进性能,感谢TimZaman的评论和1''的实现。
void rotate_90n(cv::Mat const &src, cv::Mat &dst, int angle)
{
CV_Assert(angle % 90 == 0 && angle <= 360 && angle >= -360);
if(angle == 270 || angle == -90){
cv::transpose(src, dst);
cv::flip(dst, dst, 0);
}else if(angle == 180 || angle == -180){
cv::flip(src, dst, -1);
}else if(angle == 90 || angle == -270){
cv::transpose(src, dst);
cv::flip(dst, dst, 1);
}else if(angle == 360 || angle == 0 || angle == -360){
if(src.data != dst.data){
src.copyTo(dst);
}
}
}
Core.rotate(mRgba, mRgba, Core.ROTATE_180);
和Core.flip(mRgba, mRgba, -1);
在我的小米红米4 Prime上都需要大约12-14毫秒的CPU时间。性能非常差。我想反转相机字节帧,但这太耗费资源了。 - user924