Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/289.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 图像定位OpenCV_Python_Image_Opencv - Fatal编程技术网

Python 图像定位OpenCV

Python 图像定位OpenCV,python,image,opencv,Python,Image,Opencv,这可能被称为“感兴趣区域”,我不太确定。但是,我想做的很容易解释 我有一张照片需要与网格对齐 首先;显示“此处”的小文本必须是屏幕顶部的151px 其次;从“此处”到下巴的位置8必须为631px 最后,;必须在鼻子上的第28行沿图片中间画一条直线 如果我说不通,请告诉我详细说明 我有以下想法(这是伪代码) 它只是简单地循环,直到通过一个调整大小的函数满足要求,这很像暴力强迫,但这就是我所能想到的 i、 e 看看OpenCV的教程,对于具有面的图像,可以使用Haar级联来简化工作。() 否则,请

这可能被称为“感兴趣区域”,我不太确定。但是,我想做的很容易解释

我有一张照片需要与网格对齐

首先;显示“此处”的小文本必须是屏幕顶部的151px

其次;从“此处”到下巴的位置8必须为631px

最后,;必须在鼻子上的第28行沿图片中间画一条直线

如果我说不通,请告诉我详细说明

我有以下想法(这是伪代码)

它只是简单地循环,直到通过一个调整大小的函数满足要求,这很像暴力强迫,但这就是我所能想到的

i、 e


看看OpenCV的教程,对于具有面的图像,可以使用Haar级联来简化工作。()


否则,请查看ROI(感兴趣区域)以提取区域并在其上应用算法(调整大小或裁剪)

考虑切换操作顺序以避免需要迭代。一点数学和一个视角的改变应该可以做到:

1.)从“此处”到下巴的距离为631px的图像

2.)使用a裁剪图像,使“此处”距离屏幕顶部为151px

3)画你的画

编辑:

假设已经定义了所有适当的约束,则可以将图像变形为适当的填充

如果你只需要做一个简单的比例尺。。。首先计算点之间的距离,使用类似的方法

然后创建比例因子以调整图像大小

float scaleFactor = euclideanDist(a,b) / 631;
cv::resize(input, output, cv::Size(), scaleFactor, scaleFactor, cv::INTER_LINEAR);

使用scaleFactor的两个实例将在X&Y中创建统一的缩放。使用两个不同的缩放因子将分别缩放X和Y。

拿一支笔和一张纸,画出来,然后花一些时间计算(基本)数学。步骤1有几种方法@牛顿的答案中有一个。或者使用trig,在这里找到距离btwn和点,并将这些参数输入到resize中。你能澄清一下你的网格和设置吗?你想要一个纯粹的翻译解决方案,还是想要“填充”空间,从而可能扭曲你的图像?一个基本的调整大小就可以了。所以我不介意扭曲。我的网格是这样的。。151像素的空间。。。。631px头。剩下的图像,身体。(这就是我需要的结果)否则,图像会有所不同,但我确实将头部的顶部和底部计算为x,y值。我不完全确定我是否理解您在这一点上的问题,但我更新了答案,并提供了更多细节。这些是沿单个轴(X或Y)的线性距离吗?
Point2f a(10,10);
Point2f b(100,100);

float euclideanDist(Point& p, Point& q) {
    Point diff = p - q;
    return cv::sqrt(diff.x*diff.x + diff.y*diff.y);
}
float scaleFactor = euclideanDist(a,b) / 631;
cv::resize(input, output, cv::Size(), scaleFactor, scaleFactor, cv::INTER_LINEAR);