opencv怎么和我购买的采集卡sdk结合起来

qq_38242442 2018-04-27 11:37:03
同标题。
想要实现图像处理但是不会用。。
求指点
我的采集卡是 SV2000E
淘宝上买的 (https://detail.tmall.com/item.htm?id=543345840027&spm=a1z1r.7974869.0.0.269c3ad4isS3WF
问过说是可以用opencv之类的库
难道我是直接添加头文件就可以?
数据流什么的怎么转换呢。采集卡采集到的数据我要怎么通过opencv打开并处理?
求指点qwqqq
...全文
983 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
hhhh63 2018-05-03
  • 打赏
  • 举报
回复
SDK是一定要用的,不然读不到图像。读出来以后变成RGB数据,OpenCV就能用了。
qq_38242442 2018-05-02
  • 打赏
  • 举报
回复
引用 7 楼 phenix2009 的回复:
我是做相机的,客户也提过类似问题,以下给出我们的解决方案: 一般你如果用sdk应该可以获取到图片的数据矩阵buffer,宽高和bitcount,之后可以与opencv的mat类型进行转换:

#define MAKEWIDTHBYTES( PIXELW, BITCOUNT )      (((( BITCOUNT * PIXELW ) + 31) / 32) * 4)//计算4对齐一行的字节数

int ConvertKSJToOpencv3(unsigned char * pImageData, int nWidth, int nHeight, int nBitCount, Mat **ppcvImg)//ppcvImg在接口调用后需要释放
{
	int nLineByte = MAKEWIDTHBYTES(nWidth, nBitCount);//计算4对齐一行的字节数
	if (nBitCount == 8)//根据位图深度初始化Mat,构造函数为浅拷贝,随pImageData变化
	{
		*ppcvImg = new Mat(nHeight, nWidth, CV_8UC1, pImageData, nLineByte);
	}
	else if (nBitCount == 24)
	{
		*ppcvImg = new Mat(nHeight, nWidth, CV_8UC3, pImageData, nLineByte);
	}
	else if (nBitCount == 32)
	{
		*ppcvImg = new Mat(nHeight, nWidth, CV_8UC3, pImageData, nLineByte);
	}
	else
	{
		return -1;
	}

	flip(**ppcvImg, **ppcvImg, 0);
	**ppcvImg = (*ppcvImg)->clone();//深拷贝,ppcvImg不受pImageData影响
	return 0;
}

int ConvertOpnecv3ToKSJ(Mat cvImg, unsigned char ** ppImageData)//ppImageData在接口调用后需要释放
{
	if (cvImg.step[1] != 1 && cvImg.step[1] != 3 && cvImg.step[1] != 4)
	{
		return -1;
	}
	
	int nLineByte = MAKEWIDTHBYTES(cvImg.cols, cvImg.step[1] * 8);
	unsigned char * pTempData = new unsigned char[nLineByte * cvImg.rows];
	flip(cvImg, cvImg, 0);
	int nWidthByte = cvImg.cols * cvImg.step[1];
	for (int i = 0; i < cvImg.rows; i++)//深拷贝,ppImageData不受cvImg影响
	{
		memcpy(pTempData + i * nLineByte, cvImg.data + i * nWidthByte, nWidthByte);
	}

	*ppImageData = pTempData;
	return 0;
}
调用方式,获取图像数据pImageData,nCaptureWidth, nCaptureHeight, nCaptureBitCount,分别表示宽高位数,cvImg是mat类型:

//使用sdk获取图片宽高位
BYTE    *pImageData = new BYTE[nCaptureWidth * nCaptureHeight * (nCaptureBitCount >> 3)];
//使用sdk为pImageData赋值
Mat *cvImg = NULL;
	nRet = ConvertKSJToOpencv3(pImageData, nCaptureWidth, nCaptureHeight, nCaptureBitCount, &cvImg);
	if (nRet == 0)
	{
		imwrite("KSJToOpencv.bmp", *cvImg);
	}

	delete[] pImageData;
	pImageData = NULL;

	BYTE    *pKSJData = NULL;
	nRet = ConvertOpnecv3ToKSJ(*cvImg, &pKSJData);
        delete cvImg;
谢谢!我参考看看!!!
qq_38242442 2018-05-02
  • 打赏
  • 举报
回复
引用 8 楼 qq_42046820 的回复:
用SDK将图像数据采集到内存中,然后调用OpenCV函数即可处理内存中的图像数据呀。
我虽然也是这么想的,但是我不知道那个内存中的数据要怎么找到,以及数据存储形式似乎也不一样,不知道怎么转换到opencv可以用的形式
xuchen8917 2018-04-29
  • 打赏
  • 举报
回复
用SDK将图像数据采集到内存中,然后调用OpenCV函数即可处理内存中的图像数据呀。
赵4老师 2018-04-28
  • 打赏
  • 举报
回复
百度搜“视频流”
qq_38242442 2018-04-28
  • 打赏
  • 举报
回复
引用 2 楼 hhhh63 的回复:
用采集卡带的SDK接收图像,然后把图像传给opencv处理。
如果是保存下来以后再给opencv处理我知道要怎么做。但我想要实时对图像进行处理的话,我理解的是实时显示的图像信息应该是缓存在哪个内存里面,我要怎么把它调出来给opencv处理呢。
qq_38242442 2018-04-28
  • 打赏
  • 举报
回复
引用 1 楼 bluesen 的回复:
一般不用sdk,安装好后直接就可以用,相当于电脑的一个视频输入设备。
那我想添加一些功能怎么办。
白色一大坨 2018-04-28
  • 打赏
  • 举报
回复
我是做相机的,客户也提过类似问题,以下给出我们的解决方案: 一般你如果用sdk应该可以获取到图片的数据矩阵buffer,宽高和bitcount,之后可以与opencv的mat类型进行转换:

#define MAKEWIDTHBYTES( PIXELW, BITCOUNT )      (((( BITCOUNT * PIXELW ) + 31) / 32) * 4)//计算4对齐一行的字节数

int ConvertKSJToOpencv3(unsigned char * pImageData, int nWidth, int nHeight, int nBitCount, Mat **ppcvImg)//ppcvImg在接口调用后需要释放
{
	int nLineByte = MAKEWIDTHBYTES(nWidth, nBitCount);//计算4对齐一行的字节数
	if (nBitCount == 8)//根据位图深度初始化Mat,构造函数为浅拷贝,随pImageData变化
	{
		*ppcvImg = new Mat(nHeight, nWidth, CV_8UC1, pImageData, nLineByte);
	}
	else if (nBitCount == 24)
	{
		*ppcvImg = new Mat(nHeight, nWidth, CV_8UC3, pImageData, nLineByte);
	}
	else if (nBitCount == 32)
	{
		*ppcvImg = new Mat(nHeight, nWidth, CV_8UC3, pImageData, nLineByte);
	}
	else
	{
		return -1;
	}

	flip(**ppcvImg, **ppcvImg, 0);
	**ppcvImg = (*ppcvImg)->clone();//深拷贝,ppcvImg不受pImageData影响
	return 0;
}

int ConvertOpnecv3ToKSJ(Mat cvImg, unsigned char ** ppImageData)//ppImageData在接口调用后需要释放
{
	if (cvImg.step[1] != 1 && cvImg.step[1] != 3 && cvImg.step[1] != 4)
	{
		return -1;
	}
	
	int nLineByte = MAKEWIDTHBYTES(cvImg.cols, cvImg.step[1] * 8);
	unsigned char * pTempData = new unsigned char[nLineByte * cvImg.rows];
	flip(cvImg, cvImg, 0);
	int nWidthByte = cvImg.cols * cvImg.step[1];
	for (int i = 0; i < cvImg.rows; i++)//深拷贝,ppImageData不受cvImg影响
	{
		memcpy(pTempData + i * nLineByte, cvImg.data + i * nWidthByte, nWidthByte);
	}

	*ppImageData = pTempData;
	return 0;
}
调用方式,获取图像数据pImageData,nCaptureWidth, nCaptureHeight, nCaptureBitCount,分别表示宽高位数,cvImg是mat类型:

//使用sdk获取图片宽高位
BYTE    *pImageData = new BYTE[nCaptureWidth * nCaptureHeight * (nCaptureBitCount >> 3)];
//使用sdk为pImageData赋值
Mat *cvImg = NULL;
	nRet = ConvertKSJToOpencv3(pImageData, nCaptureWidth, nCaptureHeight, nCaptureBitCount, &cvImg);
	if (nRet == 0)
	{
		imwrite("KSJToOpencv.bmp", *cvImg);
	}

	delete[] pImageData;
	pImageData = NULL;

	BYTE    *pKSJData = NULL;
	nRet = ConvertOpnecv3ToKSJ(*cvImg, &pKSJData);
        delete cvImg;
bluesen 2018-04-28
  • 打赏
  • 举报
回复
引用 4 楼 qq_38242442 的回复:
引用 2 楼 hhhh63 的回复:
用采集卡带的SDK接收图像,然后把图像传给opencv处理。
如果是保存下来以后再给opencv处理我知道要怎么做。但我想要实时对图像进行处理的话,我理解的是实时显示的图像信息应该是缓存在哪个内存里面,我要怎么把它调出来给opencv处理呢。
建议你用opencv处理,什么都可以处理,没必要再用厂商的sdk了。 你这样也不是不行,就是麻烦一些。你可以用厂家sdk处理后再内存里给openc,就算用opencv采集,最后处理也是一桢一桢来的。
hhhh63 2018-04-27
  • 打赏
  • 举报
回复
用采集卡带的SDK接收图像,然后把图像传给opencv处理。
bluesen 2018-04-27
  • 打赏
  • 举报
回复
一般不用sdk,安装好后直接就可以用,相当于电脑的一个视频输入设备。

19,468

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 图形处理/算法
社区管理员
  • 图形处理/算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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