求一个多线程的例程C++(API),摄像头捕捉,双目测距的,想改成多线程的,不用每次数据处理完才能捕捉图像

#include"stdafx.h"#include"CameraDS.h"#include"string"#include<cv.h>#include<highgui.... #include "stdafx.h"
#include "CameraDS.h"
#include "string"
#include <cv.h>
#include <highgui.h>

#include <stdio.h>
#include <iostream>

#include "windows.h"
#include <fstream>

using namespace std;
int singlematching(IplImage *srcl, IplImage *srcr , IplImage *tp1);

int main()
{
int cam_count;

//仅仅获取摄像头数目
cam_count = CCameraDS::CameraCount();
printf("There are %d cameras.\n", cam_count);

//获取所有摄像头的名称
for(int i=0; i < cam_count; i++)
{
char camera_name[1024];
int retval = CCameraDS::CameraName(i, camera_name, sizeof(camera_name) );

if(retval >0)
printf("Camera #%d's Name is '%s'.\n", i, camera_name);
else
printf("Can not get Camera #%d's name.\n", i);
}

if(cam_count==0)
return -1;

// 创建2个摄像头类
CCameraDS camera1;
CCameraDS camera2;

if(! camera1.OpenCamera(0, false))
{
fprintf(stderr, "Can not open camera.\n");
return -1;
}
//打开第二个摄像头
camera2.OpenCamera(1, false);

cvNamedWindow("cam1",1);
cvNamedWindow("cam2",1);
int nFrmNum = 0;

int k=0;

while(1)
{
//获取一帧
IplImage *pFrame1 = camera1.QueryFrame();
IplImage *pFrame2 = camera2.QueryFrame();
IplImage *fFrame1 = 0;
IplImage *fFrame2 = 0;
float scale=0.2;
CvSize dst_cvsize;

dst_cvsize.width=pFrame1->width*scale;
dst_cvsize.height=pFrame1->height*scale;
fFrame1=cvCreateImage(dst_cvsize,pFrame1->depth,pFrame1->nChannels);
fFrame2=cvCreateImage(dst_cvsize,pFrame1->depth,pFrame1->nChannels);
cvResize(pFrame1,fFrame1,CV_INTER_LINEAR);
cvResize(pFrame2,fFrame2,CV_INTER_LINEAR);
nFrmNum++;
DWORD dwStart = GetTickCount();
DWORD dwEnd = dwStart;
do
{
dwEnd = GetTickCount()-dwStart;
}while(dwEnd <1);

// 显示实时的摄像头视频
cvShowImage("cam1", fFrame1);
cvShowImage("cam2", fFrame2);
IplImage *tp1 = cvLoadImage("tr.bmp",1);
int m;

if(k==5)
{
m=singlematching( pFrame2, pFrame1,tp1);\\运算
k=0;
}
k++;

//cvWaitKey(33);
int key = cvWaitKey(33);
if( key == 27 ) break;
}

camera1.CloseCamera(); //可不调用此函数,CCameraDS析构时会自动关闭摄像头
camera2.CloseCamera();
cvDestroyAllWindows();

return 0;
}

int singlematching(IplImage *srcl, IplImage *srcr ,IplImage *tp1)
{
}
展开
 我来答
晴空森林
2011-04-19 · TA获得超过3039个赞
知道小有建树答主
回答量:312
采纳率:57%
帮助的人:180万
展开全部
没法给你把这个做出来,除非你想out source给我,但要计算相应的工作时间付费的。现在只能给你一些建议:

首先,你要有一个概念,多线程只是在有CPU空闲的程序中实现多个线程并行,从而使程序显得更”流畅“。多线程并不会让你的CPU运算能力得到提高。

你的程序,或许可以用双线程:
一个线程捕捉图像,一个线程处理数据。但要记住两点:
1,两个线程间要加缓存
2,当缓存已经满了的时候,捕捉线程应该要等处理数据的线程处理完缓存才继续捕捉。
因此,并不能保证你用了双线程就会更加流畅,要你的的电脑运算能力。和捕捉图像的数据大小。
匿名用户
2011-04-20
展开全部
#include <windows.h>

typedef HANDLE HSEMAPHORE;

#define P(hHandle) ::WaitForSingleObject(hHandle, INFINITE)
#define V(hHandle) ::ReleaseSemaphore(hHandle, 1, NULL)
#define Semaphore(lInitial, lMaximum) ::CreateSemaphore(NULL, lInitial, lMaximum, NULL)
#define Thread(lpProc, lpParam) ::CreateThread(NULL, 0, lpProc, (LPVOID)lpParam, 0, NULL)
#define Wait(nCount, lpHandles) ::WaitForMultipleObjects(nCount, lpHandles, TRUE, INFINITE)

HSEMAPHORE n = Semaphore(0, 1);
HSEMAPHORE s = Semaphore(1, 1);
HSEMAPHORE e = Semaphore(100, 100);

UINT count = 0;

void Produce()
void Consume()

DWORD WINAPI Producer(LPVOID lpParameter)
{
while (true)
{
Produce();
P(e);
P(s);
count++;
printf("Producer: %d\n", count);
V(s);
V(n);
}
return 0;
}

DWORD WINAPI Consumer(LPVOID lpParameter)
{
while (true)
{
P(n);
P(s);
count--;
printf("Consumer: %d\n", count);
V(s);
V(e);
Consume();
}
return 0;
}

int main()
{
HANDLE hThreads[2];

hThreads[0] = Thread(Producer, (LPVOID)NULL);
hThreads[1] = Thread(Consumer, (LPVOID)NULL);

Wait(2, hThreads);
return 0;
}
另外,团IDC网上有许多产品团购,便宜有口碑
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
7g18jxso7
2011-04-20 · TA获得超过1328个赞
知道小有建树答主
回答量:1442
采纳率:100%
帮助的人:0
展开全部
#include <windows.h>

typedef HANDLE HSEMAPHORE;

#define P(hHandle) ::WaitForSingleObject(hHandle, INFINITE)
#define V(hHandle) ::ReleaseSemaphore(hHandle, 1, NULL)
#define Semaphore(lInitial, lMaximum) ::CreateSemaphore(NULL, lInitial, lMaximum, NULL)
#define Thread(lpProc, lpParam) ::CreateThread(NULL, 0, lpProc, (LPVOID)lpParam, 0, NULL)
#define Wait(nCount, lpHandles) ::WaitForMultipleObjects(nCount, lpHandles, TRUE, INFINITE)

HSEMAPHORE n = Semaphore(0, 1);
HSEMAPHORE s = Semaphore(1, 1);
HSEMAPHORE e = Semaphore(100, 100);

UINT count = 0;

void Produce()
void Consume()

DWORD WINAPI Producer(LPVOID lpParameter)
{
while (true)
{
Produce();
P(e);
P(s);
count++;
printf("Producer: %d\n", count);
V(s);
V(n);
}
return 0;
}

DWORD WINAPI Consumer(LPVOID lpParameter)
{
while (true)
{
P(n);
P(s);
count--;
printf("Consumer: %d\n", count);
V(s);
V(e);
Consume();
}
return 0;
}

int main()
{
HANDLE hThreads[2];

hThreads[0] = Thread(Producer, (LPVOID)NULL);
hThreads[1] = Thread(Consumer, (LPVOID)NULL);

Wait(2, hThreads);
return 0;
}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
chensuchang
2011-04-19 · TA获得超过6400个赞
知道大有可为答主
回答量:6655
采纳率:50%
帮助的人:4976万
展开全部
如果你机器是多核的,建议你试一下opencv+openmp
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式