国产精品乱码一区-性开放网站-少妇又紧又爽视频-西西大胆午夜人体视频-国产极品一区-欧美成人tv-四虎av在线-国产无遮挡无码视频免费软件-中文字幕亚洲乱码熟女一区二区-日产精品一区二区三区在线观看-亚洲国产亚综合在线区-五月婷婷综合色-亚洲日本视频在线观看-97精品人人妻人人-久久久久久一区二区三区四区别墅-www.免费av-波多野结衣绝顶大高潮-日本在线a一区视频高清视频-强美女免费网站在线视频-亚洲永久免费

 找回密碼
 注冊會員

QQ登錄

只需一步,快速開始

搜索
樓主: awolfbee

開始設計一種大蒜播種機

[復制鏈接]
141#
 樓主| 發表于 2021-1-2 09:20:48 | 只看該作者
#include<iostream>
, r% P) F4 `  h4 d3 r* R#include<opencv2/core/core.hpp>! j/ D  B* X2 D$ ?& ^* n5 j, W$ G
#include<opencv2/highgui/highgui.hpp>* t/ C% Y5 ]* V2 a, ^  z
#include <opencv2/opencv.hpp>
+ H8 U/ w8 h  \1 N4 I5 {. ?#include <opencv2/imgproc/imgproc.hpp>
5 \) ?: U2 N8 w# G/ B#include <opencv2/imgproc/types_c.h>
* j8 k0 l. ^- b" m#include <stdlib.h>. f  t7 t% D) M7 S4 ]2 c
#include <stdio.h>/ a8 d( G* l+ X
#include <opencv2/highgui/highgui_c.h>
7 {% _) F: Y5 E3 B9 j5 c#include <math.h>  w1 z  b6 v* k0 D( C" F3 @
//#include "iostream"
- B8 e, e  T  k# m) K//#include "cv.h": S3 Y& A! E% P' f
//#include "highgui.h"
& \6 ]) ^8 R! P$ o//#include "math.h"  e+ [( N% \( i
using namespace cv;  //命名空間CV  _! B3 M. f; t( T
using namespace std;  //命名空間 std  \0 C7 d0 r1 ?1 u  l5 g& u

! N5 x0 s  s; b/ a6 Hint threshold_value = 225;  //啟動程序時的閾值初始值,因為227能夠完全提取輪廓,所以設置為225,實際上227也可以。
: p  W/ D5 A# U0 iint threshold_type = 3;   //啟動程序的時候閾值類型,默認的為不足部分取零
  s% ~1 W, |# J" rint const max_value = 255;5 s) Y2 p. u+ u' T4 M
int const max_type = 4;2 Q- W- k" i9 H; r
int const max_BINARY_value = 255;( F, Q/ ]3 W1 Q5 F

% }4 ~; |% H# H- n! B$ j5 F, [2 i5 t3 V    CvFont font;7 X6 L' Q/ F7 h
    uchar* ptr;
" v) }) @: E5 R+ v' S, P# k0 C    char label[20];
5 u) z( {/ |0 e/ g$ }+ `3 x7 x( t    char label2[20];
7 ~0 z! g2 O2 v
- e+ @% W* W' ^* TMat src, blured, src_e, src_gray, dst; //類定義幾個圖片變量,dst是最后轉化閾值之后的圖片,src.gray是灰度圖) v( j: p( `7 B
                                                //在C語言中“char*”是聲明一個字符類型du的指針,定義數據類型,char可以定義字符zhi有變量、數組、指針。dao5 L* t/ }) z2 t3 q' j
                                                //例如:char *string="I love C#!"1 X4 D- ^3 j9 I; O; s
                                                //定義了一個字符指針變量string,用字符串常量"I love C#!",對它進行初始化。對字符指針變量初始化,實際上就是把字符串第1個元素的地址(即存放字符串的字符數組的首元素地址)賦給string。*/3 r, K9 g; V( w0 c+ S7 Q5 n
Mat element = getStructuringElement(MORPH_RECT, Size(5,5)); //用于腐蝕的參數
/ x9 D6 k  Z+ Q' Y+ J  ~char* window_name = "閾值演示程序20201121";/ C( [- K& c. e; L% k
char* trackbar_type = "類型: \n 0: 二值化 \n 1: 反二值化 \n 2: Truncate \n 3: To Zero \n 4: To Zero Inverted";  //' W- U" S& ?1 w2 ^8 j
char* trackbar_value = "數值";1 ^9 ?9 o7 S& H1 {! |8 C% _

. L5 f/ @5 F0 k1 b6 F/// 自定義函數聲明
0 L. F& z6 y# G9 F) O/ Nvoid Threshold_Demo( int, void* );
. E( `+ ]3 _+ X( W' A7 r2 Z  W4 l' Y5 ?+ h  k) E
/**; q& |% A4 H7 V0 W' Z4 r- ~
* @主函數& R4 p5 ~( E* G0 P- g  v
*/
, `8 x3 l: n+ _2 C2 @/ M, u8 qint main( int argc, char** argv ); k5 h4 d5 l5 v* W/ \9 ~9 [, q; P) ~
{1 l6 E" e/ a1 Z0 ^
  /// 讀取一副圖片,不改變圖片本身的顏色類型(該讀取方式為DOS運行模式)! w% u) {1 o! t1 s$ o
  src = imread("121.JPG", 1); //目前還未使用攝像頭拍攝照片,暫時以直接讀取文件的方式來測試。
; z0 n4 k6 I, q7 J1 c3 F* M  erode (src, src_e, element); //對圖片進行腐蝕,參數可調,正常為9或者10,過大則造成輪廓過小,應該再進行降噪
, e' b% L- a9 K% d( O2 z  blur (src_e, blured, Size (3,3));//3*3內核降噪& h& S3 y- d) E2 ?
  imshow("腐蝕和降噪后的圖片", blured);  //顯示圖片
! E* A6 z3 I' l1 ?        int width=blured.rows;  //圖像的行列8 M$ w; b$ l& a7 Y* C2 l% U& E, ~
        int height=blured.cols;  //圖像的列數量, }' \2 U- r  Q8 C( ]9 p
        cout<<width<<endl;    //顯示行列的具體像素
' S4 k  a$ X4 R; |* B0 o4 `+ \        cout<<height<<endl;
2 k- `0 Y! k# U& `3 Q. U; w6 p        int a[500][1]; //定義整型數組,后面的1應該可以不要的
' S* O* s+ a4 W- x) j        int b[500];  //設置一維數組,用于判斷曲線的切線斜率7 h' _  O8 F' E, k+ {1 p7 E
& A% k7 B* _' |; Q& O, L$ _
  /// 將圖片轉換成灰度圖片 Mat img = imread("11.jpg", IMREAD_GRAYSCALE); //在讀取圖片的同時直接轉化成灰度圖,              下一步是要將像素亮度超過一定閾值的點提取出來,并找到該點的坐標,然后記錄該點坐標,用于后期的比對- O) Z7 V" s" X8 B' h5 r3 v8 h
  cvtColor( blured, src_gray, CV_RGB2GRAY );
, a4 S) M$ }( T4 {" P% S
0 ~/ ^! h- O+ j6 Y! X  /// 創建一個窗口顯示圖片; A% i$ {' r8 \* F  _/ b4 a
  namedWindow( window_name, CV_WINDOW_AUTOSIZE );
7 ]/ r1 d" s) J/ x4 J" \8 j# k; j
  /// 創建滑動條來控制閾值1 }3 H1 N5 y1 `! S' k  u- W) `+ [5 Z1 f
  createTrackbar( trackbar_type, window_name, &threshold_type, max_type, Threshold_Demo);, m3 O& R9 U& W" N

2 Q+ }+ A% S' I. u  createTrackbar( trackbar_value, window_name, &threshold_value, max_value, Threshold_Demo);
! c0 T# m, |8 h$ k, _* r8 J" G( G: f" t2 _: ^' K0 l
  /// 初始化自定義的閾值函數
% T- V  o9 G6 g  Threshold_Demo( 0, 0 );
% g+ _; m/ p; q
: `  K7 L4 n8 L // Mat img=src;  //暫時無用- {7 j2 _! u) d0 j
  //imshow("轉化之后圖片",dst);
5 _7 u: s8 O, v* z# c/ {: {* l1 M: m# B; ^8 o* }/ U) v
                                                          //遍歷圖片的每個像素點,當像素點的閾值大于227時,將最左側的該像素地址保存在二維數組中,在該行之后的像素點拋棄,如果閾值低于227,則向下遍歷至該行末,然后從下一行開始對像素進行比較
/ }9 q' l' U( l  [        1 s- @8 B9 o( K7 m. V; H
//Mat BW = imread(imgName);2 s6 m% R8 o5 }; U% |6 y% R  r
//int value = BW.at<uchar>(191, 51);& d+ E: z5 @6 v* i
     int width1=dst.rows;  //處理之后圖像的行列  H/ O2 i" M# K7 y/ x( G& A
         int height1=dst.cols;  //處理之后圖像的列數量; U- D, o4 E# m4 v" @" o
  W! t$ a9 @, g6 u; V! f% V
        for (int i=0 ; i<height1; i++)  //從第一行開始  應該從最后一行開始向上檢索,這樣可以減少計算量,一旦出現與之前曲線K值相反的方向,則確定是拐點,不用再考慮,但是要考慮出現切線斜率始終是減少的趨勢,這種情況下往往是蒜尖- t3 `0 ^5 F+ @; i  L2 A
        {
4 A. o/ {3 }$ S9 K8 f7 U. c& W                 for (int j = 0; j < width1; j++) //從第一行的第一列開始
, W& F; W6 }) q4 {  J/ X  o                {
5 P4 v1 ^4 J6 D& O                 //int index = i * width + j;
7 f8 h. K: o) h4 V                 int value = dst.at<uchar>(i,j); //讀取給定坐標處的像素值
) ^+ b/ z- Q* d, a$ B                //if; //像素值
! B, g) ?$ q* N                 //int data = (int)dst.data[index];" I: x  r* f/ f2 d: C+ k: ]
                                if ( value >200) //如果像素值大于某個數值,則將其地址記錄在數組內,且僅記錄首像素,后面的舍棄
* ?6 d$ t( y2 y, t: N* r                                                        {       
3 ]: C3 T4 m& w) u* S                                                        a[i][1]=j; //數組值等于列數,便于后期對比
+ h. g/ d. e; I                                                        //cout<<i<<" --- "<<j<<endl; //i為行數% f; b- E3 c) S( F4 V- V$ s. k" a
                                                        //cout<<i<<" -坐標-- "<<a[i][1]<<endl;0 N. B1 L% ~5 s/ m$ l/ ~
                                                        if (i>1)! a9 ~3 n$ r& ~. o6 x
                                                                {  //11
+ o' d5 W) H4 o                                                                        if (a[i-1][1]<a[i][1])  //如果第一行中大于某個閾值的像素地址與下一行相比靠右,也就是列數比上一行要大,則說明該曲線向左側傾斜,說& A6 }0 D: x- L1 ^/ s0 b3 s0 G
                                                                                                    //明是底部,如果曲線向右側彎曲,則是蒜尖 (之所以用i-1,是因為總不能和沒有像素的地址對比,所以必須向后取值)
2 H5 J7 R6 S6 J9 e9 [                                                                        { ' b. a# [3 x( o4 J
                                                                        b[i]=0;             //因此,當下一行的地址比上一行的地址小,則用1表示,如果下一行地址比上一行大,用0表示,1是蒜尾,0是蒜尖。% ~4 a/ _! O3 ^0 t5 _
                                                                        }& k" R+ v9 ?, w$ @2 @
                                                                        else if (a[i-1][1]>=a[i][1])   
% ]' p0 Y+ B: j1 N$ k                                                                        {
! A. V4 P: h" v9 W* d7 }0 g. @                                                                        b[i]=1;" _" C4 Z8 n) }  H3 _( \
                                                                        }  }! j7 g% B3 s7 N
! r0 w4 o% x$ s& y8 ~. E
                                                        cout<<i<<" -標識符-- "<<b[i]<<endl;        6 D2 E6 B4 A) d+ v6 Y
                                            //cout<<j<<endl; //j為列數' X6 N6 {. o, s. G: K
                                                                } //11- w6 T# N* E) W8 {+ C6 z2 Y
                                                        5 G7 {1 ]1 e( I- a7 |
  }; Y  [; v# `* f6 c! s9 w
                         break;  5 b" z* k% V; ~* F7 V1 w5 {' P, S. j
                                          }
* x4 j  J* Q& T' T# W                                                        }
; U* c; Q1 s# G* H                 }! E4 ?! b; B4 j. n) y0 F$ }
        //開始對b數組進行分析,確定是否為頭尾(但是需要對曲線進行圓滑處理)
; d0 R3 @7 T- c/ M4 x  D        for (int i=0 ; i<height1; i++)  //對數組b進行遍歷,檢查是否存在誤判的問題
  w2 I3 m+ ?& K8 D# v                                                                        //尋找拐點,找到用于判斷的后段曲線的拐點. U, x; ?7 p1 b+ P0 h
                                                                        //對圖形進行圓滑處理,除了最大的拐點之外,盡量不要出現折線
2 C/ z5 Y, K- c7 Y       
1 A( d9 b; v& G/ d- Z        : v9 [% d  M( B1 V4 C& S
       
' ?3 ]) r. Y7 B- U& R   // int width=dst.rows;  //圖像的行列
" C5 Q: B# x+ Y        //int height=dst.cols;  //圖像的列數量* B# l+ D; @2 l9 s# n( y
        cout<<width<<endl;    //顯示行列的具體像素; ?4 r) c3 ]6 `
        cout<<height<<endl;
8 g' g4 n4 [! \& Z) Y: Q( M& J        //for (int i =height1-5 ; i>20; i--) //對收集的坐標數據進行分析, M# H! b# u' M% U1 `8 r
                & b) }  Y' H# w$ B* w. S! T
  // 等待用戶按鍵。如果是ESC健則退出等待過程。, n! P7 |! @3 k
  while (true)5 c0 H% l' l9 O
  {8 r- _& ]6 b5 S/ q, P7 H2 w
    int c;4 l2 z. W9 v# {7 x7 [+ j- H
    c = waitKey( 20 );. D& ^6 H/ O4 r2 X; f
    if( (char)c == 27 )" B" `. V8 ]7 m# {- C6 g
      { break; }
1 w+ P. n& \" F' x   }
) H( V  l1 g/ B
7 N5 F1 P$ z$ C  H- J5 r3 [}
. r+ |5 C- ^1 P3 U6 C# k6 v: D8 N; T' a- V

1 ~4 L; n. D. r/**" H* P4 E8 k2 q* R, I! Z" f
* @自定義的閾值函數
9 B" |) q& I# d6 ]9 l */
1 b( w: j8 {7 D: F" q  P# S6 ^void Threshold_Demo( int, void* )  b8 v! S) R$ n  S
{6 f0 T8 D8 Z' w& W0 [
  /* 0: 二進制閾值6 u0 N: C1 W9 |# o% _
     1: 反二進制閾值/ e0 v. [9 b8 J5 w3 {7 U
     2: 截斷閾值4 F  H& U# Z  g( G! q
     3: 0閾值
) [! @) x2 o- ?4 @! X     4: 反0閾值
4 A9 h4 }$ a* ~7 c   */) m& N- `" i+ e9 A8 X

6 u( ^/ S: O0 ]4 ?) P  threshold( src_gray, dst, threshold_value, max_BINARY_value,threshold_type );
: p  K3 t8 V6 L* w, R9 _1 ^7 N- l8 l' r! J
  imshow( window_name, dst );
/ }( H! q% w" v}, I6 L8 D' ~2 b( k8 s, u0 G
. `! ?  ~  n4 z3 R% @
( y2 z8 Q- A/ G# \- t
3 |# b9 U  D. u8 ^9 ^: l) w

( \! B* l5 m; q0 p3 p3 h9 c
) B- n5 {6 r& A  U/*
+ H; u- V! ?& avoid main()
0 V' i  r2 z+ E9 E( j4 f- z" e{
5 u$ D7 L8 a3 v# z) y& e5 u$ m  q                . r3 Z7 Y/ a$ s: ]/ M
        //讀入彩色圖像 單通道圖像(CV_8UC1);CV 8位未指定的1通道的圖像,backImg是單通道灰色圖
3 l5 U" W2 R! L1 K1 j2 p) D        4 P$ {$ Z1 j: |% w3 k
    //Mat img = imread("fruits.jpg");
& w; g; b2 @3 F& _2 I4 E5 e0 B        Mat img = imread("11.jpg", IMREAD_GRAYSCALE); //在讀取圖片的同時直接轉化成灰度圖,              下一步是要將像素亮度超過一定閾值的點提取出來,并找到該點的坐標,然后記錄該點坐標,用于后期的比對* ^( I; q' {2 y  V
    imshow("灰度圖", img);) b" J- L+ ]# p, u9 ~* d: w
        //確定圖像的尺寸,行列,
4 i3 G8 e* S: f6 L        int width=img.rows;   //圖片的變量名加上行列,就是行列的數據: ^  |9 t2 F' A6 m# C; r! h
        int height=img.cols;. ^, K" N7 Q: F7 P, p1 s4 L" e
        cout << width << endl;   //顯示行列的數據  本圖片已經用358的像素值裁剪了,所以形成的就是高寬都是3585 \) f% D/ ^/ \' u' X/ ]$ ~* z" E
        cout << height << endl;
. ]- g6 H5 O6 H; d8 t$ Z    //定義一個二維數組,a[i][1],其行數等于圖像行數,列數就一列,用于記錄圖片上像素的亮度超過某個閾值的像素所在的列數,用于下一步的對比。
2 p4 V. Y3 J4 A1 l        int a[358][1];   //確定一個358的二維數組5 D  C% z/ _! t  f; u

1 I! }4 p2 |0 V( a# a( }//int height = backImg.rows;   //backImg是圖片變量名, t" _/ S+ B4 @3 |0 z7 O0 v
//int width = backImg.cols;
, e1 n* x6 Y2 r+ i! Efor (int i = 0; i < height; i++). i# U, `$ ?9 g. x/ a. ^
  {
: O8 O5 D6 I+ u- w; Y6 q                 for (int j = 0; j < width; j++)9 w0 ]( X% j8 C
         {
+ I- |1 z: G6 K3 j' G                 int index = i * width + j;" g- Z0 B$ G0 u5 `  u1 j& \
                //像素值1 m* N  V( y2 I" B0 {* r
                 int data = (int)img.data[index];
+ d# A# E! G1 q0 Q" Z. J0 ~$ t         }
4 h1 T+ C) N2 \* @  f1 f9 y }. j" a1 S1 r& e. s) ?
        waitKey();3 M$ T# n3 A, ~0 t0 u+ l
}
+ U. ^6 T4 Y7 `1 Z0 T*/
142#
 樓主| 發表于 2021-1-2 09:23:11 | 只看該作者
以上為使用OPENCV作為視覺識別的工具,目前測試的方式是以一道激光照射在蒜瓣上,根據激光產生的亮條的形狀以及拐點判斷蒜瓣的頭尾,對于清理非常干凈的蒜瓣來說,這樣識別問題不是很大,基本上還是可以判斷的,但是對于沒有清理干凈的蒜瓣,例如底部還有殘留的塊狀根部,或者是還有蒜皮,這樣就會對識別產生干擾,因此需要使用更復雜的算法排除干擾。
143#
 樓主| 發表于 2021-1-2 09:24:55 | 只看該作者
目前僅用保存在電腦中的圖片進行測試,暫時還沒有使用攝像頭連續拍照,關于如何排序,還得等識別沒有問題之后再說。+ j# [7 b" G) D
. ^1 W# c. i! |1 t
" Z; c9 x, I- k/ S- b, W) H5 m1 u7 B
元旦放幾天假,總算有點時間研究下。
144#
發表于 2021-1-4 13:02:56 | 只看該作者
awolfbee 發表于 2021-1-2 09:20
( |) L: b: u0 j$ l#include- h/ [. f! [% U2 r, V% U3 V
#include1 C+ ~% m: d, ]& {( B& M$ B
#include
7 I( z5 I* y3 `) g
lzv5,不明覺厲!
( L7 L5 D  {# w$ P8 S5 N, \, h7 m
這個需要安裝opencv的什么軟件,什么版本,. \0 T8 q- D5 i4 r$ l' V4 w' F

5 W/ L* C* E9 F4 z* q才能在C環境下編譯測試?% Y; w- j: D) t; _+ Y2 D

點評

VS安裝的時候要選中VC,不然白忙一趟,我第一次就是白忙了。  發表于 2021-2-5 22:52
房事不舉問百度……哈哈……OPENCV實際上就是C語言的函數庫,只不過是針對視覺識別的,可以到OPENCV官網上下載比較穩定的版本,我的是OPENCV3.0+vs2010,之前搞辣椒采摘機的時候就在用,現在在深化。要學習C++語言  發表于 2021-1-4 19:24
145#
 樓主| 發表于 2021-1-22 22:26:06 | 只看該作者
) O7 c& F' j( q3 e% I& I
1 g: s2 o) J- L& v: o7 f0 W
用一次性筷子做了個簡易的相機支架,第一次居然做低了,不能拍攝大蒜的全貌,然后在上面增加了一個小的支架,雙杠上再增加雙杠。
# Y8 Q( y# n8 Y! c$ [% w! @( S! r# K# g! M3 l3 q) o5 S

1 Q, |: P2 M  ]  v1 r7 h1 A9 S% N. _& y, }8 H, R
拍攝的大蒜圖片,背景色應該為黑色的比較好,還有就是光源沒選擇好,要在支架上再增加LED照明燈,設置好光源才行。搞視覺,的確麻煩。
6 f# d( a$ |& U( @: T) n8 N$ Q" F" m7 h; H" d: H& \0 |1 H/ x
相機的像素選擇有點低,不過28元的攝像頭,還能指望個啥,能拍攝照片就不錯了。% Q; P0 d. C; d2 @" l

本帖子中包含更多資源

您需要 登錄 才可以下載或查看,沒有賬號?注冊會員

×

點評

殘存塊根的蒜瓣,從形狀上不好識別,可以從色差上面進行識別。  詳情 回復 發表于 2021-1-24 11:34
筷子用熱熔膠粘結的,發現熱熔膠的確是好啊,隨時隨地粘結,而且強度還不錯。  發表于 2021-1-22 22:27
146#
 樓主| 發表于 2021-1-22 22:35:32 | 只看該作者
03年購買了一個飛利浦的剃須刀,用了幾年后電池彈片上銹不能用了,于是就用鋰電池裝上,之前用的是一個巨大的翹板開關,而且是用不干膠帶纏繞的,雖然實用,但是很難看。今天把剃須刀帶到公司去,整理了下,還安裝了一塊鋰電池充電板,焊接完畢后再用熱熔膠固定下相對位置,把電池的觸點用膠保護起來,這樣就比較完美了。充電時是紅色燈,充滿了就轉綠色燈。
# F" D- u' }- C7 p/ H; n/ o* r實際上我有好幾個剃須刀,但是就這個用的比較順手點,所以就沒舍得丟。到現在已經用了18年了,刀片在玻璃板上磨過幾次,依然非常鋒利。
3 j# ?( a3 {9 Q. D* h, q1 |/ S0 u' y5 G
: ]6 R* y" M4 F# A
0 h# x; z: v6 `. r5 \
# M, t) c0 b# t: @5 C4 D

本帖子中包含更多資源

您需要 登錄 才可以下載或查看,沒有賬號?注冊會員

×
147#
發表于 2021-1-24 11:34:26 | 只看該作者
awolfbee 發表于 2021-1-22 22:26( H$ Y1 A- I- i+ s3 N' c- r! b
用一次性筷子做了個簡易的相機支架,第一次居然做低了,不能拍攝大蒜的全貌,然后在上面增加了一個小的 ...

9 v, n1 M) v. S  s0 b殘存塊根的蒜瓣,從形狀上不好識別,可以從色差上面進行識別。
- h* Z" \% n! q2 v6 |6 U* ~! O! d8 S! C! b

點評

謝謝提醒,這幾天觀察蒜頭的時候,感覺到可能要使用多種方法同時鑒定,因為正和你說的那樣,殘根影響了外觀,光靠外形搞不定。  發表于 2021-1-24 19:15
148#
 樓主| 發表于 2021-1-31 22:09:17 | 只看該作者
用未解鎖的手機屏幕作為背景,效果非常好。調節了下焦距,基本上能分辨出外觀來。
: z" j) q$ U) {, q6 ?# X8 n9 H9 z) _6 P
3 ~2 h2 L, A" h: n0 e/ W4 |4 P先用帶皮蒜瓣,然后剝了幾個蒜瓣,寫了一段程序,現在能夠使用程序讀取照片了。0 C! S( F6 ^' `

+ G) f! x# h( Z3 o6 g* V準備搞一個黑色的絨布再加上玻璃板作為背景,然后要粘貼上定位條,這樣每個蒜瓣的原點就確定了,便于后期的程序書寫。
) L- g' ?# F& y' k  \' P) r0 a# \; v& I

2 }: F9 J% U3 O# D- }5 Q) {) I! s. ?  |0 {

本帖子中包含更多資源

您需要 登錄 才可以下載或查看,沒有賬號?注冊會員

×
149#
 樓主| 發表于 2021-1-31 22:11:51 | 只看該作者
感覺按照蒜瓣這樣原始的狀態識別很麻煩,上周在工作的地方寫程序的時候就在考慮這個不一致性的問題,因為蒜頭碾碎成蒜瓣之后會存在很多蒜皮以及蒜根之類的不規則物品,對視覺識別會造成很大的干擾,這個可能要設計個設備,在把蒜瓣種子送入到鐘子箱之前就要預處理下,把從蒜瓣上剝離的蒜皮清理掉,把蒜根進一步去除,要么就在識別時將無法識別的丟棄到廢料箱中,后期人工再處理。
150#
 樓主| 發表于 2021-2-2 22:27:15 | 只看該作者

* \  O0 B2 T/ q通過視覺軟件各種算法,取出蒜瓣的外形圖,現在就是要對這個外形圖進行處理,得出頭尾的結論。貌似這個也簡單,因為都帶有個小尾巴,但是我把外面的蒜皮剝掉之后是怎樣的呢?下面開始剝皮。9 {- b: w) c$ I0 N/ d1 R

. s) K) ~  G8 e; n8 e其中的小點應該是灰塵,可以在計算過程中把面積小于多少的點排除,這樣就可以得出蒜瓣的凈輪廓圖像。
4 |* r+ A! E, r& [3 t6 q

本帖子中包含更多資源

您需要 登錄 才可以下載或查看,沒有賬號?注冊會員

×
您需要登錄后才可以回帖 登錄 | 注冊會員

本版積分規則

Archiver|手機版|小黑屋|機械社區 ( 京ICP備10217105號-1,京ICP證050210號,浙公網安備33038202004372號 )

GMT+8, 2025-9-3 07:28 , Processed in 0.080256 second(s), 19 queries , Gzip On.

Powered by Discuz! X3.5 Licensed

© 2001-2025 Discuz! Team.

快速回復 返回頂部 返回列表