日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

透视变换 c++实现

發布時間:2024/1/1 c/c++ 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 透视变换 c++实现 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一. 場景說明

已知某個物體的四個角點(比如:車牌、表格等)坐標和對應的圖片,如何通過透視變換獲得矯正的圖片。
原理解析:

  • 對四個點進行排序(四個點可能是亂序的);
  • 獲得透視變換矩陣;
  • 獲得矯正的圖片;
  • 二. 代碼實現

    #include <iostream> #include <string> #include "opencv2/core.hpp" #include "opencv2/imgproc.hpp" #include "opencv2/highgui.hpp"int sort_points(cv::Point2f points[]) {cv::Point2f tempPoint;// 按照x軸坐標從小到大排序for(int i=0; i<3; i++){for(int j=i+1; j<4; j++){if(points[i].x > points[j].x){tempPoint = points[i];points[i] = points[j];points[j] = tempPoint;}}}// 按照縱坐標排序,坐標順序為:0左下角 1左上角 2右上角 3右下角if(points[0].y < points[1].y){tempPoint = points[0];points[0] = points[1];points[1] = tempPoint;}if(points[2].y > points[3].y){tempPoint = points[2];points[2] = points[3];points[3] = tempPoint;}return 0; }cv::Mat warp_img(cv::Point2f points[], const cv::Mat image) {cv::Point2f pts_src[4] = {points[0], points[1], points[2], points[3]};int img_crop_height = int(sqrt(pow(pts_src[0].x - pts_src[1].x, 2) +pow(pts_src[0].y - pts_src[1].y, 2)));int img_crop_width = int(sqrt(pow(pts_src[1].x - pts_src[2].x, 2) +pow(pts_src[1].y - pts_src[2].y, 2)));cv::Point2f pts_dst[4];pts_dst[0] = cv::Point2f(0, img_crop_height - 1);pts_dst[1] = cv::Point2f(0, 0);pts_dst[2] = cv::Point2f(img_crop_width - 1, 0);pts_dst[3] = cv::Point2f(img_crop_width - 1, img_crop_height - 1);cv::Mat M = cv::getPerspectiveTransform(pts_src, pts_dst);cv::Mat crop_image;cv::warpPerspective(image, crop_image, M,cv::Size(img_crop_width, img_crop_height),cv::BORDER_REPLICATE);return crop_image; }int main() {std::string img_path = "../test.jpg";cv::Mat image = cv::imread(img_path);cv::Mat image2 = image.clone();cv::Point2f points[4];points[0] = cv::Point2f(464, 2862);points[1] = cv::Point2f(2697, 2925);points[2] = cv::Point2f(2706, 3566);points[3] = cv::Point2f(431, 3487);sort_points(points);for(int i=0; i<4; i++){cv::circle(image, points[i], 20, cv::Scalar(0,0,255), cv::FILLED, 0);std::cout << "points:" << points[i] << std::endl;}cv::imwrite("../result.jpg", image);cv::Mat crop_img = warp_img(points, image2);cv::imwrite("../crop_img.jpg", crop_img);return 0; }

    三. 效果展示

    原圖:

    坐標顯示:

    透視變換后的圖:

    歡迎技術交流:

    總結

    以上是生活随笔為你收集整理的透视变换 c++实现的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。