小编use*_*804的帖子

OpenCV Canny + Watershed

我正在使用canny边缘检测和查找轮廓功能(两个OpenCV)来创建分水岭变换的标记.一切正常,但我对结果并不是百分之百满意.原因是缺少一些边缘,因此丢失了重要信息.更详细的说,我得到了一堆窗口(前视图),它们是矩形,在分水岭变换之后,我最终得到了这样的结果:

在此输入图像描述 在此输入图像描述 但我宁愿有漂亮的矩形,这些矩形是完整的,不向一边开放.同时保持不规则的形状(房子前面的灌木,汽车..)任何想法如何解决这个问题?我想用网格覆盖整个图像,但我不能让它工作.

非常感谢你.

这是我的代码:

Mat gray;
cvtColor(im, gray, CV_BGR2GRAY);

// Use Canny instead of threshold to catch squares with gradient shading
Mat bw;
Canny(gray, bw, 0, 100, 5, true);

// Find contours
vector<vector<Point> > contours;
vector<Vec4i> hierarchy;

findContours( bw, contours, hierarchy,
    CV_RETR_CCOMP, CV_CHAIN_APPROX_SIMPLE );


// watershed
Mat markers(bw.size(), CV_32S);
markers = Scalar::all(0);
int idx = 0;
int compCount = 0;
for( ; idx >= 0; idx = hierarchy[idx][0], compCount++ ) {
    if (fabs(contourArea(contours[compCount])) < min_size )
        continue;
    drawContours(markers, contours, idx, …
Run Code Online (Sandbox Code Playgroud)

c++ opencv edge-detection watershed

9
推荐指数
2
解决办法
6303
查看次数

C++中的快速(est)可变堆实现

我目前正在寻找满足我要求的C++中最快的数据结构:

  1. 我从几百万个需要插入的条目开始.
  2. 在每次迭代中,我想要查看最大元素并更新大约10个其他元素.我甚至可以只减少键,但我更喜欢更新(增加和减少功能).

我不需要删除/插入(除了最初的删除/插入)或其他任何内容.我认为堆是最好的选择.在查看STL之后,我发现大多数数据结构都不支持更新(这是关键部分).解决方案是删除并重新插入看起来很慢的元素(我的程序的瓶颈).然后我查看了boost提供的堆,发现pairing_heap给了我最好的结果.但是,所有堆仍然比MultiMap上的删除/插入过程慢.有没有人有建议,我可以尝试哪种方法/实施?

非常感谢你.

再次为了完整起见,这是我目前的时间:

  1. MultiMap STL(删除/插入):~70秒
  2. 斐波那契提升:约110秒
  3. D-Ary Heap Boost~(最佳选择:D = 150):~120秒
  4. 配对堆增强:约90秒
  5. 歪斜的提升:105秒

编辑我的帖子以澄清一些事情:

  1. 我的条目是双打(双键是关键,我仍然附加一些任意值)这就是为什么我不认为哈希是一个好主意.
  2. 我在谈论一个不正确的PriorityQueue.相反,第一个实现使用MultiMap,其中值将被擦除然后重新插入(使用新值).我更新了我的帖子.对困惑感到抱歉.
  3. 我没看到std :: make_heap如何解决这个问题.
  4. 为了更新元素,我有一个单独的查找表,在其中我维护元素的句柄.有了它,我可以直接更新元素而无需搜索它.

c++ heap performance boost stl

6
推荐指数
1
解决办法
1659
查看次数

在移动设备上运行递归神经网络(推理)的最快方法

我所拥有的:Tensorflow中经过训练的递归神经网络。

我想要的是:一个可以尽快运行此网络的移动应用程序(仅推理模式,无需培训)。

我相信有多种方法可以实现我的目标,但是我想请您提供反馈/更正和补充,因为我以前从未这样做过。

  1. Tensorflow Lite。专业版:直截了当,可在Android和iOS上使用。相反:可能不是最快的方法,对吗?
  2. TensorRT。Pro:非常快+我可以编写自定义C代码以使其更快。Contra:用于Nvidia设备,因此没有简单的方法可以在Android和iOS上运行,对吗?
  3. 自定义代码+库,例如openBLAS。Pro:可能非常快,并且可以在iOS的Android上链接到它(如果我没记错的话)。相反:递归神经网络有很多用途吗?在Android + iOS上真的可以很好地工作吗?
  4. 重新实现一切。我还可以用C / C ++重写整个计算,这对于递归神经网络来说应该不会太难。Pro:可能是最快的方法,因为我可以优化所有内容。相反:将花费很长时间,而且如果网络发生变化,我也必须更新代码(尽管如果它确实是最快的,我也愿意这样做)。另外,我可以在Android上以多快的速度调用库(C / C ++)?我是否受Java接口的限制?

有关移动应用程序的一些详细信息。该应用程序将对用户进行录音,进行一些处理(例如Speech2Text)并输出文本。我不想找到“足够快”的解决方案,而是最快的选择,因为这将在非常大的声音文件中发生。因此,几乎每个速度提高都至关重要。您有什么建议,我应该如何解决这个问题?

最后一个问题:如果我尝试雇用某个人来帮助我,我是否应该寻找Android / iOS,嵌入式或Tensorflow型人员?

performance android ios tensorrt tensorflow-lite

5
推荐指数
1
解决办法
1104
查看次数

错误:使用已删除的函数std :: basic_ofstream(OpenCV和C++ 11)

我正在尝试导入我之前在Windows下使用C++ 11和OpenCV编写的项目,但它给了我麻烦,我无法弄清楚为什么.这是一个MakeFile项目,我添加了一行来启用C++ 11支持.但是,当我试图在eclipse中运行"make"或运行项目时,我收到以下错误(以及其他一些错误)

use of deleted function ‘std::basic_filebuf<char>&  std::basic_filebuf<char>::operator=(const std::basic_filebuf<char>&)’   FacadeLabelingV2        line 599, external location: /usr/include/c++/4.8/fstream
Run Code Online (Sandbox Code Playgroud)

我的代码看起来像这样:

#ifndef _FILEUTIL_CPP_
#define _FILEUTIL_CPP_

#include "Configuration.h"
#include "Utilities.cpp"

#include <iostream>
#include <fstream>


static void saveFeatures(const std::pair<cv::Mat, cv::Mat>& features, const Configuration& config, bool training, bool append, int counter = 0){
    string prefix;
    if (training) {
        prefix = "train";
    } else {
        prefix = "test";
    }
    std::string directory = config.dir_classifiers + config.name_of_run;
    std::ofstream save_file;
    std::string counter_appendix = std::to_string(counter / 50);
    std::string path_temp = directory + …
Run Code Online (Sandbox Code Playgroud)

c++ eclipse opencv makefile-project c++11

3
推荐指数
1
解决办法
7131
查看次数

创建 avx 向量时出现段错误

对于我当前的项目,我需要创建一个 256 位 AVX 向量的向量。我用了

myVector = vector<__m256d>(nrVars(), _mm256_set1_pd(1.0));
Run Code Online (Sandbox Code Playgroud)

一次工作正常,但在执行该行两次后,它给了我一个分段错误。我能够想出以下代码

vector<__m256d> temp;
__m256d entry = _mm256_set1_pd(1.0);
temp = vector<__m256d>(10, entry);
temp = vector<__m256d>(10, entry);
Run Code Online (Sandbox Code Playgroud)

总是会产生分段错误。您能否向我解释为什么会这样,以及我将来如何避免这个问题?

非常感谢!

PS即使这样也行不通:

myVector.clear();
myVector.reserve(nrVars());
for (size_t i=0; i<nrVars(); ++i) {
    myVector[i] = _mm256_set1_pd(1.0);
}
Run Code Online (Sandbox Code Playgroud)

并回答评论。这是一个产生段错误的完整示例:

#include <vector>
#include "immintrin.h"

using namespace std;
int main(int argc, char **argv) {
    vector<__m256d> temp;
    __m256d entry = _mm256_set1_pd(1.0);
    temp = vector<__m256d>(10, entry);
    temp = vector<__m256d>(10, entry);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

要阅读 m256d 和我正在使用的功能,请查看英特尔内部网站(https://software.intel.com/sites/landingpage/IntrinsicsGuide/

c++ vector intrinsics segmentation-fault avx

1
推荐指数
1
解决办法
574
查看次数