找回密码
 注册会员

QQ登录

只需一步,快速开始

搜索
楼主: awolfbee

开始设计一种大蒜播种机

[复制链接]
 楼主| 发表于 2021-1-31 22:11:51 | 显示全部楼层
感觉按照蒜瓣这样原始的状态识别很麻烦,上周在工作的地方写程序的时候就在考虑这个不一致性的问题,因为蒜头碾碎成蒜瓣之后会存在很多蒜皮以及蒜根之类的不规则物品,对视觉识别会造成很大的干扰,这个可能要设计个设备,在把蒜瓣种子送入到钟子箱之前就要预处理下,把从蒜瓣上剥离的蒜皮清理掉,把蒜根进一步去除,要么就在识别时将无法识别的丢弃到废料箱中,后期人工再处理。
 楼主| 发表于 2021-2-2 22:27:15 | 显示全部楼层

2 E2 q3 d% N' n) k通过视觉软件各种算法,取出蒜瓣的外形图,现在就是要对这个外形图进行处理,得出头尾的结论。貌似这个也简单,因为都带有个小尾巴,但是我把外面的蒜皮剥掉之后是怎样的呢?下面开始剥皮。
% j5 r2 A7 N" s3 V) w2 V- R$ t6 Y2 m2 F7 M6 G- t9 f; I
其中的小点应该是灰尘,可以在计算过程中把面积小于多少的点排除,这样就可以得出蒜瓣的净轮廓图像。
0 f% q: d0 b2 v' _' E# @, R

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册会员

×
 楼主| 发表于 2021-2-2 22:32:31 | 显示全部楼层
/ [+ y6 o  Z8 O8 }
剥掉蒜皮后的轮廓图。最后一副图样有点奇怪,生成的轮廓曲线连贯且平滑,也就是重新生成了下然后就变成这样了,不知道程序上有哪些变动。. k9 Z8 y  S' B- ]9 O

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册会员

×

点评

这一次购买的大蒜品种有点奇怪,蒜瓣都是鼓肚子的,不像之前购买的那种,轮廓图都是和月牙一样。看来这个蒜的种类是很讲究的,要注意了。  发表于 2021-2-2 22:37
肉眼能看得出哪边是蒜尾,哪边是蒜尖吗?如果人眼都分辨不出来的话,机器估计也无能为力了。  发表于 2021-2-2 22:36
 楼主| 发表于 2021-2-2 22:39:23 | 显示全部楼层
程序如下:2 O- J6 l4 V, r3 l2 {, [* F

6 U' X+ w7 I0 V" [( B9 i" @操作系统: win7 64位. C- X/ l2 j( L0 m
IDE:VC++2010旗舰版: i* \, Z& B1 \5 K
视觉软件: OPENCV 3.03 u( t" Y* ]7 [6 ~

' X* u3 A% Z$ F- `$ M/ m# X$ T) r; m. w( I5 T
//#include "stdafx.h"
9 I; \0 O" _& i; G1 U! u; E#include "core/core.hpp"0 ~0 g, N0 `) Z3 \: d6 A+ Q8 a- N) _
#include <opencv2/imgproc/imgproc.hpp>/ Q2 {9 i8 H& v
#include <opencv2/highgui/highgui.hpp>
" J% w9 e) i3 t; p# f$ D#include <iostream>' Q% f( q0 J7 o9 k6 p' P; L
#include "highgui.h"
; A- t6 Q2 f8 L+ m6 Y: R0 V#include <set>/ D0 h" z9 ^( C+ `
#include <opencv2\opencv.hpp>
; _1 q5 c9 [1 Z- n#include<vector>     //包含所需要的类文件vector,还有一定要加上using namespace std。
# B5 ]+ e3 l7 {- J$ x# V& L#include <stdio.h>
5 ~* R2 A7 p8 M/ v$ Z0 p( c#include <conio.h>5 p: m2 X- z% l+ P; @6 g# K; K
#include <opencv2/highgui/highgui_c.h>+ L% C! c+ |+ a1 t% l) O
#include <math.h>( L4 p5 M+ K% T
#include "iostream": A' Q, v1 U* ?
#include "cv.h"- W8 Y3 f: w% g( h6 n
#include "highgui.h"
$ S  B# t" i% X& O0 \8 f1 o) ousing namespace std;5 ?0 L  t) J, J3 r1 g8 u. F) Z& [6 Y, j
using namespace cv;
6 y% \. K( u. z6 d  [5 `" `9 u/ f' e. X& C

* H1 E. L- z/ X6 o! l' ]& S; e) A0 s1 a8 h4 I- f
//-----------------------------------【main( )函数】--------------------------------------------# w  P2 x/ s" r# H5 m
//     描述:控制台应用程序的入口函数,我们的程序从这里开始8 _* Q9 K6 O' z/ m! w
//-------------------------------------------------------------------------------------------------, j: S- y/ e- \! U$ z6 ]2 s! }& x

4 i. E7 H8 Z* \& b1 |  n5 Eint main()
* ?) E% H; J2 D8 l& y: z: E: A% X& {. x/ H4 g  G) L
{
& O2 v% j' h, s+ L3 Q& _/ n% bint chufa=1;
. L) ^/ l+ g. }    //【1】从摄像头读入视频
( }: W2 V+ l. t8 x  S
/ i  B7 c# \. T9 Q) Y$ |, M" V# {4 @    VideoCapture capture(0);
8 h, F6 G% T/ w/ W% n1 L
% h, k1 ~5 b( |& y    Mat edges;   //定义类  s; A8 f3 w1 H! c

/ n& c5 T& J! ~namedWindow("预处理后的视频", 0);9 ^# q* i  F$ B' \
  `" A: x5 [" W& H
//   Mat frame;  //定义一个Mat变量,用于存储每一帧的图像,将该项至于循环之外,不要重复定义Mat,增快速度;+ [/ l* H* a/ ~* }% y) ?* ^, d
5 I  V  T$ O6 r. S0 f+ g: K9 e
//定义轮廓和层次结构(这个不是很理解)
0 \5 [% }, O7 d
& ]* V/ m, E. c' |//vector<vector<Point>>contours;  //其中contours 应该是一个变量,可以用在后面的轮廓查找的函数中,定义点的向量* q( i6 D4 c, @' I  z, D  b

/ x6 {. ?- C. P: u0 A//vector<Vec4i>hierarchy;    //定义四维向量???
6 L9 b  n) X3 [5 u1 A. m  {% w
: `4 Q5 j* n- @/ x( J3 A% L) X  f//【2】循环显示每一帧2 Q3 ~% q- O/ z
# G, ]0 \8 J# G( N6 O! u, m
    while (1)
; J9 R) E3 Q* ~, r
- d  J7 V3 O4 f& W    {& H6 |! m7 ~+ x$ M" p

' \* V, u% Y: ~' L        //读入图像
, _% i; ^+ T: A' c( y* r
8 b4 l& K4 P5 ^4 W  V6 d, |3 y; P           Mat frame;  //定义一个Mat变量,用于存储每一帧的图像,将该项至于循环之外,不要重复定义Mat,增快速度;
( b2 r+ o" L9 D; F" w0 @" `6 ]5 d- j8 b) @7 u
           if (chufa=1) //当取样信号为1时,开始取当前帧,然后进行识别
' I; @2 ~) |5 S$ {/ x9 v
( i" H) O+ H7 X8 i' w                        {& @# g2 y* B" t
& Z& A* |  V) s( e  a
                          capture >> frame;                                              //读取当前帧,videocapture函数是不断读取外界的视频,需要一个类来读取当前帧,* g% h# ]- y3 x3 U5 X
                                                  chufa=0;
, K4 O. c- `0 ]- A/ f8 ]. W3 ~" c" Z* M
                                                                                                  //对于只需要一副图片来进行检测的操作来说,每个循环只要出发某个取样信号,取样一次就好了。因此用IF语句
+ }1 S8 P5 X. B/ n: S: f
' f* K4 b$ T5 H* B                           cvtColor(frame, edges, CV_BGR2GRAY);      //灰度化  --如果说需要使用颜色检测蒜瓣的底部和头部,可能还需要颜色来判断9 n+ }. ~' k% |* _) b3 O  Y
/ E4 M' p9 B7 B& o
                          threshold(edges, edges, 120, 255, CV_THRESH_BINARY | CV_THRESH_OTSU);         //二值化,将其变成黑白两色的图样5 J; o3 b* _; m
+ U# ~7 q, X% m& t  a, d$ ^" A
                          blur(edges, edges, Size(3, 3));                           //进行模糊,使用3*3内核来降噪( N! s! r  r+ @7 M

+ h" V/ o2 Z# V3 v" Z% |                         Canny(edges, edges, 0, 30, 3);                            //进行canny边缘检测并显示, l! C- D5 g/ J6 Z& i) R: R$ b% R
" E. g) t9 l, C5 s+ w
                       // findContours (edges, contours, hierarchy, CV_RETR_EXTERNAL, CV_CHAIN_APPROX_NONE);           //要求原图像为8位单通道图像;其中edges是源文件,contours是轮廓函数??
: p5 m3 Y+ U  R0 ?) e% q
: Z8 Y. h( b! D4 Q2 H                                                                                                                                                                                      //CV_RETR_EXTERNAL,仅需要外侧的轮廓用于识别,
# a3 e2 N$ B8 M6 H' V6 ^8 K8 M4 m5 n
                                                                                                                                                                                      //CV_CHAIN_APPROX_NONE,获取每个轮廓的每个像素,最好是连续的,) G0 p1 q- C( n1 ?& v1 i6 ]

) j& b0 v# s+ s  o                       }  o3 k! g( e1 k7 `
& X* t. _& A! M. s5 M7 m
        imshow("蒜瓣轮廓图", edges);                        //显示当前帧7 }5 i' V5 z1 H" n. F' g# w% N! m
8 N; c/ ~4 O% k8 |8 [
        if (waitKey(30) >= 0)
3 u( X% E8 q6 d# R4 W9 @; f. f' m4 l6 ?9 }" r2 ?
            break;
" f+ T. E, n: ^4 x4 D1 s) g- R$ J$ c4 [& \
; Q! H. P& g' y/ s7 K
1 t" I2 Q* q( p& V
    }, {4 \8 @# S( M7 H
% K' Y: }; J4 U: i9 Z- x! H* Y7 N
    return 0;% W7 V1 H! D' D- N6 j
# s! m' E' M8 m
}
 楼主| 发表于 2021-2-5 19:21:52 | 显示全部楼层
大白小白 发表于 2020-11-18 13:14$ L6 t5 g! t) k3 p3 g0 O
@awolfbee 蒜头压碎成蒜瓣,有视频么?四处纷飞?能不能温柔点?
( [- ?- z: \3 J
https://item.taobao.com/item.htm?spm=a230r.1.14.30.2220dd82nuirRU&id=626297555950&ns=1&abbucket=2#detail, {2 J4 B+ H9 ^% l* {2 X
! v& v7 \  \. E- V
这是大蒜分瓣机。
; ~) V8 H& P9 p# T
 楼主| 发表于 2021-2-5 19:24:34 | 显示全部楼层
大白小白 发表于 2020-11-22 21:23
: D7 R8 h$ b% o' ]0 E# Y# }; g在图片上注释,没看懂啥意思

: ~$ ?' J- y7 |, x$ t8 f8 K
% C; N4 D9 D5 `# |带有块状的根部,大蒜剥好之后是没有这个的。
/ L2 p% r: l( x7 k5 C

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册会员

×

点评

这个根部如果剥离的话,在蒜瓣底部会形成一个火山口样的形态,如果能做激光三维,这倒是一个切入点,关键是激光三维传感器太贵了!!!一个十几万!!!!加上他们给的程序就27万!我想自己开发算了。  发表于 2021-2-5 22:55
发表于 2021-2-5 19:29:10 | 显示全部楼层
awolfbee 发表于 2021-2-5 19:244 P* Z! W1 n1 j9 w3 y
带有块状的根部,大蒜剥好之后是没有这个的。
: g" b) N+ S& g0 V- u( `; j* G
老大放假了?
5 e. M  A5 o7 k) M) _1 L

点评

没有,要到29才放假,放假也闲不着,孩子抢电脑看旺旺队,唉……  发表于 2021-2-5 22:53
 楼主| 发表于 2021-2-11 00:34:34 | 显示全部楼层
今天,哦不, 是昨天开始放假,上午上班的时候看了一个关于单摄像头加线状激光发射器旋转配合OPENCV形成立体图的文章,对激光三维照相有了一点了解。之所以考虑这样的方式,是因为这几天一直在思考如何从大蒜的侧面的形状判断哪边是头或者尾,问题在于误判率太高。所以还是回到检测头和尾的形状特征上来。之前考虑的是接触式的检测方式,当时有考虑用点阵压力传感器测量蒜头和蒜尾的接触压力,如果压力是环形,则是尾(实际上也不一定,因为有根的存在就会误判),如果压力为点状,则为蒜尖。但是从耐久性来考虑,还是非接触式的为好,这样看来,非激光立体照相不可了。
 楼主| 发表于 2021-2-16 23:18:15 | 显示全部楼层
http://www.csksoft.net/blog/post/lowcost_3d_laser_ranger_1.html! d9 E% A  D; V" w! `; V, o& k  U

* \6 o' u+ k2 K这是一个激光三维成像的帖子,在其中得到不少启发。
( T+ \5 {6 {0 _
4 j6 Y& [. M; v) y$ ?如果能对蒜瓣的头尾进行三维扫描,获得立体的图像,则可以对图像进行分析,确定头尾,这比用基恩士的要划算多了,而且这个扫描面积很小,估计就是10*10个mm。
 楼主| 发表于 2021-2-16 23:19:31 | 显示全部楼层
利用废旧光驱上的镜头,在之前的摄像头上增加一个透镜,调节焦距,形成一个小的电子显微镜,这是大蒜的底部照片。
7 I  h  K) d4 b' K# w6 Y8 R
0 R* _! w# `$ T3 u( M$ \1 C; [* r! A
这个嘛,猜猜?
# \5 [6 B( ^& Y8 Q* s

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册会员

×
您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

Archiver|手机版|小黑屋|机械社区 ( 京ICP备10217105号-1,京ICP证050210号,浙公网安备33038202004372号 )

GMT+8, 2025-7-6 08:12 , Processed in 0.080027 second(s), 19 queries , Gzip On.

Powered by Discuz! X3.5 Licensed

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表