精品国产人成在线_亚洲高清无码在线观看_国产在线视频国产永久2021_国产AV综合第一页一个的一区免费影院黑人_最近中文字幕MV高清在线视频

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

OpenCV筑基之圖像的透視變換

OpenCV學堂 ? 來源:OpenCV學堂 ? 2024-03-15 09:51 ? 次閱讀

1. 圖像的透視變換

1.1 簡介

圖像的透視變換(Perspective Transformation)是指將圖像投影到一個新的視平面(Viewing Plane),也稱作投影映射(Projective Mapping)。

透視變換是一種非線性變換,它可以將一個二維坐標系中的點映射到三維坐標系中的點,然后再將其投影到另一個二維坐標系中的點。透視變換可以改變圖像中的形狀,并可以模擬真實世界中的透視效果。

仿射變換可以看成是透視變換的特殊情況,下圖是對幾何變換的總結。

6e3c19b2-e216-11ee-a297-92fbcf53809c.jpg

幾何變換的總結.png

透視變換的應用:

圖像矯正透視變換可以用于矯正圖像的透視失真,例如由于拍攝角度或鏡頭畸變導致的圖像傾斜或拉伸。

圖像配準透視變換可以用于將兩張或多張圖像進行配準,使其具有相同的幾何形狀。這在醫學圖像處理、衛星圖像處理等領域有著重要的應用。

3D 建模透視變換可以用于將二維圖像投影到三維空間,從而生成三維模型。

圖像增強透視變換可以用于調整圖像的視角,使其看起來更具吸引力。

圖像合成透視變換可以用于將不同的圖像合成在一起,創建新的圖像。

特效透視變換可以用于創建各種特效,例如虛擬場景、3D 動畫等。

1.2 原理

透視變換的定義為將圖像中的所有點按照一定的透視關系映射到新的圖像中。

6e529552-e216-11ee-a297-92fbcf53809c.jpg

透視變換.png

透視關系可以由一個3x3的透視變換矩陣來表示,透視變換的矩陣如下:

其中,、、、 表示線性變換,、 表示平移變換,、 表示透視變換。

透視變換的過程為:

此時,得到的不是最后的坐標,還需要進一步轉換:

最終的坐標為:

重新回顧一下整個透視變換的過程:

不難看出看出仿射變換是透視變換的一種特殊情況。

2. 透視變換的應用

2.1 商品圖位置矯正

下面的代碼,對圖中的沒有擺正的商品通過透視變換將其對齊,然后在原圖中將商品放正。主要用到了 OpenCV 的 findHomography()、warpPerspective()函數進行透視變換。findHomography()函數用于計算兩個平面之間進行透視變換的矩陣,warpPerspective() 函數用于對圖像進行透視變換。

#include
#include
#include
#include

usingnamespacestd;
usingnamespacecv;

boolascendSort(vectora,vectorb)
{
returncontourArea(a)>contourArea(b);
}

longpointSideLine(Point&lineP1,Point&lineP2,Point&point){
longx1=lineP1.x;
longy1=lineP1.y;
longx2=lineP2.x;
longy2=lineP2.y;
longx=point.x;
longy=point.y;
return(x-x1)*(y2-y1)-(y-y1)*(x2-x1);
}

vectorsortPointByClockwise(vectorpoints){
if(points.size()!=4){
returnpoints;
}
PointunFoundPoint;
vectorresult={unFoundPoint,unFoundPoint,unFoundPoint,unFoundPoint};
longminDistance=-1;
for(autopoint:points){
longdistance=point.x*point.x+point.y*point.y;
if(minDistance==-1||distance0){
result[1]=points[0];
result[3]=points[1];
}else{
result[1]=points[1];
result[3]=points[0];
}
}

if(result[0]!=unFoundPoint&&result[1]!=unFoundPoint&&result[2]!=unFoundPoint&&result[3]!=unFoundPoint){
returnresult;
}

returnpoints;
}

intmain(intargc,char*argv[])
{
Matsrc=imread(".../product.jpg");
imshow("src",src);

Matgray,binary;
cvtColor(src,gray,COLOR_BGR2GRAY);
threshold(gray,binary,0,255,THRESH_BINARY|THRESH_OTSU);
imshow("binary",binary);

vector>contours;
vectorhierarchy;
findContours(binary,contours,hierarchy,RETR_TREE,CHAIN_APPROX_SIMPLE);

sort(contours.begin(),contours.end(),ascendSort);//ascendingsort

RotatedRectrrt=minAreaRect(contours[0]);
Rectbbox=rrt.boundingRect();

if(bbox.height>2000){
rrt=minAreaRect(contours[1]);
bbox=rrt.boundingRect();
}

Matroi;
try{
roi=src(bbox);
}
catch(...){
}
imshow("roi",roi);

intwidth=static_cast(rrt.size.width);
intheight=static_cast(rrt.size.height);
floatangle=rrt.angle;

printf("height%d,width:%d,angle:%f
",height,width,angle);

Point2fvertices[4];
rrt.points(vertices);
vectorsrc_pts;

for(inti=0;idst_pts;
dst_pts.push_back(Point(0,0));
dst_pts.push_back(Point(width,0));
dst_pts.push_back(Point(width,height));
dst_pts.push_back(Point(0,height));

MatM=findHomography(src_pts,dst_pts);
Matresult=Mat::zeros(Size(width,height),CV_8UC3);
warpPerspective(src,result,M,result.size());

imshow("result",result);

resize(result,result,roi.size());

result.copyTo(roi);

imshow("final",src);
waitKey(0);
return0;
}
簡單介紹一下 warpPerspective() 函數:

voidwarpPerspective(InputArraysrc,OutputArraydst,

InputArrayM,Sizedsize,
intflags=INTER_LINEAR,
intborderMode=BORDER_CONSTANT,
constScalar&borderValue=Scalar());

第一個參數 src: 輸入圖像。

第二個參數 dst: 輸出圖像,與 src 具有相同的類型和大小。

第三個參數 M: 3x3 的透視變換矩陣。

第四個參數 dsize: 輸出圖像的大小。

上述代碼,還需要注意調用 findHomography() 函數時,輸入點的集合和輸出點的集合順序要一致。

2.2 廣告牌內容替換

透視變換還有一個比較經典的例子,就是替換一張圖像中廣告牌的內容,下面的代碼展示了這個例子:

#include
#include
#include
#include

usingnamespacestd;
usingnamespacecv;

boolascendSort(vectora,vectorb)
{
returncontourArea(a)>contourArea(b);
}

longpointSideLine(Point&lineP1,Point&lineP2,Point&point){
longx1=lineP1.x;
longy1=lineP1.y;
longx2=lineP2.x;
longy2=lineP2.y;
longx=point.x;
longy=point.y;
return(x-x1)*(y2-y1)-(y-y1)*(x2-x1);
}

vectorsortPointByClockwise(vectorpoints){
if(points.size()!=4){
returnpoints;
}
PointunFoundPoint;
vectorresult={unFoundPoint,unFoundPoint,unFoundPoint,unFoundPoint};
longminDistance=-1;
for(autopoint:points){
longdistance=point.x*point.x+point.y*point.y;
if(minDistance==-1||distance0){
result[1]=points[0];
result[3]=points[1];
}else{
result[1]=points[1];
result[3]=points[0];
}
}

if(result[0]!=unFoundPoint&&result[1]!=unFoundPoint&&result[2]!=unFoundPoint&&result[3]!=unFoundPoint){
returnresult;
}

returnpoints;
}

intmain(){
Matbillboard=imread(".../billboard.jpg");
imshow("billboard",billboard);

Mathsv;
cvtColor(billboard,hsv,cv::COLOR_BGR2HSV);//BGR轉換到HSV色彩空間
imshow("hsv",hsv);

cv::Scalarlower_white(0,0,0);
cv::Scalarupper_white(180,30,255);

Matmask;
inRange(hsv,lower_white,upper_white,mask);//通過inRange函數實現二值化
imshow("mask",mask);

MatstructureElement=getStructuringElement(MORPH_RECT,Size(105,105),Point(-1,-1));
morphologyEx(mask,mask,MORPH_OPEN,structureElement,Point(-1,-1),1);

imshow("mask2",mask);

vector>contours;
vectorhierarchy;
findContours(mask,contours,hierarchy,RETR_EXTERNAL,CHAIN_APPROX_SIMPLE);
sort(contours.begin(),contours.end(),ascendSort);//ascendingsort

RotatedRectrrt=minAreaRect(contours[0]);//獲取最大輪廓的最小外接矩形
Rectbbox=rrt.boundingRect();
intwidth=static_cast(rrt.size.width);
intheight=static_cast(rrt.size.height);

printf("width%d,height:%d
",width,height);

Point2fpt[4];
rrt.points(pt);

Matroi;
try{
roi=billboard(bbox);
}
catch(...){
}
imshow("roi",roi);

Matgirl=imread(".../girl.jpg");
imshow("girl",girl);

intwidth_girl=girl.cols;
intheight_girl=girl.rows;

vectorsrc_pts;
src_pts.push_back(Point(0,0));
src_pts.push_back(Point(width_girl,0));
src_pts.push_back(Point(width_girl,height_girl));
src_pts.push_back(Point(0,height_girl));

vectordst_pts;
for(inti=0;i
3. 總結

透視變換是一種重要的圖像處理技術,它具有廣泛的應用價值。它可以改變圖像的視角,從而使圖像更加符合人眼的視覺感受,或滿足特定的應用需求。它可以用于圖像矯正、圖像配準、3D 建模、增強現實等領域。

透視變換是一種非線性變換,因此它可能會導致圖像變形。例如,如果透視變換矩陣不合適,可能會使圖像中的物體看起來拉伸或壓縮。此外,透視變換也可能會導致圖像中的物體出現重疊或遮擋。在使用透視變換時,需要考慮這些局限性,并選擇合適的參數來獲得最佳效果。

審核編輯:黃飛

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • OpenCV
    +關注

    關注

    30

    文章

    628

    瀏覽量

    41260
  • 透視變換
    +關注

    關注

    0

    文章

    3

    瀏覽量

    1350

原文標題:OpenCV筑基之圖像的透視變換

文章出處:【微信號:CVSCHOOL,微信公眾號:OpenCV學堂】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    【Rayeager PX2分享】OpenCV入門線段檢測

    )。最基本的霍夫變換是從黑白圖像中檢測直線(線段)。在OpenCV編程中,實現線段檢測主要使用cvHoughLines2函數。函數原型:CvSeq* cvHoughLines2(CvArr* image
    發表于 05-26 11:22

    【DragonBoard 410c試用體驗】 OpenCV圖像角點檢測實現

    ( WINDOW_NAME2, scaledImage );}這里代碼稍微有點多,不過我們主要看cornerHarris 函數,它這才是用于在OpenCV中運行Harris角點檢測算子處理圖像函數
    發表于 09-13 19:46

    OpenCV圖像

    之前學過一段時間OpenCV,跟著網上的資料,自己瞎搞了個上位機,可以對攝像頭采集的圖像簡單處理,在此獻丑了,hhhhhh
    發表于 07-11 19:07

    圖像頻率域分析傅里葉變換

    文章目錄傅里葉變換基礎傅里葉級數傅里葉積分傅里葉變換一維連續傅里葉變換一維離散傅里葉變換二維離散傅里葉變換
    發表于 05-22 07:41

    【EASY EAI Nano開源套件試用體驗】3. OpenCV 圖像處理開發測試

    :素描效果:邊緣掃描效果:浮雕效果:立體效果:圖像白平衡效果: 六、OpenCV 紅外偽彩變換 有了上面開發測試的基礎,可以進一步,利用openc
    發表于 03-08 00:03

    基于透視變換的車輛位置和方向提取方法

    利用快速標定模型進行了車載成像裝置的標定,研究了基于導引標志的車輛位置和方向參數提取,其中改進了一種基于透視變換提取車輛位置方向的方法,即利用圖像中車道平行線和滅影點
    發表于 02-08 15:46 ?31次下載
    基于<b class='flag-5'>透視</b><b class='flag-5'>變換</b>的車輛位置和方向提取方法

    最全OpenCV教程及圖像處理、目標跟蹤、識別案例

    本專題主要幫助讀者快速入門 OpenCV,而無需到處搜尋參考資料,為你免除大量自行搜索的時間,本專題主要給大家介紹OpenCV基礎知識及應用領域設計,包含OpenCV教程、OpenCV
    發表于 07-06 14:11
    最全<b class='flag-5'>OpenCV</b>教程及<b class='flag-5'>圖像</b>處理、目標跟蹤、識別案例

    使用opencv進行圖像處理

    使用opencv進行圖像處理_于仕琪,感興趣的可以看看。
    發表于 05-03 14:45 ?0次下載

    基于圖像透視畸變校正的調炮速度測量系統

    基于圖像透視畸變校正的調炮速度測量系統基于圖像透視畸變校正的調炮速度測量系統
    發表于 05-20 15:37 ?0次下載

    opencv透視變換原理及實例

    透視變換(Perspective Transformation)是將圖片投影到一個新的視平面(Viewing Plane),也稱作投影映射(Projective Mapping)。
    發表于 12-04 15:15 ?1.9w次閱讀
    <b class='flag-5'>opencv</b><b class='flag-5'>透視</b><b class='flag-5'>變換</b>原理及實例

    OpenCV圖像修復

    OpenCV圖像修復技術原理就是利用那些已經被破壞的區域的邊緣, 即邊緣的顏色和結構,根據這些圖像留下的信息去推斷被破壞的信息區的信息內容,然后對破壞區進行填補 ,以達到圖像修補的目的
    發表于 01-17 09:22 ?3098次閱讀

    淺析OpenCV中的透視變換

    透視變換是將圖像從一個視平面投影到另外一個視平面的過程,所以透視變換也被稱為投影映射(Projection Mapping)。
    的頭像 發表于 05-18 16:18 ?1651次閱讀
    淺析<b class='flag-5'>OpenCV</b>中的<b class='flag-5'>透視</b><b class='flag-5'>變換</b>

    OpenCV庫在圖像處理和深度學習中的應用

    本文深入淺出地探討了OpenCV庫在圖像處理和深度學習中的應用。從基本概念和操作,到復雜的圖像變換和深度學習模型的使用,文章以詳盡的代碼和解釋,帶領大家步入
    的頭像 發表于 08-18 11:33 ?846次閱讀

    淺談透視變換的硬件實現策略

    需要著重說明地是,(u,v)是透視變換圖像的坐標,(x,y)是源圖像坐標。我們進行實際的透視變換
    的頭像 發表于 03-05 10:19 ?416次閱讀
    淺談<b class='flag-5'>透視</b><b class='flag-5'>變換</b>的硬件實現策略

    OpenCV圖像的仿射變換方法總結

    圖像的幾何變換是指將一幅圖像中的坐標位置映射到另一幅圖像中的新坐標位置,其實質是改變像素的空間位置,估算新空間位置上的像素值。
    的頭像 發表于 03-19 11:11 ?1450次閱讀
    <b class='flag-5'>OpenCV</b><b class='flag-5'>筑</b><b class='flag-5'>基</b><b class='flag-5'>之</b><b class='flag-5'>圖像</b>的仿射<b class='flag-5'>變換</b>方法總結