新建一个 gbdtest.c 文件,并通过gcc指令生成gbdtest文件,gbdtest.c代码如下
#include
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);
}
指令:
gcc -o gdbtest -g gdbtest.c
tips:万万不可少加 -g 否则无法调试
接下来利用gdb调试该程序,图片很清晰,就不贴出指令段了
新建一个 duantest.c 文件,进行段错误调试,源代码如下
#include
#include
#define BUFSIZE 256
static char acBuf[BUFSIZE];
static char *pStr;
int main(void)
{
printf("please input a str:");
gets(pStr);
printf("\nU str is:%s\n", pStr);
}
如同例1,对duantest.c文件进行编译
直接执行后,可看到系统报错 “段错误 (核心已转储)”,接下来就开始进入gdb调试
在 OpenCV 的官网获取 Windows版 和 Sources版 (之后在Ubuntu系统中要使用Sources版)
下载好 Windows版 后,直接运行安装程序
tips:安装完成后,需要配置系统环境变量:在path中添加以下路径:“X:\…\opencv3XX\opencv\build\x64\vc15\bin”
在VS中新建一个Visual C++空项目,这个项目就用来编写我们第一个OpenCV程序,但我们首先要配置它的环境。
在工程文件中新建一个 test.cpp 项
顺便把Debug类型调为x64
在 “属性管理器–>配置属性” 中修改 “包含目录” , “库目录” , “连接器/输入/添加依赖项”
这些路径都存在于OpenCV的安装路径下,修改好之后,就算是将工作环境搭建好了。
现在借鉴一个例子,目的是将照片灰度改变并显示,并自动保存改变灰度后的图片到项目工程文件夹中。
代码如下:
#include
#include
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;
}
程序成功运行,并保存了改变灰度后的图片
将之前下载好的 OpenCV Sources版 的压缩文件拷贝到Ubuntu系统下
unzip opencv-3.4.8sourcestype.zip
进入解压好的文件夹中,再创建一个编译文件夹,进入文件夹开始配置
mkdir build_dir
cd build_dir
执行 cMake 指令
cmake -D CMAKE_BUILD_TYPE=Release -D CMAKE_INSTALL_PREFIX=/usr/local …
sudo make
tips:这一步可以写成 “sudo make -j4” 意为使用四线程进行编译,速度会很快
sudo make install
等待完成后,我们就成功的安装了OpenCV,接下来我们配置OpenCV的编译环境
首先将OpenCV的库添加到系统路径
键入命令
sudo gedit /etc/ld.so.conf.d/opencv.conf
打开文件后添加一句
/usr/local/lib
sudo ldconfig
让刚才的配置路径生效
接下来键入命令配置bash
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
tips:这一步很可以出现 “找不到命令 updatedb” 的错误,但是实测对之后的运行过程并无影响,最好还是参考
ubuntu命令updatedb报错: command not found解决方案
将错误解决
至此,环境配置结束,环境配置过程中可能出现许多问题,我给大家分享一些参考资料:
1.在 Ubuntu系统下安装 OpenCV 全过程
2.【嵌入式】Windows10&Ubantu16.04&树莓派3B+安装opencv教程
3.Linux配置OpenCV遇到的头文件路径的问题
4.ubuntu18.04 安装OpenCV3.4.1踩坑过程
紧接上一个过程,接下来用一个如同 2.1.2 的例子测试OpenCV
在 opencv-3.4.8 下新建文件夹 /test ,在 /test 文件夹下新建一个 test.cpp 文件,贴上以下代码
#include
#include
using namespace cv;
using namespace std;
int main(int argc, char** argv)
{
CvPoint center;
double scale = -3;
IplImage* image = cvLoadImage("testimg.jpg");
//CV时不要忘记修改自己的图片名字
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;
}
mv testimg.jpg /home
接下来使用 gcc(g++) 编译即可成功得到test文件,直接运行 test 文件可成功得到结果
g++ test.cpp -o test
pkg-config --cflags --libs opencv
./test
首先用 Ubuntu 自带的 Cheess(茄子) 软件测试一下摄像头是否正常工作,若不是,请参考这里
借鉴 Ctrl C +V 一个开启摄像头并录制视频的例子,给它起名叫camtest.cpp
#include
#include
#include "highgui.h"
#include
#include
#include
//#include
//#include
//#include
//#include
//#include
//#include
using namespace cv;
int main( int argc, char** argv )
{
printf("I am start \n");
VideoCapture cap(0); // open the default camera
if(!cap.isOpened()) // check if we succeeded
return -1;
printf("%f, %f\n",cap.get(CV_CAP_PROP_FRAME_WIDTH),cap.get(CV_CAP_PROP_FRAME_HEIGHT));
cap.set(CV_CAP_PROP_FRAME_WIDTH, 320);
cap.set(CV_CAP_PROP_FRAME_HEIGHT, 240);
cap.set(CV_CAP_PROP_FPS, 15);
printf("%f, %f\n",cap.get(CV_CAP_PROP_FRAME_WIDTH),cap.get(CV_CAP_PROP_FRAME_HEIGHT));
Mat src_gray;
cvNamedWindow( "video", CV_WINDOW_AUTOSIZE );
while(1)
{
Mat frame;
cvWaitKey(10);
cap >> frame;
imshow("video", frame);
}
return 0;
}
键入指令编译生成可执行文件 camtest ,运行它
gcc camtest.cpp -o camtest
pkg-config --cflags --libs opencv
./camtest
由于没有在 树莓派3B+ 上安装截图的工具,我仅仅贴上了运行结果的照片,安装 OpenCV 和配置环境的过程都与 Ubuntu 相仿,编译程序过程也是按部就班,所以请参照2.2的部分