国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

利用OpenCV實(shí)現(xiàn)圖像拼接

這篇具有很好參考價(jià)值的文章主要介紹了利用OpenCV實(shí)現(xiàn)圖像拼接。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

一、介紹

? ? ?圖像拼接.

二、分步實(shí)現(xiàn)

? ? ?要實(shí)現(xiàn)圖像拼接,簡(jiǎn)單來說有以下幾步:

  1. 對(duì)每幅圖進(jìn)行特征點(diǎn)提取
  2. 對(duì)對(duì)特征點(diǎn)進(jìn)行匹配
  3. 進(jìn)行圖像配準(zhǔn)
  4. 把圖像拷貝到另一幅圖像的特定位置
  5. 對(duì)重疊邊界進(jìn)行特殊處理

? ? ?PS:需要使用低版本的opencv,否則無法使用特征角點(diǎn)提取算子。

#include "highgui/highgui.hpp"    
#include "opencv2/nonfree/nonfree.hpp"    
#include "opencv2/legacy/legacy.hpp"   
#include <iostream>  

using namespace cv;
using namespace std;

typedef struct
{
    Point2f left_top;
    Point2f left_bottom;
    Point2f right_top;
    Point2f right_bottom;
}four_corners_t;

four_corners_t corners;

void CalcCorners(const Mat& H, const Mat& src)
{
    // 左上角(0, 0, 1)
    double v2[3] = { 0, 0, 1 };
    double v1[3] = { 0 };
    Mat V2 = Mat(3, 1, CV_64FC1, v2);
    Mat V1 = Mat(3, 1, CV_64FC1, v1);
    V1 = H * V2;
    corners.left_top.x = v1[0] / v1[2];
    corners.left_top.y = v1[1] / v1[2];

    // 左下角(0, src.rows, 1)
    v2[0] = 0;
    v2[1] = src.rows;
    v2[2] = 1;
    V2 = Mat(3, 1, CV_64FC1, v2);
    V1 = Mat(3, 1, CV_64FC1, v1);
    V1 = H * V2;
    corners.left_bottom.x = v1[0] / v1[2];
    corners.left_bottom.y = v1[1] / v1[2];

    // 右上角(src.cols, 0, 1)
    v2[0] = src.cols;
    v2[1] = 0;
    v2[2] = 1;
    V2 = Mat(3, 1, CV_64FC1, v2);
    V1 = Mat(3, 1, CV_64FC1, v1);
    V1 = H * V2;
    corners.right_top.x = v1[0] / v1[2];
    corners.right_top.y = v1[1] / v1[2];

    // 右下角(src.cols, src.rows, 1)
    v2[0] = src.cols;
    v2[1] = src.rows;
    v2[2] = 1;
    V2 = Mat(3, 1, CV_64FC1, v2);
    V1 = Mat(3, 1, CV_64FC1, v1);
    V1 = H * V2;
    corners.right_bottom.x = v1[0] / v1[2];
    corners.right_bottom.y = v1[1] / v1[2];
}

void OptimizeSeam(Mat& img1, Mat& trans, Mat& dst)
{
    int start = MIN(corners.left_top.x, corners.left_bottom.x);//開始位置,即重疊區(qū)域的左邊界  

    double processWidth = img1.cols - start; // 重疊區(qū)域的寬度  
    int rows = dst.rows;
    int cols = img1.cols; // 注意,是列數(shù)*通道數(shù)
    double alpha = 1; // img1中像素的權(quán)重  
    for (int i = 0; i < rows; i++)
    {
        uchar* p = img1.ptr<uchar>(i);  // 獲取第i行的首地址
        uchar* t = trans.ptr<uchar>(i);
        uchar* d = dst.ptr<uchar>(i);
        for (int j = start; j < cols; j++)
        {
            // 如果遇到圖像trans中無像素的黑點(diǎn),則完全拷貝img1中的數(shù)據(jù)
            if (t[j * 3] == 0 && t[j * 3 + 1] == 0 && t[j * 3 + 2] == 0)
            {
                alpha = 1;
            }
            else
            {
                // img1中像素的權(quán)重,與當(dāng)前處理點(diǎn)距重疊區(qū)域左邊界的距離成正比,實(shí)驗(yàn)證明,這種方法確實(shí)好  
                alpha = (processWidth - (j - start)) / processWidth;
            }
            d[j * 3] = p[j * 3] * alpha + t[j * 3] * (1 - alpha);
            d[j * 3 + 1] = p[j * 3 + 1] * alpha + t[j * 3 + 1] * (1 - alpha);
            d[j * 3 + 2] = p[j * 3 + 2] * alpha + t[j * 3 + 2] * (1 - alpha);

        }
    }
}

int main(int argc, char* argv[])
{
    Mat image01 = imread("image2.png", 1); //右圖
    Mat image02 = imread("image1.png", 1); //左圖
    imshow("p2", image01);
    imshow("p1", image02);

    // 灰度圖轉(zhuǎn)換  
    Mat image1, image2;
    cvtColor(image01, image1, CV_RGB2GRAY);
    cvtColor(image02, image2, CV_RGB2GRAY);

    // 提取特征點(diǎn)
    SurfFeatureDetector Detector(2000);
    vector<KeyPoint> keyPoint1, keyPoint2;
    Detector.detect(image1, keyPoint1);
    Detector.detect(image2, keyPoint2);

    // 特征點(diǎn)描述
    SurfDescriptorExtractor Descriptor;
    Mat imageDesc1, imageDesc2;
    Descriptor.compute(image1, keyPoint1, imageDesc1);
    Descriptor.compute(image2, keyPoint2, imageDesc2);

    FlannBasedMatcher matcher;
    vector<vector<DMatch> > matchePoints;
    vector<Mat> train_desc(1, imageDesc1);
    matcher.add(train_desc);
    matcher.train();
    matcher.knnMatch(imageDesc2, matchePoints, 2);
    cout << "total match points: " << matchePoints.size() << endl;

    // Lowe's algorithm,獲取優(yōu)秀匹配點(diǎn)
    vector<DMatch> GoodMatchePoints;
    for (int i = 0; i < matchePoints.size(); i++)
    {
        if (matchePoints[i][0].distance < 0.4 * matchePoints[i][1].distance)
        {
            GoodMatchePoints.push_back(matchePoints[i][0]);
        }
    }

    // draw match
    Mat first_match;
    drawMatches(image02, keyPoint2, image01, keyPoint1, GoodMatchePoints, first_match);
    imshow("first_match ", first_match);

    vector<Point2f> imagePoints1, imagePoints2;
    for (int i = 0; i < GoodMatchePoints.size(); i++)
    {
        imagePoints2.push_back(keyPoint2[GoodMatchePoints[i].queryIdx].pt);
        imagePoints1.push_back(keyPoint1[GoodMatchePoints[i].trainIdx].pt);
    }

    // 獲取圖像1到圖像2的投影映射矩陣 尺寸為3*3  
    Mat homo = findHomography(imagePoints1, imagePoints2, CV_RANSAC);
    cout << "變換矩陣為:\n" << homo << endl << endl; // 輸出映射矩陣      

   // 計(jì)算配準(zhǔn)圖的四個(gè)頂點(diǎn)坐標(biāo)
    CalcCorners(homo, image01);
    cout << "left_top:" << corners.left_top << endl;
    cout << "left_bottom:" << corners.left_bottom << endl;
    cout << "right_top:" << corners.right_top << endl;
    cout << "right_bottom:" << corners.right_bottom << endl;

    // 圖像配準(zhǔn)  
    Mat imageTransform1, imageTransform2;
    warpPerspective(image01, imageTransform1, homo, Size(MAX(corners.right_top.x, corners.right_bottom.x), image02.rows));
    // warpPerspective(image01, imageTransform2, adjustMat*homo, Size(image02.cols*1.3, image02.rows*1.8));
    imshow("直接經(jīng)過透視矩陣變換", imageTransform1);

    // 創(chuàng)建拼接后的圖,需提前計(jì)算圖的大小
    int dst_width = imageTransform1.cols;  // 取最右點(diǎn)的長(zhǎng)度為拼接圖的長(zhǎng)度
    int dst_height = image02.rows;
    Mat dst(dst_height, dst_width, CV_8UC3);
    dst.setTo(0);

    imageTransform1.copyTo(dst(Rect(0, 0, imageTransform1.cols, imageTransform1.rows)));
    image02.copyTo(dst(Rect(0, 0, image02.cols, image02.rows)));
    imshow("b_dst", dst);

    // 優(yōu)化拼接處
    OptimizeSeam(image02, imageTransform1, dst);
    imshow("dst", dst);

    waitKey();
    return 0;
}

?opencv 環(huán)視拼接,OpenCV,opencv,計(jì)算機(jī)視覺,人工智能?opencv 環(huán)視拼接,OpenCV,opencv,計(jì)算機(jī)視覺,人工智能

?opencv 環(huán)視拼接,OpenCV,opencv,計(jì)算機(jī)視覺,人工智能

三、利用stitch實(shí)現(xiàn)

#include "opencv2/imgcodecs.hpp"
#include "opencv2/highgui.hpp"
#include "opencv2/stitching.hpp"
#include <iostream>

using namespace std;
using namespace cv;

int main(int argc, char* argv[])
{
	Mat img1 = imread("image1.png", cv::IMREAD_COLOR);
	Mat img2 = imread("image2.png", cv::IMREAD_COLOR);

	vector<Mat> imgs;
	imgs.push_back(img1);
	imgs.push_back(img2);

	Mat pano;
	Ptr<Stitcher> stitcher = Stitcher::create(Stitcher::PANORAMA);
	Stitcher::Status status = stitcher->stitch(imgs, pano);
	if (status != Stitcher::OK)
	{
		cout << "Can't stitch images, error code = " << int(status) << endl;
		return EXIT_FAILURE;
	}

	string result_name = "result1.jpg";
	imwrite(result_name, pano);
	cout << "stitching completed successfully\n" << result_name << " saved!";
	return EXIT_SUCCESS;
}

opencv 環(huán)視拼接,OpenCV,opencv,計(jì)算機(jī)視覺,人工智能文章來源地址http://www.zghlxwxcb.cn/news/detail-689796.html

到了這里,關(guān)于利用OpenCV實(shí)現(xiàn)圖像拼接的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • Python + OpenCV一步一步地實(shí)現(xiàn)圖像拼接(原理與代碼)

    Python + OpenCV一步一步地實(shí)現(xiàn)圖像拼接(原理與代碼)

    圖像拼接可以理解為三大步: 按順序讀取多幅圖像,并保證圖像按照從左到右的順序。 發(fā)現(xiàn)這些圖像像素之間的相關(guān)性(涉及到 單應(yīng)性 )。 將這些圖像拼接成為一張全景圖像。 首先,需要了解如下幾個(gè)概念。 Python OpenCV SIFT特征提取的原理與代碼實(shí)現(xiàn)_喬卿的博客-CSDN博客

    2024年02月04日
    瀏覽(33)
  • 計(jì)算機(jī)圖形圖像技術(shù)(OpenCV核心功能、圖像變換與圖像平滑處理)

    計(jì)算機(jī)圖形圖像技術(shù)(OpenCV核心功能、圖像變換與圖像平滑處理)

    1、顯示圖像 ①功能:在指定窗口中顯示圖像。 ②參數(shù): name 為窗口的名字; image 為待顯示的圖像。 ③說明:可顯示彩色或灰度的字節(jié)圖像和浮點(diǎn)數(shù)圖像,彩色圖像數(shù)據(jù)按BGR順序存儲(chǔ)。 2、讀入圖像 ①功能:從指定文件讀入圖像。 ②參數(shù): filename 為圖像文件名,支持BMP、

    2024年02月03日
    瀏覽(32)
  • 【OpenCV】計(jì)算機(jī)視覺圖像處理基礎(chǔ)知識(shí)

    【OpenCV】計(jì)算機(jī)視覺圖像處理基礎(chǔ)知識(shí)

    目錄 前言 推薦 1、OpenCV禮帽操作和黑帽操作 2、Sobel算子理論基礎(chǔ)及實(shí)際操作 3、Scharr算子簡(jiǎn)介及相關(guān)操作 4、Sobel算子和Scharr算子的比較 5、laplacian算子簡(jiǎn)介及相關(guān)操作 6、Canny邊緣檢測(cè)的原理 6.1?去噪 6.2?梯度運(yùn)算 6.3 非極大值抑制 6.4 滯后閾值 7、Canny邊緣檢測(cè)的函數(shù)及使用

    2024年02月05日
    瀏覽(27)
  • Python+OpenCV 零基礎(chǔ)學(xué)習(xí)筆記(4-5):計(jì)算機(jī)圖形基礎(chǔ)+Python相對(duì)文件路徑+OpenCV圖像+OpenCV視頻

    Python+OpenCV 零基礎(chǔ)學(xué)習(xí)筆記(4-5):計(jì)算機(jī)圖形基礎(chǔ)+Python相對(duì)文件路徑+OpenCV圖像+OpenCV視頻

    【2022B站最好的OpenCV課程推薦】OpenCV從入門到實(shí)戰(zhàn) 全套課程 CSDN標(biāo)題里個(gè)括號(hào)對(duì)應(yīng)視頻的分P OpenCV+Python CSDN專欄 Gitee 項(xiàng)目地址 Python:3.11.5 Anaconda:23.7.4 IDE:vscode 運(yùn)行環(huán)境:Windows OpenCV:4.8.1 Python+OpenCV 零基礎(chǔ)學(xué)習(xí)筆記(1-3):anaconda+vscode+jupyter環(huán)境配置 本節(jié)課來了解以下OpenCV的簡(jiǎn)單使用

    2024年02月03日
    瀏覽(27)
  • 計(jì)算機(jī)畢業(yè)分享(含算法) opencv圖像增強(qiáng)算法系統(tǒng)

    計(jì)算機(jī)畢業(yè)分享(含算法) opencv圖像增強(qiáng)算法系統(tǒng)

    今天學(xué)長(zhǎng)向大家分享一個(gè)畢業(yè)設(shè)計(jì)項(xiàng)目 畢業(yè)設(shè)計(jì) opencv圖像增強(qiáng)算法系統(tǒng) 項(xiàng)目運(yùn)行效果: 畢業(yè)設(shè)計(jì) 基于機(jī)器視覺的圖像增強(qiáng) 項(xiàng)目獲?。?https://gitee.com/sinonfin/algorithm-sharing 直方圖均衡化是通過調(diào)整圖像的灰階分布,使得在0~255灰階上的分布更加均衡,提高了圖像的對(duì)比度,達(dá)

    2024年01月18日
    瀏覽(42)
  • 計(jì)算機(jī)視覺傳統(tǒng)圖像處理庫opencv的使用

    人工智能領(lǐng)域的圖像處理分支,整理了計(jì)算機(jī)視覺傳統(tǒng)圖像處理庫opencv的使用網(wǎng)址鏈接。 opencv使用范圍,主要用在計(jì)算機(jī)視覺、視頻分析、機(jī)器學(xué)習(xí)、醫(yī)學(xué)影像處理、自動(dòng)駕駛、工業(yè)檢測(cè)、游戲開發(fā)上。 1):opencv效果視頻 opencv10個(gè)應(yīng)用場(chǎng)景 - 知乎 2):opencv介紹 AI必備技能

    2024年02月09日
    瀏覽(27)
  • 深度學(xué)習(xí)圖像風(fēng)格遷移 - opencv python 計(jì)算機(jī)競(jìng)賽

    深度學(xué)習(xí)圖像風(fēng)格遷移 - opencv python 計(jì)算機(jī)競(jìng)賽

    ?? 優(yōu)質(zhì)競(jìng)賽項(xiàng)目系列,今天要分享的是 ?? 深度學(xué)習(xí)圖像風(fēng)格遷移 - opencv python 該項(xiàng)目較為新穎,適合作為競(jìng)賽課題方向,學(xué)長(zhǎng)非常推薦! ??學(xué)長(zhǎng)這里給一個(gè)題目綜合評(píng)分(每項(xiàng)滿分5分) 難度系數(shù):3分 工作量:3分 創(chuàng)新點(diǎn):4分 ?? 更多資料, 項(xiàng)目分享: https://gitee.com/danche

    2024年02月04日
    瀏覽(27)
  • 計(jì)算機(jī)視覺基礎(chǔ)【OpenCV輕松入門】:獲取圖像的ROI

    計(jì)算機(jī)視覺基礎(chǔ)【OpenCV輕松入門】:獲取圖像的ROI

    OpenCV的基礎(chǔ)是處理圖像,而圖像的基礎(chǔ)是矩陣。 因此,如何使用好矩陣是非常關(guān)鍵的。 下面我們通過一個(gè)具體的實(shí)例來展示如何通過Python和OpenCV對(duì)矩陣進(jìn)行操作,從而更好地實(shí)現(xiàn)對(duì)圖像的處理。 ROI(Region of Interest)是指圖像或視頻中被選取或感興趣的特定區(qū)域。ROI可以用矩

    2024年02月22日
    瀏覽(26)
  • 《OpenCV 計(jì)算機(jī)視覺編程攻略》學(xué)習(xí)筆記(一:圖像編程入門)

    《OpenCV 計(jì)算機(jī)視覺編程攻略》學(xué)習(xí)筆記(一:圖像編程入門)

    參考引用 OpenCV 計(jì)算機(jī)視覺編程攻略(第3版) 說明 本書結(jié)合 C++ 和 OpenCV 3.2 全面講解計(jì)算機(jī)視覺編程 所有代碼均在 Ubuntu 系統(tǒng)中用 g++ 編譯執(zhí)行 0. 安裝 OpenCV 庫 在Ubuntu上安裝OpenCV及使用 OpenCV 庫分為多個(gè)模塊 ,常見模塊如下 opencv_core 模塊包含庫的核心功能 opencv_imgproc 模塊包

    2024年02月09日
    瀏覽(49)
  • 計(jì)算機(jī)競(jìng)賽 opencv python 深度學(xué)習(xí)垃圾圖像分類系統(tǒng)

    計(jì)算機(jī)競(jìng)賽 opencv python 深度學(xué)習(xí)垃圾圖像分類系統(tǒng)

    ?? 優(yōu)質(zhì)競(jìng)賽項(xiàng)目系列,今天要分享的是 ?? opencv python 深度學(xué)習(xí)垃圾分類系統(tǒng) ??學(xué)長(zhǎng)這里給一個(gè)題目綜合評(píng)分(每項(xiàng)滿分5分) 難度系數(shù):3分 工作量:3分 創(chuàng)新點(diǎn):4分 這是一個(gè)較為新穎的競(jìng)賽課題方向,學(xué)長(zhǎng)非常推薦! ?? 更多資料, 項(xiàng)目分享: https://gitee.com/dancheng-senior/p

    2024年02月13日
    瀏覽(30)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包