Ubuntu opencv环境搭建 编译opencv4 静态编译opencv4 TensorFlow 集成等

本文详细记录了在Ubuntu环境下将OpenCV4从Python版本迁移到C++,包括环境配置、静态库的编译过程,以及遇到的问题和解决办法。通过编译静态库避免了动态库的依赖问题,并提供了图像检测的C++代码示例。
摘要由CSDN通过智能技术生成

这两天 公司有个需求 需要将原来的python写的图像检测功能改成C++版本

之前只是听过opencv 没怎么实际用过,这两天经过一番百度 摸索 终于搭建好了环境

由于之前嵌入式的开发经验,习惯于将这些第三方的库什么的编译成静态库 即.a文件

opencv4 比较折腾,原以为很简单,实际开发过程中 还是很折腾的 ,乘这机会,重新梳理下流程:

1,安装到系统中带GUI,去官网下载opencv4 下面写英文的原因是因为之前在linux下面 写的没有中文输入法,将就看哈

Download essential packages:

sudo apt-get install build-essential cmake git libgtk2.0-dev pkg-config libavcodec-dev libavformat-dev libswscale-dev

If you need more functions: install following packages:

sudo apt-get install python-dev python-numpy python3-dev python3-numpy
sudo apt-get install libtbb2 libtbb-dev libjpeg-dev libpng-dev libtiff-dev libjasper-dev libdc1394-22-dev

OpenCV offical site: OpenCV(4.5.5)

下载完之后 解压进入主目录新建build文件夹 新建build.sh 内容如下:(这里是安装到系统环境中了,后面会有另一种编译成静态库的时候是不一样的 这里注意 PREFIX目录会后一定要 空格 然后.. 不然会报错)GTK那个是可以和GUI相关的功能,不需要的话可以不编译,我后面的静态编译就关闭了 不然会报很多找不到GTK函数的错误

cmake -D CMAKE_BUILD_TYPE=RELEASE 	\
	-D OPENCV_GENERATE_PKGCONFIG=ON \
	-D WITH_GTK=ON \
	-D WITH_GTK_2_X=ON \
	-D CMAKE_INSTALL_PREFIX=/usr/local ..

保存 添加可执行权限 执行脚本./build.sh

make -j4

sudo make install

这里之后头文件会安装到/usr/local/include/opencv4 此目录下有个opencv2文件夹

由于很多头文件引用找不到这个opencv4 所以openvcv2拷出来放到/usr/local/include目录下

Then create a new file /etc/ld.so.conf.d/opencv.conf  content is:

/usr/local/lib

Then  execute : sudo ldconfig

Test  install write or not:

pkg-config --libs opencv4 和 pkg-config --cflags opencv4

新建一个test.cpp 内容如下

#include <opencv2/highgui.hpp>
#include <opencv2/opencv.hpp>
#include "opencv2/imgproc.hpp"

using namespace cv;
using namespace std;


int show_img()
{
	Mat img;
	img = cv::imread("mth.jpg");
	
	if(img.data == NULL)
	{
		printf("Image not exist\n");
		return -1;
	}

	cv::namedWindow("edges", cv::WINDOW_AUTOSIZE);
	cv::imshow("Display image",img);

	waitKey(0);
	return 0;
	
}


int main(int argc, char** argv)
{
	show_img();
	return 0;
}

New a build.sh file  content is :

g++ -std=c++11 ./test.cpp -o test `pkg-config --cflags --libs opencv4`

我的提示了没有GTK  需要安装一些列依赖包

 sudo apt-get install cmake git libgtk2.0-dev pkg-config libavcodec-dev libavformat-dev libswscale-dev

If ok  execture  ./test  it will display a image file like this:

2.编译成静态库:不需要GUI 

这里新建另一个build_staitc.sh脚本 内容如下:

cmake -D CMAKE_BUILD_TYPE=RELEASE 	\
	-D BUILD_SHARED_LIBS=OFF	\
	-D BUILD_JPEG=ON	\
	-D BUILD_PNG=ON	\
	-D BUILD_TIFF=ON	\
	-D WITH_GTK=OFF	\
	-D WITH_GTK_2_X=OFF	\
	-D CMAKE_INSTALL_PREFIX=/home/jason/Downloads/opencv-4.5.5/ubuntu ..

中间有很多坑 做如下配置即可成功编译 引用 

直接复制我的编译配置,./build_static.sh  

make -j4    sudo make install  

之后可以发现在ubuntu目录下已经生成了个lib库include头文件等需要的东西 如下图:

然后写一个makefile 内容如下  :(ubuntu名字后来被我改成opencv4了 所以下面的目录名字都变了)

CC = g++
EXEC = main
OBJS = test.o

CUR_PATH = $(PWD)

FLAGS = -std=c++11 -O2 -W -Wall  
FLAGS += -I../opencv4/include/opencv4


LDFLAGS = -L../opencv4/lib/libopencv_calib3d.a
LDFLAGS += ../opencv4/lib/libopencv_core.a
LDFLAGS += ../opencv4/lib/libopencv_dnn.a
LDFLAGS += ../opencv4/lib/libopencv_core.a
LDFLAGS += ../opencv4/lib/libopencv_features2d.a
LDFLAGS += ../opencv4/lib/libopencv_flann.a
LDFLAGS += ../opencv4/lib/libopencv_gapi.a
LDFLAGS += ../opencv4/lib/libopencv_highgui.a
LDFLAGS += ../opencv4/lib/libopencv_imgcodecs.a
LDFLAGS += ../opencv4/lib/libopencv_imgproc.a
LDFLAGS += ../opencv4/lib/libopencv_ml.a
LDFLAGS += ../opencv4/lib/libopencv_objdetect.a
LDFLAGS += ../opencv4/lib/libopencv_photo.a
LDFLAGS += ../opencv4/lib/libopencv_stitching.a
LDFLAGS += ../opencv4/lib/libopencv_video.a
LDFLAGS += ../opencv4/lib/libopencv_videoio.a
LDFLAGS += ../opencv4/lib/opencv4/3rdparty/libade.a
LDFLAGS += ../opencv4/lib/opencv4/3rdparty/libIlmImf.a
LDFLAGS += ../opencv4/lib/opencv4/3rdparty/libippicv.a
LDFLAGS += ../opencv4/lib/opencv4/3rdparty/libippiw.a
LDFLAGS += ../opencv4/lib/opencv4/3rdparty/libittnotify.a
LDFLAGS += ../opencv4/lib/opencv4/3rdparty/liblibopenjp2.a
LDFLAGS += ../opencv4/lib/opencv4/3rdparty/liblibprotobuf.a
LDFLAGS += ../opencv4/lib/opencv4/3rdparty/liblibtiff.a
LDFLAGS += ../opencv4/lib/opencv4/3rdparty/liblibwebp.a
LDFLAGS += ../opencv4/lib/opencv4/3rdparty/libquirc.a
LDFLAGS += ../opencv4/lib/opencv4/3rdparty/liblibjpeg-turbo.a
LDFLAGS += ../opencv4/lib/opencv4/3rdparty/liblibpng.a

LDFLAGS += -lz -ldl -lm -lpthread -lrt

TARGET = main

SMP_SRCS = test.cpp

OBJS  := $(SMP_SRCS:%.c=%.o)

CFLAGS += $(FLAGS)


MPI_LIBS = $(LDFLAGS)

.PHONY : clean all

all: $(TARGET)

$(TARGET):$(OBJS)
	@$(CC) $(CFLAGS) -o $@ $^ -Wl,--start-group $(MPI_LIBS) 	\
	 -Wl,--end-group,-gc-sections,-g
	

clean:
	#@rm -f $(TARGET_PATH)/$(TARGET)
	@rm -f $(OBJS)
	@rm -f $(COMM_OBJ)

 直接make 就可以了 

附上一段检测图片中蓝色部分的代码  静态库去掉GTK 所以 imshow就不能用了 只有命令行,如果是带GTK功能的话 会显示出图片  如下图 (但是最终我们只需要检测结果不需要显示):

int detect_blue( int argc, char** argv )
{
	Mat srcImage;


	if (argc > 1)
	{
		srcImage = imread(argv[1]);		
	}
	else
	{
		srcImage = imread("blue.webp");		
	}

	if (!srcImage.data)
	{
		cout << "No data"<<endl;
		system("pause");
		return -1;
	}
//	imshow("Source image", srcImage);

//	Mat srcGray;
//	cvtColor(srcImage, srcGray, COLOR_RGB2GRAY);
//	imshow("Grey image", srcGray);


//	double scale = 0.5;
	Size dstsize = Size(150,150);
	//cv::Scalar
	Mat scaleimg = Mat(dstsize,CV_32S);
	cv::resize(srcImage,scaleimg,dstsize);
	//imshow("Grey image", scaleimg);


	Mat dstImage; //BGR order
	cv::inRange(scaleimg, Scalar(160,0, 0), Scalar(250,80, 80), dstImage);
	//imshow("Range image", dstImage);
 
	int blue_count = cv::countNonZero(dstImage);
	int total = dstImage.cols*dstImage.rows;

	float blue_ratio = (float)blue_count/total;
	printf("blue =%d total =%d ratio = %f\n",blue_count,total,blue_ratio);

	if(blue_ratio > 0.4)
	{
		cout<<"Blue image detected"<<endl;
	}
	else
	{
		cout<<"Not blue image"<<endl;		
	}


 	//sleep(1);
	//waitKey(0);

	return 0;
}

今天先写到这 

TensorFlow git 地址

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

QMCY_jason

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值