opencv android 多线程,OpenCV多线程相机读取

博主在尝试使用OpenCV通过独立线程从多个摄像头捕获图像,并保存到文件。遇到的问题是保存的图像损坏且无法打开。问题可能出现在线程同步、图像数据处理或保存环节。代码中在主线程中初始化VideoCapture可以成功打开相机,而在CaptureWorker中初始化则导致程序崩溃。目前的代码能成功创建线程并开始捕获,但帧写入过程存在中断。建议检查线程间通信、资源管理及错误处理机制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

我试图使用OpenCV通过单独的线程工作者从多个摄像头捕获图像 .

最终,CaptureWorker会将帧提供给工作队列进行处理,但目前我想保存图像 . 运行以下代码,但保存的“框架”已损坏且无法打开,但不是空的 .

最初,我在CaptureWorker :: startCapture()中构建和存储VideoCapture;但是,程序在打开流时崩溃了 . 在main()中构建和打开VideoCapture会打开相机并允许线程运行 .

是什么导致帧写入中断?没有报告错误 .

main.cpp中

int main(int argc, char * argv[]) {

if(argc <= 1) {

cout << "No camera arguments have been specified. Exiting." << endl;

return -1;

}

int numberOfCameras = argc - 1;

int cameraNumbers[argc-1];

for(int i=0; i

cameraNumbers[i] = atoi(argv[i+1]);

}

VideoCapture cameras[10];

pthread_t cameraThreads[numberOfCameras];

for(int i=0; i

cout << "Creating camera thread: " << i << endl;

cameras[i] = VideoCapture(i);

CaptureWorker capWorker(cameras[i], i);

pthread_create(&cameraThreads[i], NULL, &CaptureWorker::startCaptureWrap, &capWorker);

}

cout << "Closing Main" << endl;

pthread_exit(NULL);

}

CaptureWorker.cpp

class CaptureWorker {

private:

int cameraNumber;

string cameraName;

VideoCapture camera;

public:

CaptureWorker(VideoCapture camera, int cameraNumber) {

this->cameraNumber = cameraNumber;

this->camera = camera;

this->cameraName = "Camera_";

cameraName.append(to_string(cameraNumber));

cout << "CaptureWorker: Worker created" << endl;

}

void *startCapture(void) {

string imageSavePath = "Resources/images/" + this->cameraName;

mkdir(imageSavePath.c_str(), 0777);

cout << "CaptureWorker: Starting capture from camera" << endl;

int count = 0;

while(count <= 3) {

cout << "Capturing frame " << count;

Mat frame;

this->camera >> frame;

cout << " --- ";

string imageNameAndPath;

imageNameAndPath.append(imageSavePath);

imageNameAndPath.append("/img_");

imageNameAndPath.append(to_string(count).c_str());

imageNameAndPath.append(".jpg");

cout << "Saving to: " << imageNameAndPath.c_str() << endl;

imwrite(imageNameAndPath.c_str(), frame);

int c = cvWaitKey(1000);

if((char)c==27 ) {

break;

}

count++;

}

return 0;

}

static void *startCaptureWrap(void *arg) {

return ((CaptureWorker *) arg)->startCapture();

}

};

在OSX中使用eclipse中的cross g编译器 . 免责声明:C,OpenCV,多线程的新手,希望我避免了一个愚蠢的错误 .

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值