10分钟学会树莓派3B+图像边缘识别OpenCV3.3.1+QT5

做毕设接触的树莓派,查了很多资料,成功做出一个小项目,在本文总结自己的学习过程,从建立开发环境开始一步一步完成项目,希望帮助大家入门并体验到玩树莓派的乐趣。

准备

树莓派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

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值