[问题] 请教thread与指标用法

楼主: Vvvahc (我来搞事了)   2022-01-10 18:36:06
开发平台(Platform): (Ex: Win10, Linux, ...)
win10/VS2019
编译器(Ex: GCC, clang, VC++...)+目标环境(跟开发平台不同的话需列出)
额外使用到的函数库(Library Used): (Ex: OpenGL, ...)
<opencv2> <pco.sdk>
问题(Question):
我本来使用opencv搭配相机(pco工业相机)的sdk , 希望在拍摄物体的当下,除了显示画
面外也能够及时储存每张图片
不过cpu速度很明显会下降很多,查了网络上的解法需要加入thread做处理.
我的思路是在int main 函式前使用class与public分别定义imshow与imwrite的行为
,再用thread来做加速. 不晓得这样做是否正确
还有一个问题是, 可能我对指标不是很熟…我在用下面语法写 public class时无法读取i
nt main的指标资讯, 希望各位大大能指点迷津
感谢
class test_thread{
public:
void cvshow( WORD Width, WORD Height, WORD buffer)
{
Width = &imgWidth; Height = & imgHeight; buffer = *imgBuffer;
cv::Mat cv_image;
cv_image = ( cv::Size(Width,Height), CV_16UC1, buffer)
imshow()
waitKey(1)
}
}
int main()
……
// 原始程式码(已简略), 目地是希望改成
// void cvshow()
// { cv: imshow }
// int main()
// { 读入相机资讯,并回传指标
// ex: imgWidth 、imgBuffer 给cvshow
// 做thread处理 }
程式码(Code):(请善用置底文网页, 记得排版,禁止使用图档)
#include "opencv.hpp"
#include "sc2_SDKStructures.h"
#include "PCO_Recorder_Defines.h"
using namespace std;
using namespace cv;
int main ( int argc , char*argv )
{
int acquireimage = 10;
// 从相机得到图片长、宽资讯
int iRet;
WORD imgWidth = 0, imgHeight = 0;
iRet = Pco_RecorderGetSetting( ...,&imgWidth,&imgHeight );
// 为图片分配内存
WORD *imgBuffer = NULL;
imgBuffer = new WORD[(__int64)imgWidth*(__int64)imgHeight];
iRet = RecorderGetStatus( ... );
while ( isRunning )
if ( imagecount > 0 )
{
iRet = ( ... , imgWidth, imgHeight,imgBuffer );
return ( imgWidth );
cv:: Mat cv_image;
cv_image = (cv:: Size( imgWidth , imgHeight ) , CV_16UC1 , imgBuffer , cv:: Ma
t :: AUTO_STEP );
cv:: nameWindow ( "image", CV_WINDOW_NORMAL );
imshow ( "image" , cv_image);
waitKey(1);
for (unsigned int i = 0; i < acquireimage; i++ )
{
string a = " C:/desktop/folder/img " + to_string(i) + ".tif" ;
imwrite( a ,cv_image )
}
}
return 0;
}
作者: nh60211as   2022-01-10 19:03:00
你这程式码编译边得过吗
楼主: Vvvahc (我来搞事了)   2022-01-10 19:08:00
下面程式码(为方便阅读有简略过)是可以执行且顺利显示的(但我imwrite的写法会很卡), 不过当我要改成有thread的写法就会出问题…主要是想问如何在上方的class : void()中,去读取下方intmain()中的指标资讯
作者: ko27tye (好滋好滋)   2022-01-10 20:25:00
呃 把你的指标当参数传进去阿
作者: sarafciel (Cattuz)   2022-01-10 21:05:00
先不讲传参的问题 你用来起thread的程式码呢
作者: lycantrope (阿宽)   2022-01-10 22:24:00
到底在写什么啊wnameWindow可以移出while 只留下imshowwaitkey是millisecond,你应该不需要1000fps imshow然后opencv有startWindowThread可以让视窗thread
作者: henrylin8086 (小木)   2022-01-15 11:56:00
先说thread要能加速,建立在你task能平行化上。不能的话,用thread是把task给其他thread做,这样才不会卡main thread。速度不会被提升,但是程式不会被卡住。你可以把main里的指标传进去给class,比较粗糙的写法就是直接assign,在main里面Class.ptr_inClass =ptr_inMain,但是要小心多执行绪的时序问题。
楼主: Vvvahc (我来搞事了)   2022-01-25 11:11:00
我主要是打算让每张拍摄的照片能吐出到硬盘资料夹中我有试着照h大的做法 不过在拆出来的function中,我遇到相机buffer的ptr会报错exception thrown有点怀疑是不是我buffer ptr型态写错的问题…
作者: Lipraxde (Lipraxde)   2022-02-06 04:08:00
Backtrace 看一看,debug 加油

Links booklink

Contact Us: admin [ a t ] ucptt.com