1.opencv调用电脑摄像头
在利用opencv做视频处理时,我们可以直接调用电脑摄像头,也可以读取视频数据来做处理,opencv也提供了相应的链接库。
int cameraNumber = 0;
if (argc>1)
cameraNumber = atoi(argv[1]);//get camera number
printf(“photo Number=%d”, cameraNumber);
cv::VideoCapture camera;
camera.open(cameraNumber); //open the camera by cameraNumber:0
if (!camera.isOpened()) //checkout the camera equipment
{
std::cout << “ERROPR” << endl;
exit(1);
}
2.视频拼接:
在利用电脑监控多台摄像头设备时,通常会看到在电脑屏幕上同时显示了对个摄像头的场景画面,我们可以利用“定义兴趣区域”的方式来实现视频数据拼接。
具体实现方法:视频数据可以理解成连续的图像数据来处理,首先我们可以创建一个空白图像,再将视频数据转化成图像数据,经过缩放至合适的尺寸,以“定义兴趣区域”的方式,将图片移至我们建立的空白图像,通过循环的获取视频图像,显示拼接好的图像,就可以动态的查看多个摄像头或视频了,示意图如图所示
工程实例:
1. 打开电脑摄像头
2. 读取视频数据
3. 将摄像头、视频数据转化成图像数据
4. 进行图像拼接(图像基本处理,图像缩放)
5. 显示拼接好的图片,达到视频拼接的效果
实例效果(本人长相“平平无奇”,用了一点小技巧给处理了一下):
效果展示:(在自己电脑上运行时将看到的是实时的视频显示)
示例代码:
#include <iostream>
#include <opencv2/opencv.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
using namespace std;
void colorBinary(const cv::Mat orig_image, cv::Mat &mod_image, int R_THRE = 120, int G_THRE = 100, int B_THRE = 100)
{
int nl = orig_image.rows;
int nc = orig_image.cols;// *mod_image.channels();
//std::cout << "rows=" << nl << "clos=" << nc << endl;
cv::Mat testImage(nl, nc, CV_8UC3, cv::Scalar(0, 0, 255));
//mod_image = testImage;
for (int i = 0; i < nl; i++)
{
for (int j = 0; j < nc; j++)
{
if (orig_image.at<cv::Vec3b>(i, j)[0] > B_THRE&&
orig_image.at<cv::Vec3b>(i, j)[1] > G_THRE&&
orig_image.at<cv::Vec3b>(i, j)[2] > R_THRE
)
{
testImage.at<cv::Vec3b>(i, j)[0] = 255;
testImage.at<cv::Vec3b>(i, j)[1] = 255;
testImage.at<cv::Vec3b>(i, j)[2] = 255;
}
else
{
testImage.at<cv::Vec3b>(i, j)[0] = 0;
testImage.at<cv::Vec3b>(i, j)[1] = 0;
testImage.at<cv::Vec3b>(i, j)[2] = 0;
}
}
}
mod_image = testImage;
}
int main(int argc, char *argv[])
{
cv::Mat source;
cv::Mat image;
cv::Mat cameraFrame;
cv::Mat showImage;
cv::Mat imagebuf[4];
cv::Mat turns;
int cameraNumber = 0;
if (argc>1)
cameraNumber = atoi(argv[1]);//get camera number
printf("photo Number=%d", cameraNumber);
cv::VideoCapture camera;
camera.open(cameraNumber); //open the camera by cameraNumber:0
if (!camera.isOpened()) //checkout the camera equipment
{
std::cout << "ERROPR" << endl;
exit(1);
}
cv::VideoCapture cap;
cap.open("video2.mp4");
if (!cap.isOpened())
{
cout << "can't open mp4 file" << endl;
}
while (1)
{
cap >> source;
if (source.empty())
{
cout << "error mp4" << endl;
}
/*image size setting*/
cv::resize(source, source, cv::Size(source.cols/ 2, source.rows /1.5 ));
camera >> cameraFrame;
if (cameraFrame.empty())
{
cout << "error!" << endl;
exit(1);
}
/*transform video data into image data*/
cv::cvtColor(cameraFrame, imagebuf[0], 1);
cv::cvtColor(cameraFrame, imagebuf[1], 1);
cv::cvtColor(source, imagebuf[2], 1);
cv::cvtColor(source, imagebuf[3], 1);
cv::Mat windowShow(960, 1280, CV_8UC3, cv::Scalar(0, 0, 255));
cv::threshold(imagebuf[0], imagebuf[0], 70, 255, CV_THRESH_BINARY);
cv::Mat imageROI0(windowShow, cv::Rect(0, 0, imagebuf[0].cols, imagebuf[0].rows));
imagebuf[0].copyTo(imageROI0);
cv::GaussianBlur(imagebuf[1], imagebuf[1], cv::Size(5, 5), 0);
//RGB image binarization processing
colorBinary(imagebuf[1], turns,70,50,43);
cv::Mat imageROI1(windowShow, cv::Rect(0, imagebuf[0].rows, imagebuf[0].cols, imagebuf[0].rows));
turns.copyTo(imageROI1);
cv::Mat imageROI2(windowShow, cv::Rect(imagebuf[0].cols, 0, imagebuf[0].cols, imagebuf[0].rows));
imagebuf[2].copyTo(imageROI2);
cv::GaussianBlur(imagebuf[3], imagebuf[3], cv::Size(5, 5), 0);
colorBinary(imagebuf[3], turns,72,58,66);
cv::Mat imageROI3(windowShow, cv::Rect(imagebuf[0].cols, imagebuf[0].rows, imagebuf[0].cols, imagebuf[0].rows));
turns.copyTo(imageROI3);
//scale to the appropriate display pixel
cv::resize(windowShow, showImage, cv::Size(windowShow.cols / 1.4, windowShow.rows / 1.4));
cv::namedWindow("windowShow");
cv::imshow("windowShow", showImage);
char key = cv::waitKey(100);
if (key == 27) //press the ESC button and exit the paly!
{
cout << "ESC !!!" << endl;
exit(0);
}
}
}