如何在mfc多文档中利用多线程打开usb摄像头,可以使用opencv函数库

Mr_Zhouzl 2016-12-16 12:04:58
可以使用c++11

void CImgProcDoc::OnCamopen()
{
// TODO: 在此添加命令处理程序代码
std::thread t1(OpenCam,this);
t1.detach();
//std::thread t2(CannyCam, this);
//t2.detach();
}


void OpenCam(LPVOID lpParam)
{
cv::VideoCapture cap(0);
cv::Mat frame;
while (cap.isOpened())
{
cap >> frame;
if (frame.empty())
break;
//cv::imshow("imgCanny", frame);
cv::waitKey(30);
}
}

第二部分怎么编写,要在文档视图中重绘,已经定义了Cvvimage m_image
...全文
948 33 打赏 收藏 转发到动态 举报
写回复
用AI写文章
33 条回复
切换为时间正序
请发表友善的回复…
发表回复
gx_999 2017-03-14
  • 打赏
  • 举报
回复
想问一下题主,你在子线程进行opencv的相关操作(调用opencv函数)实现了没?最近在做相关的东西,有些操作不放在子线程就是可以的,但一放到子线程就出错。网上搜了一下,很多说opencv的一些函数只能在主线程调用,不能在工作线程调用。。。
Mr_Zhouzl 2016-12-21
  • 打赏
  • 举报
回复
现在自定义结构体CamPara中的Cvvimage类m_image已经能正确赋值了,现在怎么绘制这个变量?
Mr_Zhouzl 2016-12-21
  • 打赏
  • 举报
回复

现在m_image已经获得数据了,现在应该怎么重绘啊?
赵4老师 2016-12-21
  • 打赏
  • 举报
回复
Multiple Threads in the User Interface http://msdn.microsoft.com/zh-cn/library/ms810439.aspx 崩溃的时候在弹出的对话框按相应按钮进入调试,按Alt+7键查看Call Stack即“调用堆栈”里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处,看不懂时双击下一行,直到能看懂为止
向立天 2016-12-21
  • 打赏
  • 举报
回复
引用 14 楼 qq_21400315 的回复:
加上了一个结构体用this作为输入参数,不过出现冲突
不是this指针有问题
Mr_Zhouzl 2016-12-21
  • 打赏
  • 举报
回复
向立天 2016-12-21
  • 打赏
  • 举报
回复
引用 29 楼 qq_21400315 的回复:
我想把这个操作直接在线程中完成,就是在线程中直接重绘
工作线程中不应该进行界面操作 你这个想法从根本上就是错误的
Mr_Zhouzl 2016-12-21
  • 打赏
  • 举报
回复
全局变量的话应该需要互斥锁,能不能再picturebox那样使用?
Mr_Zhouzl 2016-12-21
  • 打赏
  • 举报
回复
我想把这个操作直接在线程中完成,就是在线程中直接重绘
Mr_Zhouzl 2016-12-21
  • 打赏
  • 举报
回复
线程必须是静态函数,所以无法使用类成员变量的
向立天 2016-12-21
  • 打赏
  • 举报
回复
引用 26 楼 qq_21400315 的回复:
最关键的是在线程中获得的Cvvimage怎么传到ondraw中去
我以为你在线程中获取的Cvvimage就是OnDraw所在的view类的成员变量,直接用就是了 如果现在不是那就把它声明在view类中在通过线程获取 或者通过全局变量过度 或者序列化之后写文件然后发消息给view读取这个文件 方法很多啊
Mr_Zhouzl 2016-12-21
  • 打赏
  • 举报
回复
最关键的是在线程中获得的Cvvimage怎么传到ondraw中去
Mr_Zhouzl 2016-12-21
  • 打赏
  • 举报
回复
mfc多文档只有ondraw没有onpaint
向立天 2016-12-21
  • 打赏
  • 举报
回复
引用 23 楼 qq_21400315 的回复:
现在自定义结构体CamPara中的Cvvimage类m_image已经能正确赋值了,现在怎么绘制这个变量?
和绘制相关的代码都要整理到OnPaint中 需要重绘的时候使绘制窗口调用Invalidate即可
赵4老师 2016-12-20
  • 打赏
  • 举报
回复
可以将临时文件放在RamDisk上提高效率减少磨损磁盘。
Mr_Zhouzl 2016-12-20
  • 打赏
  • 举报
回复
这样做的话会增加一个读写硬盘的操作
Mr_Zhouzl 2016-12-20
  • 打赏
  • 举报
回复
Mr_Zhouzl 2016-12-20
  • 打赏
  • 举报
回复

我加了这一句还是相同的问题。
Mr_Zhouzl 2016-12-19
  • 打赏
  • 举报
回复
加上了一个结构体用this作为输入参数,不过出现冲突
赵4老师 2016-12-19
  • 打赏
  • 举报
回复
不要做A语言代码修改为B语言代码的无用功。 也不要做用A语言代码直接调用B语言代码库这样复杂、这样容易出错的傻事。 只需让A、B语言代码的输入输出重定向到文本文件,或修改A、B语言代码让其通过文本文件输入输出。 即可很方便地让A、B两种语言之间协调工作。 比如: A将请求数据写到文件a.txt,写完后改名为aa.txt B发现aa.txt存在时,读取其内容,调用相应功能,将结果写到文件b.txt,写完后删除aa.txt,改名为bb.txt A发现bb.txt存在时,读取其内容,读完后删除bb.txt 以上A可以替换为任何一种开发语言或开发环境,B可以替换为任何一种与A不同的开发语言或开发环境。 除非A或B不支持判断文件是否存在、文件读写和文件更名。 但是谁又能举出不支持判断文件是否存在、文件读写和文件更名的开发语言或开发环境呢? 可以将临时文件放在RamDisk上提高效率减少磨损磁盘。 数据的结构很复杂的话,文本文件的格式问题可参考json或xml 共享临时文本文件这种进程之间的通讯方法相比其它方法的优点有很多,下面仅列出我现在能想到的: ·进程之间松耦合 ·进程可在同一台机器上,也可跨机,跨操作系统,跨硬件平台,甚至跨国。 ·方便调试和监视,只需让第三方或人工查看该临时文本文件即可。 ·方便在线开关服务,只需删除或创建该临时文本文件即可。 ·方便实现分布式和负载均衡。 ·方便队列化提供服务,而且几乎不可能发生队列满的情况(除非硬盘空间满) ·…… “跨语言、跨机,跨操作系统,跨硬件平台,跨国,跨*.*的”苦海无边, 回头是“使用共享纯文本文件进行信息交流”的岸! 无profiler不要谈效率!!尤其在这个云计算、虚拟机、模拟器、CUDA、多核 、多级cache、指令流水线、多种存储介质、……满天飞的时代!
加载更多回复(13)

15,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧