VS2015+Qt+OpenCV+open62541开发过程(04_VS2015读取海康威视工业相机-方法2 利用OpenCV直接读取海康相机)

参考文章连接:

http://t.csdn.cn/xw4ke

http://t.csdn.cn/3G2Y2

Opencv接口

使用 opencv 的官方接口 VideoCapture() 接口直接调用海康工业相机,

VideoCapture() 这个接口的作用:获取本地目录下的视频文件或者使用本电脑的摄像头获取实时数据;使用该接口调用海康工业相机;

海康工业相机使用 cv2.VideoCapture()调用,需提前注册海康提供的directshow 插件,保证使用directshow 可以发现并打开海康相机

directshow 插件的安装步骤如下:

管理员权限运行: InstallDSSvc_x64.bat 脚本

安装GraphEdit,这个软件为了方便查看相机号,相机号对应着cv2.VideoCapture(x),其中x为数字代表第几个相机

打开GraphEdit,点击工具栏蓝色长方形方块,弹出窗口点Video Capture Source即可看到电脑所连接的相机,此处可以看到Hikrobot相机型号及序列号。此处显示的顺序从上到下为0、1、2等等。即使用cv2.VideoCapture(x)函数调用摄像头时对应的x数值。如:此实验只有一个相机,所以程序中调用相机程序为capture = VideoCapture(0);

此方法中VS工程属性中不需要添加MVS的东西

在main.cpp中输入附件中代码,main函数中按顺序程序功能:

  1. 定义Mat类型变量,定义显示窗口
  2. 打开摄像头,设置图像尺寸及帧率(图像尺寸,即宽和高的像素数、帧率可以通过MVS连上相机查看)
  3. 从摄像头抓取一帧
  4. 将颜色空间转换为HSV,并通道分离
  5. 窗口显示
  6. 关闭窗口
  7. 释放摄像头
// test01.cpp : 定义控制台应用程序的入口点。

#include "stdafx.h"
#include <iostream>
#include<windows.h>   //使用Sleep(1000)延时函数头文件
#include <stdio.h>
#include <process.h>
#include <conio.h>
#include "string.h"

#include <opencv2/opencv.hpp>   //opencv头文件
#include<opencv2/core.hpp>
#include<opencv2/imgproc.hpp>
#include<opencv2/highgui.hpp>
#include<opencv2/videoio.hpp>

using namespace std;  //使用命名空间
using namespace cv;

/*声明全局变量*/
VideoCapture capture;

/*主函数*/
int main()
{
	Mat img;
	Mat hsv;
	Mat hsvsplit[3];
	cv::namedWindow("test", WINDOW_FREERATIO);
	cv::namedWindow("test1", WINDOW_FREERATIO);
	cv::namedWindow("test2", WINDOW_FREERATIO);
	cv::namedWindow("test3", WINDOW_FREERATIO);
	cv::namedWindow("test4", WINDOW_FREERATIO);
	
	capture = VideoCapture(0); //打开摄像头
	capture.set(CAP_PROP_FRAME_WIDTH, 2448);  // 设置图像宽度
	capture.set(CAP_PROP_FRAME_HEIGHT, 2048);  // 设置图像高度
	capture.set(CAP_PROP_FPS, 5);  // 设置帧率
	if (!capture.isOpened())
	{
		cout << "open camera failed." << endl;		
		capture.release();
		return 0;
	}
	
	capture >> img;  //读取视频流中的一帧,写入img		
	cv::cvtColor(img, hsv, COLOR_BGR2HSV);		
	cv::split(hsv, hsvsplit);

	cv::imshow("test", img);    //在窗口显示一张图片
	cv::imshow("test1", hsv);
	cv::imshow("test2", hsvsplit[0]);
	cv::imshow("test3", hsvsplit[1]);
	cv::imshow("test4", hsvsplit[2]);	

	cv::waitKey(0);          //等待键盘按下,再执行后面的程序
	destroyAllWindows();
	capture.release();
	return 0;
}

按Ctrl+F5调试运行如下图,可以看到与利用海康威视提供的SDK读取摄像头效果相同。

总结:

如上整个过程,即可完成使用 cv2.VideoCapture()接口对海康工业相机的调用,并通过 opencv 接口对图像数据进行显示。

此方法最大的优点是代码简单。

用opencv直接读取的方法与利用海康威视SDK读取的方法相比有一定的局限性的

如多相机的使用,如果有相机掉线,相机顺序号会自动变化,调用相机会出现混乱,需要解决,目前没有找到好的方法;相机参数设置可能不能通过程序修改,本实验的相机参数都是通过MVS软件设置的。

 

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值