- 操作系统:ubuntu22.04
- OpenCV版本:OpenCV4.9
- IDE:Visual Studio Code
- 编程语言:C++11
算法描述
从图像中以亚像素精度检索像素矩形。
getRectSubPix 函数从 src 中提取像素:
p
a
t
c
h
(
x
,
y
)
=
s
r
c
(
x
+
center.x
−
(
dst.cols
−
1
)
∗
0.5
,
y
+
center.y
−
(
dst.rows
−
1
)
∗
0.5
)
patch(x, y) = src(x + \texttt{center.x} - ( \texttt{dst.cols} -1)*0.5, y + \texttt{center.y} - ( \texttt{dst.rows} -1)*0.5)
patch(x,y)=src(x+center.x−(dst.cols−1)∗0.5,y+center.y−(dst.rows−1)∗0.5)
其中非整数坐标处的像素值使用双线性插值进行检索。多通道图像的每个通道独立处理。此外,图像应该是单通道或三通道图像。虽然矩形的中心必须位于图像内部,但矩形的部分可能位于图像外部。
getRectSubPix 函数用于从源图像 src 中以亚像素精度提取一个矩形区域 patch。该函数能够以亚像素精度提取矩形区域,即使矩形的中心位置不在像素的整数坐标上也能进行精确提取。
函数原型
void cv::getRectSubPix
(
InputArray image,
Size patchSize,
Point2f center,
OutputArray patch,
int patchType = -1
)
参数
- 参数image 源图像。
- 参数patchSize 提取的区域大小。
- 参数center 在源图像内提取的矩形中心的浮点坐标。中心必须位于图像内部。
- 参数 patch 提取的区域,其大小为 patchSize 并且与源图像具有相同的通道数。
- 参数 patchType 提取像素的深度,默认情况下,它们具有与源图像相同的深度。
代码示例
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace cv;
using namespace std;
int main()
{
// 加载图像
Mat src = imread("/media/dingxin/data/study/OpenCV/sources/images/hawk.jpg");
if (src.empty())
{
cout << "Error: Image not found." << endl;
return -1;
}
// 定义矩形区域的大小
Size patchSize(250, 200);
// 定义矩形区域中心的坐标
Point2f center(src.cols / 2.0f+70, src.rows / 2.0f+80);
// 提取矩形区域
Mat patch;
getRectSubPix(src, patchSize, center, patch);
// 显示原图像和提取的矩形区域
namedWindow("Original Image", WINDOW_NORMAL);
imshow("Original Image", src);
namedWindow("Extracted Patch", WINDOW_NORMAL);
imshow("Extracted Patch", patch);
// 等待按键并关闭窗口
waitKey(0);
destroyAllWindows();
return 0;
}