- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在尝试将对 opencv 的 groupRectangles()
的调用从 python 转换为 c++,并且注意到 python 绑定(bind)的输出与 c++ 调用的输出不匹配。
我编辑了下面的输出以反射(reflect)在 ubuntu 18.04 上使用 opencv 3.2 重现此内容
库版本
我在 Ubuntu 18.04 上运行 opencv。
c++ 程序链接到 opencv 3.2.0(由 ldd 报告)。
python 模块报告版本 3.2.0
C++代码
我编写了以下程序来获取一组 (x1, y1, x2, y2) 输入并将它们传递给组阈值为 3 且 epsilon 为 0.02 的 groupRectangles()
。为了便于比较,输出以python的列表格式打印。
#include <opencv2/opencv.hpp>
#include <iostream>
#include <vector>
// display in python format
std::ostream& operator<<(std::ostream& out, std::vector<cv::Rect>& rectangles)
{
out << '[';
for (auto i = 0u; i<rectangles.size(); ++i)
{
if (i)
out << ',';
out << '[' << rectangles[i].tl().x << ',' << rectangles[i].tl().y << ',' << rectangles[i].br().x << ',' << rectangles[i].br().y << ']';
}
return out << ']';
}
// inputs are x1,y1,x2,y2
constexpr const float inputs[][4] = {{547,432,701,639},{557,435,700,640},{560,438,695,641},{560,438,694,640},{88,443,336,663},{83,444,357,671},{83,444,373,676},{87,449,377,676},{87,454,380,677},{76,453,388,680},{72,447,394,683},{80,437,393,683},{101,430,392,678},{547,433,702,641},{555,433,701,645},{558,437,696,647},{556,440,696,644},{84,443,357,664},{73,448,369,665},{74,449,375,664},{81,451,373,664},{85,454,375,666},{81,454,385,672},{74,452,392,676},{77,445,396,679},{91,433,392,680},{547,430,705,644},{553,429,704,649},{555,434,697,649},{552,438,695,649},{85,445,365,661},{69,451,376,662},{69,452,379,663},{76,453,374,663},{80,452,377,666},{79,451,382,671},{74,449,388,673},{77,445,393,673},{90,434,389,674},{546,429,706,643},{553,428,703,647},{554,432,695,649},{553,435,693,654},{81,445,370,663},{68,454,383,664},{67,455,388,664},{72,454,384,667},{77,452,382,669},{71,448,386,671},{66,443,388,672},{73,438,389,671},{92,429,388,673},{545,429,706,642},{553,429,703,643},{553,432,695,647},{553,432,696,658},{79,450,367,664},{72,459,379,663},{71,459,387,665},{75,458,388,667},{75,455,390,666},{65,448,389,668},{63,441,387,669},{73,433,384,672},{100,425,388,675},{549,429,707,648},{550,429,701,652},{554,434,703,662},{79,462,356,665},{73,462,374,665},{74,461,383,666},{73,460,387,667},{69,457,391,664},{60,447,390,668},{63,435,385,673},{81,430,384,676},{116,433,390,677}};
int main()
{
std::vector<cv::Rect> candidates;
std::transform(std::begin(inputs), std::end(inputs), std::back_inserter(candidates),
[](const float coord[4]) {
return cv::Rect(cv::Point((int)coord[0], (int)coord[1]), cv::Point((int)coord[2], (int)coord[3]));
});
std::cout << "input:\n" << candidates << '\n';
std::vector<int> weights(candidates.size());
cv::groupRectangles(candidates, weights, 3, 0.02);
std::cout << "output:\n" << candidates << '\n';
return EXIT_SUCCESS;
}
测试执行
当执行 c++ 程序时,我得到以下输出:
input:
[[547,432,701,639],[557,435,700,640],[560,438,695,641],[560,438,694,640],[88,443,336,663],[83,444,357,671],[83,444,373,676],[87,449,377,676],[87,454,380,677],[76,453,388,680],[72,447,394,683],[80,437,393,683],[101,430,392,678],[547,433,702,641],[555,433,701,645],[558,437,696,647],[556,440,696,644],[84,443,357,664],[73,448,369,665],[74,449,375,664],[81,451,373,664],[85,454,375,666],[81,454,385,672],[74,452,392,676],[77,445,396,679],[91,433,392,680],[547,430,705,644],[553,429,704,649],[555,434,697,649],[552,438,695,649],[85,445,365,661],[69,451,376,662],[69,452,379,663],[76,453,374,663],[80,452,377,666],[79,451,382,671],[74,449,388,673],[77,445,393,673],[90,434,389,674],[546,429,706,643],[553,428,703,647],[554,432,695,649],[553,435,693,654],[81,445,370,663],[68,454,383,664],[67,455,388,664],[72,454,384,667],[77,452,382,669],[71,448,386,671],[66,443,388,672],[73,438,389,671],[92,429,388,673],[545,429,706,642],[553,429,703,643],[553,432,695,647],[553,432,696,658],[79,450,367,664],[72,459,379,663],[71,459,387,665],[75,458,388,667],[75,455,390,666],[65,448,389,668],[63,441,387,669],[73,433,384,672],[100,425,388,675],[549,429,707,648],[550,429,701,652],[554,434,703,662],[79,462,356,665],[73,462,374,665],[74,461,383,666],[73,460,387,667],[69,457,391,664],[60,447,390,668],[63,435,385,673],[81,430,384,676],[116,433,390,677]]
output:
[[546,431,704,642],[70,447,389,672],[555,435,696,647],[74,455,381,666]]
在 python 中,我将 c++ 输入剪切并粘贴为 groupRectangles()
的输入,但得到完全不同的结果:
cv2.groupRectangles([[547,432,701,639],[557,435,700,640],[560,438,695,641],[560,438,694,640],[88,443,336,663],[83,444,357,671],[83,444,373,676],[87,449,377,676],[87,454,380,677],[76,453,388,680],[72,447,394,683],[80,437,393,683],[101,430,392,678],[547,433,702,641],[555,433,701,645],[558,437,696,647],[556,440,696,644],[84,443,357,664],[73,448,369,665],[74,449,375,664],[81,451,373,664],[85,454,375,666],[81,454,385,672],[74,452,392,676],[77,445,396,679],[91,433,392,680],[547,430,705,644],[553,429,704,649],[555,434,697,649],[552,438,695,649],[85,445,365,661],[69,451,376,662],[69,452,379,663],[76,453,374,663],[80,452,377,666],[79,451,382,671],[74,449,388,673],[77,445,393,673],[90,434,389,674],[546,429,706,643],[553,428,703,647],[554,432,695,649],[553,435,693,654],[81,445,370,663],[68,454,383,664],[67,455,388,664],[72,454,384,667],[77,452,382,669],[71,448,386,671],[66,443,388,672],[73,438,389,671],[92,429,388,673],[545,429,706,642],[553,429,703,643],[553,432,695,647],[553,432,696,658],[79,450,367,664],[72,459,379,663],[71,459,387,665],[75,458,388,667],[75,455,390,666],[65,448,389,668],[63,441,387,669],[73,433,384,672],[100,425,388,675],[549,429,707,648],[550,429,701,652],[554,434,703,662],[79,462,356,665],[73,462,374,665],[74,461,383,666],[73,460,387,667],[69,457,391,664],[60,447,390,668],[63,435,385,673],[81,430,384,676],[116,433,390,677]], 3, 0.02)
(array([[553, 433, 700, 647],
[ 75, 449, 382, 669],
[ 95, 430, 390, 676]], dtype=int32), array([[23],
[46],
[ 5]], dtype=int32))
这是我转换为 cv::Rect
的问题,groupRectangles()
中的非确定性或其他问题吗?
最佳答案
上面的问题完全在python <-> c++ cv::Rect
转换上。在 python 中,list[4] 是 x, y, height, width,not x1, y1, x2, y2(正如我被移植的代码中的错误所误导的那样)。
如果我更改以下行,上面的代码将正常工作。
打印时:
out << '[' << rectangles[i].tl().x << ',' << rectangles[i].tl().y << ',' << rectangles[i].width << ',' << rectangles[i].height << ']';
在构建 cv::Rect
时:
return cv::Rect((int)coord[0], (int)coord[1], (int)coord[2], (int)coord[3]);
关于python - opencv.groupRectangles() c++ 和 python 层之间的差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54463002/
我正在处理一组标记为 160 个组的 173k 点。我想通过合并最接近的(到 9 或 10 个组)来减少组/集群的数量。我搜索过 sklearn 或类似的库,但没有成功。 我猜它只是通过 knn 聚类
我有一个扁平数字列表,这些数字逻辑上以 3 为一组,其中每个三元组是 (number, __ignored, flag[0 or 1]),例如: [7,56,1, 8,0,0, 2,0,0, 6,1,
我正在使用 pipenv 来管理我的包。我想编写一个 python 脚本来调用另一个使用不同虚拟环境(VE)的 python 脚本。 如何运行使用 VE1 的 python 脚本 1 并调用另一个 p
假设我有一个文件 script.py 位于 path = "foo/bar/script.py"。我正在寻找一种在 Python 中通过函数 execute_script() 从我的主要 Python
这听起来像是谜语或笑话,但实际上我还没有找到这个问题的答案。 问题到底是什么? 我想运行 2 个脚本。在第一个脚本中,我调用另一个脚本,但我希望它们继续并行,而不是在两个单独的线程中。主要是我不希望第
我有一个带有 python 2.5.5 的软件。我想发送一个命令,该命令将在 python 2.7.5 中启动一个脚本,然后继续执行该脚本。 我试过用 #!python2.7.5 和http://re
我在 python 命令行(使用 python 2.7)中,并尝试运行 Python 脚本。我的操作系统是 Windows 7。我已将我的目录设置为包含我所有脚本的文件夹,使用: os.chdir("
剧透:部分解决(见最后)。 以下是使用 Python 嵌入的代码示例: #include int main(int argc, char** argv) { Py_SetPythonHome
假设我有以下列表,对应于及时的股票价格: prices = [1, 3, 7, 10, 9, 8, 5, 3, 6, 8, 12, 9, 6, 10, 13, 8, 4, 11] 我想确定以下总体上最
所以我试图在选择某个单选按钮时更改此框架的背景。 我的框架位于一个类中,并且单选按钮的功能位于该类之外。 (这样我就可以在所有其他框架上调用它们。) 问题是每当我选择单选按钮时都会出现以下错误: co
我正在尝试将字符串与 python 中的正则表达式进行比较,如下所示, #!/usr/bin/env python3 import re str1 = "Expecting property name
考虑以下原型(prototype) Boost.Python 模块,该模块从单独的 C++ 头文件中引入类“D”。 /* file: a/b.cpp */ BOOST_PYTHON_MODULE(c)
如何编写一个程序来“识别函数调用的行号?” python 检查模块提供了定位行号的选项,但是, def di(): return inspect.currentframe().f_back.f_l
我已经使用 macports 安装了 Python 2.7,并且由于我的 $PATH 变量,这就是我输入 $ python 时得到的变量。然而,virtualenv 默认使用 Python 2.6,除
我只想问如何加快 python 上的 re.search 速度。 我有一个很长的字符串行,长度为 176861(即带有一些符号的字母数字字符),我使用此函数测试了该行以进行研究: def getExe
list1= [u'%app%%General%%Council%', u'%people%', u'%people%%Regional%%Council%%Mandate%', u'%ppp%%Ge
这个问题在这里已经有了答案: Is it Pythonic to use list comprehensions for just side effects? (7 个答案) 关闭 4 个月前。 告
我想用 Python 将两个列表组合成一个列表,方法如下: a = [1,1,1,2,2,2,3,3,3,3] b= ["Sun", "is", "bright", "June","and" ,"Ju
我正在运行带有最新 Boost 发行版 (1.55.0) 的 Mac OS X 10.8.4 (Darwin 12.4.0)。我正在按照说明 here构建包含在我的发行版中的教程 Boost-Pyth
学习 Python,我正在尝试制作一个没有任何第 3 方库的网络抓取工具,这样过程对我来说并没有简化,而且我知道我在做什么。我浏览了一些在线资源,但所有这些都让我对某些事情感到困惑。 html 看起来
我是一名优秀的程序员,十分优秀!