做毕设接触的树莓派,查了很多资料,成功做出一个小项目,在本文总结自己的学习过程,从建立开发环境开始一步一步完成项目,希望帮助大家入门并体验到玩树莓派的乐趣。
准备
树莓派3B+、opencv(USB接口的方便插到树莓派板上)、qt creator
树莓派配置
树莓派Raspberry Pi,体积小、性能强的微型电脑主板,提供内存卡、电源、键盘、鼠标、音频、网线等接口,可用于开发图像识别、音频、办公Office等。本文用的树莓派3B+,建议参考书籍(百度网盘):
链接:https://pan.baidu.com/s/1EQJNxo9c9aZmh0EMqKh4DQ
提取码:p04z
树莓派3B+ 开箱安装系统配置教程
https://blog.csdn.net/fhqlongteng/article/details/80349652
QT+opencv配置
https://blog.csdn.net/sha1996118/article/details/75622692
编程
开启QT开发环境:树莓派开始 -> 编程 -> QT creator -> 文件 -> 新建文件或项目 -> 选择QT Console Application
然后文件命名
编程环境生成
本文用的opencv3.3.1,配置安装参照3.3.1版本,在QT5中打开.pro文件,在其后面添加
INCLUDEPATH += /usr/local/include \
/usr/local/include/opencv \
/usr/local/include/opencv2
LIBS += -L /usr/local/lib/ -lopencv_highgui -lopencv_core -lopencv_imgproc \
-lopencv_video -lopencv_videoio -lopencv_imgcodecs -lpthread
在main.ccp文件中编写
#include <QCoreApplication>
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <iostream>
using namespace cv;
using namespace std;
int main ()
{
Mat image_src, image_gray, image_binary, image_edge;
Mat x_edge, y_edge, abs_x_edge, abs_y_edge;
image_src = imread("/home/pi/image.jpg");//保存在pi里的image.jpg图片
if (!image_src.data) {
cout << "No image data\n";
return -1;
}
cvtColor(image_src, image_gray, CV_RGB2GRAY); //灰度处理
blur(image_gray, image_binary, Size(7, 7)); //滤波
threshold(image_binary, image_edge, 80, 255, CV_THRESH_BINARY); //二值化 ,80阈值可自行改变
//边缘检测
//Canny(image_edge, image_edge, 10, 30, 3); //Canny算子
//先对x方向,因为Sobel算子求出来的结果有正负,用16位有符号表示
Sobel(image_edge,x_edge, CV_16S, 1, 0, 3, 1, 1, BORDER_DEFAULT);
convertScaleAbs(x_edge, abs_x_edge);//将16位有符号转化为8位无符号
/*再对y方向进行边缘检测**/
Sobel(image_edge, y_edge, CV_16S, 0, 1, 3, 1, 1, BORDER_DEFAULT);
convertScaleAbs(y_edge, abs_y_edgeImg);
addWeighted(abs_x_edge, 0.5, abs_y_edge, 0.5, 0, edgeImg);
//轮廓
vector<vector<Point>> contours;
vector<Vec4i> hierarchy;
//查找轮廓
findContours(image_edge,contours,hierarchy,CV_RETR_TREE,CV_CHAIN_APPROX_SIMPLE,Point(0,0));
//计算轮廓矩
vector<Moments> mu(contours.size() );
for( int i = 0; i < contours.size(); i++ )
{
mu[i] = moments( contours[i], false );
}
//计算轮廓的质心
vector<Point2f> mc( contours.size() );
for( int i = 0; i < contours.size(); i++ )
{
mc[i] = Point2d( mu[i].m10/mu[i].m00 , mu[i].m01/mu[i].m00 );
}
//画轮廓及其质心并显示
Mat drawing = Mat::zeros( image_edge.size(), CV_8UC3 );
for( int i = 0; i< contours.size(); i++ )
{
Scalar color = Scalar( 255, 0, 0);
drawContours( drawing, contours, i, color, 2, 8, hierarchy, 0, Point() );
circle( drawing, mc[i], 5, Scalar( 0, 0, 255), -1, 8, 0 );
rectangle(drawing, boundingRect(contours.at(i)), cvScalar(0,255,0));
char tam[100];
sprintf(tam, "(%0.0f,%0.0f)",mc[i].x,mc[i].y);
putText(drawing, tam, Point(mc[i].x, mc[i].y), FONT_HERSHEY_SIMPLEX, 0.4, cvScalar(255,0,255),1);
}
namedWindow( "Contours", CV_WINDOW_AUTOSIZE );
imshow( "Contours", drawing );
imshow("image", image_src);
imshow("edge", image_edge);
waitKey(0);
return 0;
}
原图image.jpg,点击绿色符号运行
得到效果图:
电脑PC上用到传输文件软件FileZilla
树莓派指令ifconfig,获取IP地址,要保证电脑和树莓派连上同一网络。
参考文章:利用OpenCV求取图像多轮廓质心,并在输出图像上显示质心坐标
链接 https://blog.csdn.net/zhuoyueljl/article/details/53588271