OpenCV flip transpose 實現圖像旋轉90°、180°、270°

在做圖像處理時,需用做圖像旋轉 90°、180°、270° 的操作,OpenCV 中可通過 cv::flip 和 cv::transpose 來配合實現(注意:這倆函數只能實現 90°、180°、270° 的旋轉,無法實現任意角度,任意角度可使用 warpAffine);

flip 函數原型:

/**
 *  實現圖像的翻轉
 * @param src 輸入的源圖像
 * @param dst 輸出的目標圖像
 * @param flipCode 翻轉碼,
 *          0 : 表示沿 X 軸翻轉
 *        > 0 : 如 1,表示沿 Y 軸翻轉,
 *        < 0 : 如 -1,表示既沿 X 軸翻轉,又沿 Y 軸翻轉,等價於旋轉180°
 * @return
 */
void flip(InputArray src, OutputArray dst, int flipCode);

transpose 函數原型:

/**
 * 轉置,相當於沿對角線翻轉
 * @param src 輸入的源圖像
 * @param dst 輸出的目標圖像
 * @return 
 */
void transpose(InputArray src, OutputArray dst);

90°、180°、270° 旋轉的實現:

/**
 * degree 只能是 90°、180°、270° 
 * 該角度爲順時針方向,如果想逆時針旋轉,將下面的 90° 和 270° 的實現交換即可
 * @param src_img
 * @param degree
 * @return
 */
cv::Mat rotateImage(cv::Mat& src_img, int degree) {
    if (degree == 90) {
        cv::Mat srcCopy = cv::Mat(src_img.rows, src_img.cols, src_img.depth());
        cv::transpose(src_img, srcCopy);
        cv::flip(srcCopy, srcCopy, 1);
        return srcCopy;
    } else if (degree == 180) {
        cv::Mat srcCopy = cv::Mat(src_img.rows, src_img.cols, src_img.depth());
        cv::flip(src_img, srcCopy, -1);
        return srcCopy;
    } else if (degree == 270) {
        cv::Mat srcCopy = cv::Mat(src_img.rows, src_img.cols, src_img.depth());
        cv::transpose(src_img, srcCopy);
        cv::flip(srcCopy, srcCopy, 0);
        return srcCopy;
    } else {
        return src_img;
    }
}

測試代碼:

void testRotateByOpenCVFlip() {
    std::string pic_path = "./1.jpg";
    cv::Mat image = cv::imread(pic_path.c_str(), cv::IMREAD_COLOR);
    cv::imshow("src_img", image);

    cv::Mat rotateImg = rotateImage(image, 90);

    cv::imshow("dst_img", rotateImg);
    cv::waitKey(0);

    cv::destroyAllWindows();
}

分別旋轉90°、180°、270° 效果如下:
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章