小编Ale*_*xey的帖子

线程安全执行循环缓冲区

boost库中的Circular_buffer不是线程安全的.所以我将boost :: circular_buffer对象包装在一个类中,如下所示.通过使用条件变量,互斥锁和锁获取/释放,实现了线程之间的相互排斥(我认为).这个实现线程安全吗?

#include <boost/thread/condition.hpp>
#include <boost/thread/mutex.hpp>
#include <boost/thread/thread.hpp>
#include <boost/circular_buffer.hpp>

// Thread safe circular buffer 
template <typename T>
class circ_buffer : private boost::noncopyable
{
public:
    typedef boost::mutex::scoped_lock lock;
    circ_buffer() {}
    circ_buffer(int n) {cb.set_capacity(n);}
    void send (T imdata) {
        lock lk(monitor);
        cb.push_back(imdata);
        buffer_not_empty.notify_one();
    }
    T receive() {
        lock lk(monitor);
        while (cb.empty())
            buffer_not_empty.wait(lk);
        T imdata = cb.front();
        cb.pop_front();
        return imdata;
    }
    void clear() {
        lock lk(monitor);
        cb.clear();
    }
    int size() {
        lock lk(monitor);
        return cb.size();
    }
    void set_capacity(int capacity) {
        lock …
Run Code Online (Sandbox Code Playgroud)

c++ multithreading boost opencv

32
推荐指数
2
解决办法
3万
查看次数

OpenCV - 二进制图像中所有非零像素的位置

如何在二进制图像(cv :: Mat)中找到所有非零像素的位置?我是否必须扫描图像中的每个像素,或者是否有可以使用的高级OpenCV功能?输出应该是点矢量(像素位置).

例如,这可以在Matlab中完成,只需:

imstats = regionprops(binary_image, 'PixelList');
locations = imstats.PixelList;
Run Code Online (Sandbox Code Playgroud)

或者,甚至更简单

[x, y] = find(binary_image);
locations = [x, y];
Run Code Online (Sandbox Code Playgroud)

编辑:换句话说,如何在cv :: Mat中找到所有非零元素的坐标?

c++ opencv

12
推荐指数
2
解决办法
2万
查看次数

MATLAB - 捕获视频流(MJPEG,rtsp,mpeg)

有没有人在MATLAB中捕获来自IP摄像机的视频流?例如,从rtsp://10.10.10.10:554/live.sdp(rtsp stream)或http://xxxx/axis-cgi/mjpg/video.cgi(mjpeg stream)中获取MATLAB中的帧.MATLAB的Image Acquisition Toolbox目前不支持此功能.我找到了2个选项:1)使用mmread.但是在64位MATLAB下不支持http流读取或2)编写我自己的C++函数来抓取帧(我使用OpenCV库)然后将其编译成MATLAB MEX函数.任何建议表示赞赏.

matlab opencv stream mjpeg rtsp

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

OpenCV中前景 - 背景分割方法的区别

OpenCV版本2.4.5提供了几种不同的实现,可用于跟踪使用统计方法估计背景的移动对象.OpenCV的BackgroundSubtractorMOG,BackgroundSubtractorMOG2阶级的CPU来实现的.此外,它拥有的GPU实现BackgroundSubtractorMOGBackgroundSubtractorMOG2,即gpu::MOG_GPUgpu::MOG2_GPU分别.还有另外两种算法gpu::GMG_GPUgpu::FGDStatModel.

在我的应用程序中,我想在移动对象进入场景后立即将其分段.我想避免像阴影那样的误报.这四种算法似乎专注于同一目标 - 它们通过随时间创建背景模型将背景与前景分开.如果有这些实现经验的人可以帮我决定使用哪个(GPU)实现,我就会徘徊.这些算法 - MOG,MOG2,GMG和FGDStatModel - 彼此之间有何不同?使用一种或另一种算法有什么好处?这些实现如何在速度,配置参数的能力,准确性,阴影检测(误报)等方面进行比较?

c++ opencv computer-vision image-segmentation

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

OpenCV GPU库对矩阵运算有多好?

我正在将OpenCV用于计算机视觉应用.我想在GPU上加速一些矩阵运算(矩阵相当大),并且如果可能的话,希望避免直接在CUDA C中进行编码.OpenCV 2.4.1具有许多GPU加速功能.他们的体验表现如何?我最好还是使用另一个库(例如Thrust)吗?

EDIT 示例应用:计算GPU上的平方欧几里德距离矩阵.目前,我在Matlab中使用并行计算工具箱(PCT)进行的GPU加速(和矢量化)实现比使用OpenCV的C++实现快5到10倍.

Matlab实现:

function K = sqEuclideanDist(P_cpu,Q_cpu)
% Vectorized method to compute pairwise squared Euclidean distance on GPU
% Returns K(i,j) = (P(i,:) - Q(j,:))'*(P(i,:) - Q(j,:))

P_gpu = gpuArray(P_cpu);
Q_gpu = gpuArray(Q_cpu);

[nP, d] = size(P_gpu);
[nQ, d] = size(Q_gpu);

pmag = sum(P_gpu .* P_gpu, 2);
qmag = sum(Q_gpu .* Q_gpu, 2);

% note that K is on GPU
K = ones(nP,1)*qmag' + pmag*ones(1,nQ) - 2*P_gpu*Q_gpu';

end
Run Code Online (Sandbox Code Playgroud)

更新这是另一个完成相同的Matlab实现(感谢/sf/answers/544202641/).但它仅在CPU上运行,因为bsxfunPCT不支持.仍然在寻找C++替代品.

function …
Run Code Online (Sandbox Code Playgroud)

c++ opencv cuda gpu thrust

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

计算点矢量的平均值

我在OpenCV中有一个二维点的向量

std::vector<cv::Point2f> points;
Run Code Online (Sandbox Code Playgroud)

我想计算x和y坐标的平均值points.就像是:

cv::Point2f mean_point; //will contain mean values for x and y coordinates
mean_point = some_function(points); 
Run Code Online (Sandbox Code Playgroud)

这在Matlab中很简单.但我不确定我是否可以利用一些高级OpenCV功能来实现同样的目标.有什么建议?

c++ opencv

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

无法在BackgroundSubtractorMOG2中设置用户参数

OpenCV库版本2.42.我想在BackgroundSubtractorMOG2对象中设置一个参数,例如

BackgroundSubtractorMOG2 bgr;  

// the following doesn't work because 'nmixtures', 'backgroundRatio' 
// and 'fVarMin' are a protected members.
bgr.nmixtures = 3;   
bgr.backgroundRatio = 0.9;
bgr.fVarMin = 5; 

// the following works 
bgr.set('nmixtures', 3); 

// both of the following lines will give a run-time error 
// `Access violation reading location 0x0000000000000008.`
bgr.set("backgroundRatio", 0.9);  
bgr.set("fVarMin", 5);     
Run Code Online (Sandbox Code Playgroud)

backgroundRatio并且fVarMin是控制算法的参数.用户应该能够根据文档更改这些参数.

我该如何设置参数BackgroundSubtractorMOG2

编辑正如下面的答案中正确提到的,这是OpenCV中的一个错误.该错误已在OpenCV版本2.4.6中修复.

c++ opencv background-subtraction

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

从数组构造向量

表明我可以从数组构造一个向量,如下所示:

// the iterator constructor can be used to construct from arrays:
int myints[] = {16,2,77,29};
vector<int> myvector (myints, myints + sizeof(myints) / sizeof(int) );
Run Code Online (Sandbox Code Playgroud)

为什么构造函数的第二个参数myints + sizeof(myints) / sizeof(int)

c++ stdvector

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

如何检查OpenCV是否使用TBB,CUDA或Qt支持进行编译?

如何确定OpenCV库是否在Windows 7计算机上使用TBB或CUDA或QT进行编译?我应该使用依赖性walker,如果是,那怎么办?还是有另一种方法可以找到答案吗?

windows opencv

6
推荐指数
2
解决办法
3992
查看次数

线程安全的有界队列在Boost 1.54中挂起

以下用于有界线程安全队列的代码用于在Boost 1.49中按预期工作.但是,在更新到Boost 1.54之后,代码不再按预期运行.也就是说,当缓冲区为空(完整)时,消费者线程(生产者线程)将永远等待m_not_empty(m_not_full)条件变量并且永远不会唤醒(我认为因为生产者线程没有互斥锁).

版本1.54中是否有一些可能会破坏代码的更改?或者,也许,我错过了代码中的错误?

#include <iostream>
#include <boost/circular_buffer.hpp>
#include <boost/thread/mutex.hpp>
#include <boost/thread/condition.hpp>
#include <boost/thread/thread.hpp>

template <class T>
class bounded_buffer {
public:
    bounded_buffer(size_t capacity) {cb.set_capacity(capacity);}
    void push(T item) {
        boost::mutex::scoped_lock lock(m_mutex);
        while (cb.full()) {
            m_not_full.wait(lock);
        }
        cb.push_back(item);
        lock.unlock();
        m_not_empty.notify_one();
    }

    void pop(T &pItem) {
        boost::mutex::scoped_lock lock(m_mutex);
        while (cb.empty()) {
            m_not_empty.wait(lock);
        }
        pItem = cb.front();
        cb.pop_front(); 
        lock.unlock();
        m_not_full.notify_one();
    }

private:     
    boost::mutex m_mutex;
    boost::condition m_not_empty;
    boost::condition m_not_full;
    boost::circular_buffer<T> cb;
};

bounded_buffer<int> bb_int(4);

void producer() {
    int i = 10;
    for(int j=0; j<100; ++j) …
Run Code Online (Sandbox Code Playgroud)

c++ multithreading boost boost-thread

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