opencv 仿射變換

2021-09-28 17:27:00 字數 2033 閱讀 3728

仿射變換的兩種方式:

1、利用變換前後的三個座標點達到變換目的。

2、使用旋轉角度和縮放倍數來變換。

在實際的使用中,採用1的方式比較方便,但是有乙個問題:變換之後的矩陣大小該如何正確設定,如果設定大小不合適,會導致圖的實際區域超出邊界。所以在此記錄一下解決辦法。

思路:由於已知了變換前後的三個座標點,可以先求得變換的旋轉角度,縮放倍數則看實際的專案需求。之後使用方法2來求個仿射變換矩陣。

//求得旋轉角度

cv::point po1;//變換前座標點1

cv::point po2;//變換前座標點2

cv::point po3;//變換後坐標點1

cv::point po4;//變換後坐標點2

int x1 = po2.x - po1.x;

int y1 = po2.y - po1.y;

int x2 = po4.x - po3.x;

int y2 = po4.y - po3.y;

double d1 = atan2((double)x1, (double)y1) * (180.0 / cv_pi);

double d2 = atan2((double)x2, (double)y2) * (180.0 / cv_pi);

double angle = d1 - d2;

if (angle < 0.0)

//開始變換

cv::point2f center(image.cols / 2, image.rows / 2);

double scale = 1.0;

cv::mat warp = getrotationmatrix2d(center, angle, 1.0);

//找出變換之後影象的實際區域

int rotated_width = ceil(image.rows * fabs(sin(angle * cv_pi / 180)) + image.cols * fabs(cos(angle * cv_pi / 180)));

int rotated_height = ceil(image.cols * fabs(sin(angle * cv_pi / 180)) + image.rows * fabs(cos(angle * cv_pi / 180)));

//修改變換中心

warp.at(0, 2) += (rotated_width - image.cols) / 2;

warp.at(1, 2) += (rotated_height - image.rows) / 2;

cv::mat dstimage;

warpaffine(image, dstimage, warp, cv::size(rotated_width,rotated_height));

cv::point top, buttom, left, right;

//搜邊取出實際區域

for (int i = 0; i < dstimage.rows; i++)

} if (flag == 1)

break;

}for (int i = dstimage.rows - 1; i >= 0; i--)

} if (flag == 1)

break;

}for (int i = 0; i < dstimage.cols; i++)

} if (flag == 1)

break;

}for (int i = dstimage.cols - 1; i >= 0; i--)

} if (flag == 1)

break;

}cv::rect rect;

rect.x = left.x;

rect.y = top.y;

rect.width = right.x - left.x;

rect.height = buttom.y - top.y;

cv::mat del = dstimage(rect);

//del即為變換之後影象的實際區域(去除掉黑邊)

OpenCV 仿射變換

一 仿射變換 仿射變換是一種二維座標之間的變換,變換前後保持圖形的平直性和平行性。仿射變換可以理解為是向量經過一次線性變換和一次平移變換。void warpaffine inputarray src,outputarray dst,inputarray m,size dsize,int flags ...

OpenCV實現仿射變換

乙個任意的仿射變換都能表示為 乘以乙個矩陣 線性變換 接著再 加上乙個向量 平移 綜上所述,我們能夠用仿射變換來表示 旋轉 線性變換 平移 向量加 縮放操作 線性變換 你現在可以知道,事實上,仿射變換代表的是兩幅圖之間的關係.全域性變數 char source window source image...

OpenCV與仿射變換

拉伸 收縮 扭曲 旋轉是影象的幾何變換,在三維視覺技術中大量應用到這些變換,又分為仿射變換和透視變換。由圖可以看出,仿射變換是透視變換的子集。仿射變換包括平移,旋轉,縮放。由三對點計算仿射變換 src 輸入影象的三角形頂點座標。dst 輸出影象的相應的三角形頂點座標。返回乙個2x3的變換矩陣。2.w...