- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
大家下午好!
我一直在使用 Visual Studio 2010 和 OpenCV 来开发人脸识别代码。我试图通过两个线程来完成任务(我需要这样做,因为我要把它应用到一个更大的项目上),一个(主要)显示帧,第二个捕获(来 self 笔记本电脑的网络摄像头)并将帧存储在 Mat 对象上(快速捕获)。
这里的不便之处在于第二个线程正在捕获帧,但主线程没有显示它们。我认为将 Mat 从捕获线程复制到主线程上的 Mat 有问题(“current_frame”在我分配后似乎是空的)
这是代码(我正在使用 Boost::Thread 进行多线程处理)
带有建议的新代码
全局声明
#include <iostream>
#include <stdio.h>
#include <boost\thread.hpp>
#include <opencv2/objdetect/objdetect.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
using namespace std;
using namespace cv;
boost::mutex mtx;
函数
void camCapture(VideoCapture& cap, Mat& frame, bool* Capture)
{
while (*Capture==true)
{
mtx.lock();
cap >> frame;
mtx.unlock();
if(frame.empty())
{
cout<<"No hay captura"<<endl;
}
else
{
cout<<"Frame capturado"<<endl;
}
}cout << "camCapture finished\n";
return;}
主要
int main() {
try{
VideoCapture cap(0); // open the default camera
Mat frame,current_frame, SFI, Input;
bool *Capture = new bool;
*Capture = true;
if (!cap.isOpened()) // check if we succeeded
return -1;
//your capture thread has started
boost::thread captureThread(camCapture, cap, frame, Capture);
while(1)
{
if(frame.empty())
{
cout<<"Frame en hilo principal vacio"<<endl;
}
else{
cout<<"Frame en hilo principal capturado"<<endl;
}
mtx.lock();
current_frame = frame.clone();
mtx.unlock();
if(current_frame.empty())
{
cout<<"Current_Frame vacio"<<endl;
}
else{
imshow("Streaming",current_frame);
if(waitKey(10)==27)break;
}
}
//Terminate the thread
captureThread.join();
}
catch(Exception & e)
{
cout<<e.what()<<endl;
}
return 0;}
最佳答案
根据 Boost threads - passing parameters by reference如果你想通过对 boost::thread 函数的引用传递一个变量,你必须使用 boost::ref(v)
。但您可以改用指针。
此外,您应该将互斥量作为指针或引用变量传递给线程,而不是将其作为全局变量使用:
#include <iostream>
#include <stdio.h>
#include <boost/thread.hpp>
#include <opencv2/objdetect/objdetect.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
using namespace std;
using namespace cv;
boost::mutex mtx;
void camCapture(VideoCapture& cap, Mat& frame, bool* Capture)
{
while (*Capture == true)
{
mtx.lock();
cap >> frame;
mtx.unlock();
if (frame.empty())
{
cout << "No hay captura" << endl;
}
else
{
cout << "Frame capturado" << endl;
}
}cout << "camCapture finished\n";
return;
}
int main() {
try{
VideoCapture cap(0); // open the default camera
Mat frame, current_frame, SFI, Input;
bool *Capture = new bool; // better not use a pointer here, but use a bool and pass the address or by reference.
*Capture = true;
if (!cap.isOpened()) // check if we succeeded
return -1;
//your capture thread has started
boost::thread captureThread(camCapture, boost::ref(cap), boost::ref(frame), Capture);
while (1)
{
mtx.lock();
current_frame = frame.clone();
mtx.unlock();
if (current_frame.empty())
{
cout << "Current_Frame vacio" << endl;
}
else{
imshow("Streaming", current_frame);
if (waitKey(10) == 27)
{
// TODO: you should use a mutex (or an atomic type) here, too, maybe setting a bool is thread-safe, but this can't be guaranteed for each hardware!
*Capture = false;
break;
}
}
}
//Terminate the thread
captureThread.join();
// give memory free:
delete Capture;
}
catch (Exception & e)
{
cout << e.what() << endl;
}
return 0;
}
关于c++ - Visual Studio 2010 OpenCV 多线程垫不复制到另一个垫,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36379560/
我有一个 mat-select 元素,其中包含固定数量的 mat-option 元素。要查看最后一个元素,我必须滚动列表。是否可以扩大区域以便我无需滚动即可看到最后一个元素?
我想填充一些百分比值,以便小数位前始终有 3 个单位。使用整数我可以使用 '%03d' - 是否有等效的 float ? '%.3f' 适用于小数点后,但 '%03f' 什么都不做。 最佳答案 '%0
我有一个 vector Mat 文件,我想将它存储在 txt 文件中。每个 mat 文件的大小为 1x4500,我总共有 5000 个 vector 。我试图用上面的代码存储在 txtfile 中:
我需要一个 Mat 对象,其中每个元素都是一个类型为 double 且大小为 15 的 vector 。 我试过了 Mat seq(rownum,colnum,Vec); 但这给了我错误: expec
我想将我的 OpenCV Mat 转换为 Matlab .mat 文件,Matlab 可以轻松读取该文件。我不想使用Mex函数直接将数据提供给matlab,因为我想将数据保存在硬盘上。 有可用的 cv
我正在使用 当条件为真时,我希望有一些具有粗体样式的选项。 目前,下拉选项中的选项为粗体,但一旦选择该选项,该样式将不会应用于文本字段中的选择。 如何在选择后将样式应用于文本字段? 这是一个代码示例:
我在手机上运行我的应用程序,同时使用 MAT 进行调试。在我尝试在 Eclipse 中转储 HPROF 文件后,出现错误: 无法将 hprof 数据保存到临时文件中。设备上没有剩余空间。 我已经对此进
我有一个 CV_32F 类型的垫子 A 和一个二进制值为 0 和 255 的掩码 M。例如, A = [0.1 0.2; 0.3 0.4] M = [1 0 ; 0 0 ] 我想得到 A
我在我的 Angular 5 应用程序中使用@angular/material。我使用的 Angular Material 版本是 5.0.2。我正在使用@angular/animations 5.1
我想根据任意数据类型、行维度、列维度和 channel 维度的一维数据数组构建一个 3 channel 矩阵。在我的示例中,我有一个 1x12 double 组数据,我想将其转换为 2x2x3 Ope
我正在尝试使用 C# 中的 BouncycaSTLe 解密河豚加密字符串。 我能够轻松地加密和解密我自己的字符串,但不幸的是,我必须解密由另一个系统生成的字符串。 我能够使用以下命令使用 C#/Bou
我想在 Android Opencv c++ 库中获取绝对矩阵。我正在使用 abs(Mat m) 函数,但它会返回 MatExpr 对象。你知道如何只用矩阵的绝对值得到 Mat 对象吗? Ma
在 OpenCV 中,我可以将 RGB 1920 x 1080 垫乘以 3 x 3 垫以更改源垫的颜色组成。一旦我的源垫形状正确,我就可以使用“*”运算符来执行乘法。使用 cv::gpu::GpuMa
给定vector > A_STL , 我希望它被转换成 arma::mat A . 最佳答案 一种简单的方法是将 vector 矩阵的 vector 展平为一维 vector 。因此,您可以使用 ma
以下代码从文件中读取图像到 cv::Mat目的。 #include #include cv::Mat load_image(std::string img_path) { cv::Mat im
我有一个 AVCaptureSession,它输出带有 BGRA 像素的 CMSampleBuffer。我正在尝试仅从 BGR 创建 Mat 对象,以最有效的方式,使用数据 pointers。 CV
我正在尝试诊断我的 Android 应用程序中的内存问题。我转储了一个 HPROF 文件并将其加载到 Eclipse MAT 工具中(参见 How to analyze memory using an
我是一名优秀的程序员,十分优秀!