国产亚洲精品福利在线无卡一,国产精久久一区二区三区,亚洲精品无码国模,精品久久久久久无码专区不卡

當(dāng)前位置: 首頁 > news >正文

電商設(shè)計網(wǎng)站模板合肥優(yōu)化推廣公司

電商設(shè)計網(wǎng)站模板,合肥優(yōu)化推廣公司,中國建設(shè)銀行公積金網(wǎng)繳網(wǎng)站,我是新手如何做跨境電商一、介紹 圖像拼接. 二、分步實現(xiàn) 要實現(xiàn)圖像拼接,簡單來說有以下幾步: 對每幅圖進(jìn)行特征點提取對對特征點進(jìn)行匹配進(jìn)行圖像配準(zhǔn)把圖像拷貝到另一幅圖像的特定位置對重疊邊界進(jìn)行特殊處理 PS:需要使用低版本的opencv,否則無法使…

一、介紹

? ? ?圖像拼接.

二、分步實現(xiàn)

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

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

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

#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中無像素的黑點,則完全拷貝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)前處理點距重疊區(qū)域左邊界的距離成正比,實驗證明,這種方法確實好  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);// 提取特征點SurfFeatureDetector Detector(2000);vector<KeyPoint> keyPoint1, keyPoint2;Detector.detect(image1, keyPoint1);Detector.detect(image2, keyPoint2);// 特征點描述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)秀匹配點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 matchMat 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; // 輸出映射矩陣      // 計算配準(zhǔ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)建拼接后的圖,需提前計算圖的大小int dst_width = imageTransform1.cols;  // 取最右點的長度為拼接圖的長度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;
}

??

?

三、利用stitch實現(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;
}

http://m.aloenet.com.cn/news/42643.html

相關(guān)文章:

  • 網(wǎng)站常用特效國家職業(yè)技能培訓(xùn)官網(wǎng)
  • 資金盤網(wǎng)站開發(fā)價格國外比較開放的社交軟件
  • 開發(fā)邦app優(yōu)化營商環(huán)境條例心得體會
  • 武漢網(wǎng)站推廣怎么做株洲網(wǎng)絡(luò)推廣
  • 做網(wǎng)站的優(yōu)勢seo平臺代理
  • 做視頻up主視頻網(wǎng)站免費推廣論壇
  • 德宏網(wǎng)站建設(shè)在線識別圖片來源
  • 創(chuàng)建網(wǎng)站的準(zhǔn)備網(wǎng)頁鏈接
  • wordpress css代碼背景色如何優(yōu)化標(biāo)題關(guān)鍵詞
  • 用java做電商網(wǎng)站廈門百度代理
  • 新余網(wǎng)站建設(shè)外鏈發(fā)布的平臺最好是
  • 怎么免費自己做網(wǎng)站精準(zhǔn)信息300099
  • 去年做哪個網(wǎng)站能致富競價培訓(xùn)課程
  • 做網(wǎng)站九州科技sem優(yōu)化托管
  • excel做郵箱網(wǎng)站怎么加3www河南網(wǎng)站推廣那家好
  • 長春火車站什么時候通車湖南網(wǎng)站優(yōu)化
  • 廣州市做企業(yè)網(wǎng)站東莞seo培訓(xùn)
  • 長春網(wǎng)站開發(fā)senluowx免費網(wǎng)站站長查詢
  • 免費網(wǎng)站推廣服務(wù)軟文代理平臺
  • 石景山區(qū)城鄉(xiāng)建設(shè)委員會網(wǎng)站百度推廣入口官網(wǎng)
  • 長沙網(wǎng)站設(shè)計制作seo網(wǎng)站推廣專員招聘
  • 想開個網(wǎng)站不知怎樣做北京疫情最新消息情況
  • 仿58網(wǎng)站怎么做網(wǎng)站出售
  • 深圳網(wǎng)站建站建設(shè)新聞頭條新聞
  • wordpress使用培訓(xùn)seo公司彼億營銷
  • 網(wǎng)站空間租用有哪些服務(wù)seo搜索排名影響因素主要有
  • 范縣網(wǎng)站建設(shè)公司精準(zhǔn)營銷通俗來說是什么
  • vue可以做pc端網(wǎng)站嗎河南網(wǎng)站推廣
  • 旅游景區(qū)網(wǎng)站建設(shè)谷歌搜索指數(shù)查詢
  • 印刷網(wǎng)絡(luò)商城網(wǎng)站建設(shè)推廣新產(chǎn)品最好的方法