关于在windows,ubuntu,树莓派上安装使用opencv
1.Ubuntu系统上练习GDB调试
本节课,我们尝试运用GBD进行调试,首先创建一个test2,代码如下:
#include <stdio.h>
void ShowRevertNum(int iNum)
{
while (iNum > 10)
{
printf("%d", iNum % 10);
iNum = iNum / 10;
}
printf("%d\n", iNum);
}
int main(void)
{
int iNum;
printf("Please input a number :");
scanf("%d", &iNum);
printf("After revert : ");
ShowRevertNum(iNum);
}
很简单,是一个反转数字的函数,但是当输入值为100时,程序会输出错误,为了找到错误,本次我们会使用GDB进行找错.
首先,运行GDB,将test2放入GDB中
用list将函数显示完全
由于除法与输出比较重要,由于错误,所以设置他们两个为断电,方便实时观察
经分析,可能是由于100/10环节余数刚好为10,导致直接输出了出来,所以最终为010
2.ubuntu上opencv的安装与使用
2.1opencv的安装与环境配置
首先,强烈大家安装vmvare tools,它可以让你在虚拟机与本机之间互传文件以及互相复制粘贴。其次,opencv在国内下载比较慢,可以寻找其他方法下载,在电脑上下载完成后直接拖入了虚拟机中
(注:由于opencv压缩包为zip文件,可用zip解压语句解压)
unzip FileName.zip
等待它解压完毕后进入它的界面,安装cmake
sudo apt-get install cmake
使用命令依赖库
在opencv解压后的文件中创建一个build文件,并在build文件中
输入sudo make,开始下载
使用sudo make install执行命令
将OpenCV的库添加到路径,从而可以让系统找到
sudo gedit /etc/ld.so.conf.d/opencv.conf
进入后为一个空文件,在其中输入 /usr/local/lib,保存,退出
sudo ldconfig 可以使刚才的配置路径生效
接下来配置bash(与opencv的库一同在上个图)
sudo gedit /etc/bash.bashrc
在打开的文件的末尾加上
PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/usr/local/lib/pkgconfig export
PKG_CONFIG_PATH
输入以下代码,使配置生效并更新
source /etc/bash.bashrc
sudo updatedb
配置完成,如果有错误,可以查看这条博客(对我的帮助很大)
Ubuntu18.04安装opencv3.4.3
2.2 opencv对图片进行特效处理
创建一个test.cpp文件,代码如下
#include <opencv2/highgui.hpp>
#include <opencv2/opencv.hpp>
using namespace cv;
using namespace std;
int main(int argc, char** argv)
{
CvPoint center;
double scale = -3;
IplImage* image = cvLoadImage("lena.jpg");
argc == 2? cvLoadImage(argv[1]) : 0;
cvShowImage("Image", image);
if (!image) return -1; center = cvPoint(image->width / 2, image->height / 2);
for (int i = 0;i<image->height;i++)
for (int j = 0;j<image->width;j++) {
double dx = (double)(j - center.x) / center.x;
double dy = (double)(i - center.y) / center.y;
double weight = exp((dx*dx + dy*dy)*scale);
uchar* ptr = &CV_IMAGE_ELEM(image, uchar, i, j * 3);
ptr[0] = cvRound(ptr[0] * weight);
ptr[1] = cvRound(ptr[1] * weight);
ptr[2] = cvRound(ptr[2] * weight);
}
Mat src;Mat dst;
src = cvarrToMat(image);
cv::imwrite("test.png", src);
cvNamedWindow("test",1); imshow("test", src);
cvWaitKey();
return 0;
}
(随便找了张jpg图片,改名为lena.jpg)
g++ test.cpp -o test `pkg-config --cflags --libs opencv` //编译可执行文件
./test` //执行
最终效果:
原图效果
2.3opencv调用摄像头
进入 opencv-3.4.3samples/cpp/example_cmake ,打开命令栏输入以下命令
cmake .
make
./opencv_example
可以看到摄像头正常摄像,
在opencv文件中创建一个 test1.cpp,代码如下
#include <opencv2/opencv.hpp>
using namespace cv;
int main()
{
VideoCapture capture(0);
while(1)
{
Mat frame;
capture >> frame;
imshow("读取视频帧",frame);
waitKey(30);
}
system("pause");
return 0;
}
按照刚才相同的方法运行,可以看到视频帧运行成功
如果要求打开你硬盘上一个视频文件来播放,第7行该怎么修改呢,首先,让我们先看一下imread,imshow,waitkey的构成与作用
#include <opencv2/opencv.hpp>//opencv的头文件
using namespace cv;
int main()
{
Mat img = imread("C:/daima practice/opencv/mat3/mat3/image4.jpg",1);
/*注释
Mat可以理解为一个存储数据的容器,定义了一个img对象来存图片的数据。
imread参数1:引号里面的为图片路径,直接在电脑路径复制。这里注意复制出来后是右斜杠"\",我们程序要左斜杠。
imread参数2:如果写为1最后输出就显示原图,如果写为0,最后输出就显示灰度图。
*/
imshow("显示灰度图",img);
/*
参数1:显示图片的窗口名称。
参数2:储存图片数据的对象。
*/
waitKey(0);
/*等待按下函数:参数如果写负数或者0。当显示图片后,按下任意键后程序退出。如果参数写为3000就是3秒后程序自动退出。
*/
return 0;
}
联系以上,从而视频就很好达到
int main()
{
VideoCapture capture("1.avi");// VideoCapture为新类,捕获视频并显示出来
while (1)
{
Mat frame;
capture >> frame;
imshow("读取视频",frame);
waitKey(30);
}
return 0;
}
所以第7行可以改成
VideoCapture capture(“1.mp4”); //也可以为avi后缀
Mat为C++中一个多维数组,inmread控制着图片的输入,而imshow控制着图片的输出,waitkey顾名思义,控制着imshow展示的时间,如果没有watkey,imshow就会一闪而过,看不清任何东西
观察了参考代码2,其中键盘也控制着输入
#include<iostream>
#include <opencv2/opencv.hpp>
#include<opencv2/core/core.hpp>
#include<opencv2/highgui/highgui.hpp>
using namespace cv;
using namespace std;
int main()
{
//打开电脑摄像头
VideoCapture cap(0);
if (!cap.isOpened())
{
cout << "error" << endl;
waitKey(0);
return 0;
}
//获得cap的分辨率
int w = static_cast<int>(cap.get(CV_CAP_PROP_FRAME_WIDTH));
int h = static_cast<int>(cap.get(CV_CAP_PROP_FRAME_HEIGHT));
Size videoSize(w, h);
VideoWriter writer("RecordVideo.avi", CV_FOURCC('M', 'J', 'P', 'G'), 25, videoSize);
Mat frame;
int key;//记录键盘按键
char startOrStop = 1;//0 开始录制视频; 1 结束录制视频
char flag = 0;//正在录制标志 0-不在录制; 1-正在录制
while (1)
{
cap >> frame;
key = waitKey(100);
if (key == 32)//按下空格开始录制、暂停录制 可以来回切换
{
startOrStop = 1 - startOrStop;
if (startOrStop == 0)
{
flag = 1;
}
}
if (key == 27)//按下ESC退出整个程序,保存视频文件到磁盘
{
break;
}
if (startOrStop == 0 && flag==1)
{
writer << frame;
cout << "recording" << endl;
}
else if (startOrStop == 1)
{
flag = 0;
cout << "end recording" << endl;
}
imshow("picture", frame);
}
cap.release();
writer.release();
destroyAllWindows();
return 0;
}
用opencv编译上述代码
使用空格能改变视频录制状态,ESC键能够返回,比ctrl+c方便了不少
至此,ubuntu下的opencv安装与使用就到这里了,接下来是树莓派上opencv的开发与使用
3 windows安装opencv3.4.1
首先,点开电脑的高级设置,设置环境变量中的path,在末尾加上
E:\steam1\wuhu\opencv\build\x64\vc15\bin
注:上方为自己opencv的bin文件的位置
然后打开VS2017,创建一个空项目
然后在空项目中创建一个test.cpp,用来显示一张照片
#include <opencv.hpp>
using namespace cv;
int main()
{
Mat srcImage;
srcImage = imread("D://lww.jpg"); //放在D盘的一张小照片
imshow("图像", srcImage);
waitKey();
return 0;
}
在属性中找到VC++目录,修改包含目录
库目录
链接器->输入->添加依赖库
调试刚才的test1函数,图片出现
下为一个打开特效函数,能让打开的图片变暗(借鉴的别人的函数)
#include <highgui.hpp>
#include <opencv.hpp>
using namespace cv;
using namespace std;
int main(int argc, char** argv)
{
CvPoint center;
double scale = -3;
IplImage* image = cvLoadImage("D://Code//testResourses//testimg.jpg");//引入图片位置
argc == 2 ? cvLoadImage(argv[1]) : 0;
cvShowImage("Image", image);
if (!image) return -1; center = cvPoint(image->width / 2, image->height / 2);
for (int i = 0; i < image->height; i++)
for (int j = 0; j < image->width; j++) {
double dx = (double)(j - center.x) / center.x;
double dy = (double)(i - center.y) / center.y;
double weight = exp((dx*dx + dy * dy)*scale);
uchar* ptr = &CV_IMAGE_ELEM(image, uchar, i, j * 3);
ptr[0] = cvRound(ptr[0] * weight);
ptr[1] = cvRound(ptr[1] * weight);
ptr[2] = cvRound(ptr[2] * weight);
}
Mat src; Mat dst;
src = cvarrToMat(image);
cv::imwrite("test.png", src);
cvNamedWindow("test", 1); imshow("test", src);
cvWaitKey();
return 0;
}
4.树莓派使用opencv
树莓派上opencv安装与ubuntu安装相差无二,且室友已在旁边配置好了,所以就直接使用了。
5.总结
本次实验,我在windows,ubuntu,树莓派三个地方都使用了opencv,也看到了ubuntu中opencv如何调用的摄像头、三个系统中如何调用的图片,总的来说收获很大,期待下一次学习!