CN110414491A - 一种棉花单株形态照片的拍摄方法及其辅助装置 - Google Patents

一种棉花单株形态照片的拍摄方法及其辅助装置 Download PDF

Info

Publication number
CN110414491A
CN110414491A CN201910805712.3A CN201910805712A CN110414491A CN 110414491 A CN110414491 A CN 110414491A CN 201910805712 A CN201910805712 A CN 201910805712A CN 110414491 A CN110414491 A CN 110414491A
Authority
CN
China
Prior art keywords
image
file
string
import
dst
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Granted
Application number
CN201910805712.3A
Other languages
English (en)
Other versions
CN110414491B (zh
Inventor
师维军
马君
刘忠山
李春平
张大伟
吾买尔江·库尔班
牙生·玉努斯
金亮
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
INSTITUTE OF CASH CROPS XINJIANG ACADEMY OF AGRICULTURAL SCIENCES
Original Assignee
INSTITUTE OF CASH CROPS XINJIANG ACADEMY OF AGRICULTURAL SCIENCES
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by INSTITUTE OF CASH CROPS XINJIANG ACADEMY OF AGRICULTURAL SCIENCES filed Critical INSTITUTE OF CASH CROPS XINJIANG ACADEMY OF AGRICULTURAL SCIENCES
Priority to CN201910805712.3A priority Critical patent/CN110414491B/zh
Publication of CN110414491A publication Critical patent/CN110414491A/zh
Application granted granted Critical
Publication of CN110414491B publication Critical patent/CN110414491B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F18/00Pattern recognition
    • G06F18/20Analysing
    • G06F18/23Clustering techniques
    • G06F18/232Non-hierarchical techniques
    • G06F18/2321Non-hierarchical techniques using statistics or function optimisation, e.g. modelling of probability density functions
    • G06F18/23213Non-hierarchical techniques using statistics or function optimisation, e.g. modelling of probability density functions with fixed number of clusters, e.g. K-means clustering
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06VIMAGE OR VIDEO RECOGNITION OR UNDERSTANDING
    • G06V10/00Arrangements for image or video recognition or understanding
    • G06V10/40Extraction of image or video features
    • G06V10/56Extraction of image or video features relating to colour
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06VIMAGE OR VIDEO RECOGNITION OR UNDERSTANDING
    • G06V20/00Scenes; Scene-specific elements
    • G06V20/10Terrestrial scenes
    • HELECTRICITY
    • H04ELECTRIC COMMUNICATION TECHNIQUE
    • H04NPICTORIAL COMMUNICATION, e.g. TELEVISION
    • H04N23/00Cameras or camera modules comprising electronic image sensors; Control thereof
    • H04N23/80Camera processing pipelines; Components thereof
    • HELECTRICITY
    • H04ELECTRIC COMMUNICATION TECHNIQUE
    • H04NPICTORIAL COMMUNICATION, e.g. TELEVISION
    • H04N7/00Television systems
    • H04N7/18Closed-circuit television [CCTV] systems, i.e. systems in which the video signal is not broadcast

Landscapes

  • Engineering & Computer Science (AREA)
  • Multimedia (AREA)
  • Physics & Mathematics (AREA)
  • Theoretical Computer Science (AREA)
  • Data Mining & Analysis (AREA)
  • General Physics & Mathematics (AREA)
  • Signal Processing (AREA)
  • Bioinformatics & Cheminformatics (AREA)
  • Artificial Intelligence (AREA)
  • Bioinformatics & Computational Biology (AREA)
  • Computer Vision & Pattern Recognition (AREA)
  • Evolutionary Biology (AREA)
  • Evolutionary Computation (AREA)
  • General Engineering & Computer Science (AREA)
  • Life Sciences & Earth Sciences (AREA)
  • Probability & Statistics with Applications (AREA)
  • Image Processing (AREA)

Abstract

本发明提供的一种棉花单株形态照片的拍摄方法,在田间试验小区选择好典型单株后,用工具将该单株连根拔起,保持单株完整形态,用辅助装置将单株固定在装置上部、识别生长期寻找最佳角度,然后将固定有单株的辅助装置插入地下保持直立固定。拍摄机构调整角度背对阳光以蓝天为背景对最佳角度单株进行拍摄。本发明方法和装置拍摄结果可控、效果佳、简单高效低成本。利用统一角度的自然阳光进行拍摄,有效避免周边光影干扰,彻底消除背景杂乱和背景阴影,最大限度客观真实表现反映试验材料特征特性,一人即可独立完成单株采取、固定和拍摄的全过程,而且能为后续研究积累大量的参考数据,在作物种质资源和育种研究领域具有广泛的实用性。

Description

一种棉花单株形态照片的拍摄方法及其辅助装置
技术领域
本发明属于植物种质资源和育种研究手段的技术领域,更具体的,本发明涉及一种棉花育种和种质资源的研究方法技术领域。
背景技术
在棉花种质资源、育种以及其它相关研究中,通过田间试验,在生育期间对参加试验的材料单株植物学特征与生物学特性以及农艺学性状进行观察鉴定记载,以对参试材料有全面真实客观的认识了解。
棉花按照时间顺序,生长发育各主要阶段时期如下:播种期、苗期、蕾期、花铃期、吐絮期。其中花铃期和吐絮期是比较关键的阶段。
在棉花科研中,拍摄棉花单株形态照片,主要是保存固定某一棉花田间试验材料(品种、品系、种质资源等)的特征特性,用于后续的鉴定比较等研究。
由于棉花单株包含了棉花地上部分的全部茎、叶、蕾、花、铃、果枝等的相关性状。通过对某一参试材料的典型单株观察鉴定,可以获得株型、植株色素腺体、茎色、主茎硬度粗细、茎毛、叶毛多少、叶片形状、叶片颜色、叶片大小、株高、果枝数、果枝类型、花冠色、苞叶形状、苞叶大小、铃着生方式、铃色、铃形、单株铃数、纤维颜色等大量的表型性状数据,是棉花科学研究工作尤其是种质资源研究最重要的基础性研究工作。
拍摄典型单株形态照片,既是对研究对象形态特征特性信息的客观反映和真实再现,也是对研究对象特征特性信息的固定和保存。棉花典型单株形态照片对棉花科学研究工作具有十分重要的作用和意义。
但长期以来,棉花科研工作中,棉花典型单株形态照片的拍摄并未有一个统一和规范的拍摄方法,在拍摄效率和效果上都不尽如人意。难以满足像棉花种质资源精准鉴定试验研究对大批量上千份试验材料同一时间段内精准高效的拍摄要求。
发明内容
针对现有技术中棉花科研工作中,棉花典型单株形态照片的拍摄没有一个统一和规范的拍摄方法,在拍摄效率低,拍摄效果差的问题,本发明提供了一种棉花单株形态照片的拍摄方法及其辅助装置,与现有技术相比,本发明方法和辅助装置使得拍摄手段和方法进行了统一,获得了一致性好的各阶段照片,而且能够对拍摄时间进行精准控制,方便了不同时间段拍摄的照片进行比对分析,而且能够满足田间、温棚、实验室等多个拍摄环境,在作物种质资源研究领域具有广泛的适用性。
为了解决上述问题,本发明采用的技术方案如下:
本发明提供的一种棉花单株形态照片的拍摄方法,包括如下步骤:
(1)在田间试验小区选择好典型单株后,用工具将该单株连根拔起,注意避免损伤单株,保持单株完整形态。
(2)在田间试验小区行间,用辅助装置将单株固定在装置上部、识别生长期寻找最佳角度,然后将固定有单株的辅助装置插入地下保持直立固定。
(3)拍摄机构调整角度背对阳光以蓝天为背景对最佳角度单株进行拍摄。
(4)取下该单株,开始下一单株拍摄。
本发明中,拍摄机构设有摄像机转动控制系统,摄像机转动控制系统包括角度调节电机、电机控制系统和图像识别对比系统。
本发明中,拍摄机构上设有信号传输线,信号传输线将拍摄图片和拍摄时间信息传输给计算机,计算机的图像特征识别系统识别获得的图片特征并保存。
本发明中,图像特征识别系统通过算法自动识别拍摄对象蕾期-吐絮期的果枝、主茎,花铃期的茎、果枝、叶及其花和铃,吐絮期的吐絮铃,通过对棉花典型单株观察鉴定,获得株型、植株色素腺体、茎色、主茎硬度粗细、茎毛、叶毛多少、叶片形状、叶片颜色、叶片大小、株高、果枝数、果枝类型、花冠色、苞叶形状、苞叶大小、铃着生方式、铃色、铃形、单株铃数、纤维颜色的表型性状数据,并保存在系统数据库,供后期对比分析。
本发明中,电机控制系统控制摄像机上下左右移动,并显示当前摄像机以控制杆为基准的垂直与水平角度,当按下“拍摄”键,系统采集摄像机加传影像数据,并对该植株转动相机识别棉花特征判断,判断结果数据在右下方显示并保存到系统数据库,当按下“自动拍摄”键,系统自动判断棉花生长阶段,根据不同生长期的特定位置,调整植株被拍摄位置一致,对该植株转动相机识别棉花特征判断,自动判定该植株所在阶段拍摄关键位置并调整各相机角度,自动回显拍摄结果和保存到系统数据库。
本发明中,电机控制系统具体程序如下:
package test;
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
public class PositionController extends JFrame {
MyPanel mp = null;
public static void main(String[] args) {
// TODO Auto-generated method stub
PositionController demo = new PositionController();
}
// 构造函数
public PositionController() {
mp = new MyPanel();
// mp加入到JFrame
this.add(mp); // 每定义一个 Demo9_4 都会产生一个对应的this
// 添加监听
this.addKeyListener(mp); // 键盘监听这个类所定义的对象用mp对象进行监听
this.setSize(400, 300);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setVisible(true);
}
}
// 定义的面板
class MyPanel extends JPanel implements KeyListener {
int x = 10;
int y = 10;
public void paint(Graphics g) {
super.paint(g);
g.setColor(Color.BLUE);
g.fillOval(x, y, 20, 20);
}
// 键被按下
public void keyPressed(KeyEvent arg0) {
// TODO Auto-generated method stub
// System.out.println("键被按下"+(char)arg0.getKeyCode() );
if (arg0.getKeyCode() == KeyEvent.VK_UP) {
// System.out.println("键被按上");
y -= 10;
}
if (arg0.getKeyCode() == KeyEvent.VK_DOWN) {
// System.out.println("键被按上");
y += 10;
}
if (arg0.getKeyCode() == KeyEvent.VK_LEFT) {
// System.out.println("键被按左");
x -= 10;
}
if (arg0.getKeyCode() == KeyEvent.VK_RIGHT) {
// System.out.println("键被按右");
x += 10;
}
// 调用 repaint() 函数,来重绘制界面
this.repaint();
}
// 键被释放
public void keyReleased(KeyEvent arg0) {
// TODO Auto-generated method stub
}
// 键的一个值被打印输出
public void keyTyped(KeyEvent arg0) {
// TODO Auto-generated method stub
}
}
本发明中,图像特征识别系统具体程序如下:
/**
* 分析对象属性
*
*/
public class PieData {
private String data;//关键位置
private String dataTemp;//株型
private String idLNG;//植株色素腺体
private String idLAT;//茎色
private String idPAK;//主茎硬度粗细
private String idTMA;//茎毛
private String ym;//叶毛
private String ypxz;//叶片形状
private String ypys;//叶片颜色
private String ypdx;//叶片大小
private String gzs;//果枝数
private String gzlx;//果枝类型
private String hgs;//花冠色
private String byxz;//苞叶形状
private String bydx;//苞叶大小
private String lzfs;//铃着生方式
private String ls;//铃色
private String dzls;//单株铃数
private String qwys;//纤维颜色
public String getData() {
return data;
}
public void setData(String data) {
this.data = data;
}
public String getDataTemp() {
return dataTemp;
}
public void setDataTemp(String dataTemp) {
this.dataTemp = dataTemp;
}
public String getIdLNG() {
return idLNG;
}
public void setIdLNG(String idLNG) {
this.idLNG = idLNG;
}
public String getIdLAT() {
return idLAT;
}
public void setIdLAT(String idLAT) {
this.idLAT = idLAT;
}
public String getIdPAK() {
return idPAK;
}
public void setIdPAK(String idPAK) {
this.idPAK = idPAK;
}
public String getIdTMA() {
return idTMA;
}
public void setIdTMA(String idTMA) {
this.idTMA = idTMA;
}
public String getIdTIP() {
return idTIP;
}
public void setIdTIP(String idTIP) {
this.idTIP = idTIP;
}
}
<!-- 数据库检索 -->
<xml version="1.0" encoding="UTF-8" >
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="test.DataDao">
<resultMap type="Data" id="DataResult">
<result property="dataTemp" column="temp" />
<result property="idLNG" column="jd" />
<result property="idLAT" column="wd" />
<result property="idPAK" column="sjb" />
<result property="idTMA" column="mac" />
<result property="idTIP" column="ip" />
<result property="data" column="mkdy" />
</resultMap>
<!-- 查询 (匹配有值的字段)-->
<select id="selectList" parameterType="Map" resultMap="DataResult">
SELECT * FROM flowers ORDER BY createTime DESC LIMIT 1
</select>
</mapper>
/**
*
*数据采集与获取处理
*
**/
import java.util.List;
import java.util.Map;
import javax.annotation.Resource;
import org.springframework.stereotype.Service;
import test.DataDao;
import test.PieData;
import test.DataService;
@Service("DataService")
public class DataSercviceImpl implements DataService {
@Resource
private DataDao DataDao;
@Override
public List<Data> select(Map<String, Object> map) {
return DataDao.select(map);
}
}
/**
*
* 显示处理逻辑控制
*
**/
@RequestMapping("/listData")
public String listData(Temp param, HttpServletRequest request,HttpServletResponse response) throws Exception {
JSONObject json = new JSONObject();
Map<String, Object> map = new HashMap<String, Object>();
Series series=new Series();
ItemStyle itemStyle=new ItemStyle();
Normal noraml=new Normal();
Label label=new Label();
//插入语句功能
try {
map.put("deviceNo","6");
List<Temp> list = tempService.select(map);
int[] data =new int[24];
/**
series: [{
data: [28, 27, 24, 26, 27, 28, 27, 28, 27, 27, 28, 27, 27,28, 257, 28, 27, 27, 28, 27, 27, 27, 28, 27],
type: 'line',
itemStyle : { normal: {label : {show: true}}}//显示数字
}]
*/
//json格式拼接
/**拼接type**/
series.setType("line");
/**拼接itemStyle**/
label.setShow(true);
noraml.setLabel(label);
itemStyle.setNormal(noraml);
series.setItemStyle(itemStyle);
/**拼接data**/
for(int j=0;j<list.size();j++){
data[j]=Integer.parseInt(list.get(j).getTemp());
}
series.setData(data);
/**返回检查拍摄结果数据集**/
JSONArray jsonArray = JSONArray.fromObject(series);
json.put("series", jsonArray);
json.put("authCode", "success");
// json.put("authCode", "success");
} catch (Exception e) {
logger.info(e);
json.put("message", "拍摄数据集获取失败!");
json.put("authCode", "failed");
}
response.setHeader("Access-Control-Allow-Origin", "*");
ResponseUtil.write(response, json);
return null;
}
本发明中,图像识别对比系统具体程序如下:
#!bin/evn python
# -*-coding:utf8-*-
import base64
import sys
import os
import logging
import datetime
import re
import multiprocessing
# from pylab import *
from PIL import Image
import cv2
from bceocrapi import BceOCRAPI
from bin.python.models.images import Images
from nude import Nude
import imagehash
from bin.python.utils import logger
from bin.python.models.redis_results import RedisResults
Image.LOAD_TRUNCATED_IMAGES = True
reload(sys)
sys.setdefaultencoding('utf-8')
IMAGE_DIR = "public/uploads/api/"
class Api:
def __init__(self):
self.IMAGE_HASH = ""
# 获取图片哈希值
def get_image_hash(self,file):
img = Image.open(file)
h = str(imagehash.dhash(img))
return h
# 图像识别
def face(self,file):
# Get user supplied values
oriImg = IMAGE_DIR + file
cascPath = "./data/lbpcascades/lbpcascade_frontalface.xml"
facecascade = cv2.CascadeClassifier(cascPath)
# 读取图像数据
image = cv2.imread(oriImg)
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
gray = cv2.equalizeHist(gray, gray) # 直方图均衡化:直方图均衡化是通过拉伸像素强度分布范围来增强图像对比度的一种方法。
gray = cv2.medianBlur(gray, 3) # 降噪
(height, width, a) = image.shape
# Detect faces in the image
faces = facecascade.detectMultiScale(
gray,
scaleFactor=1.1,
minNeighbors=2,
minSize=(30, 30),
flags=cv2.cv.CV_HAAR_SCALE_IMAGE
)
# 关键部位识别。
faces_area = []
face_count = 0
for (x, y, w, h) in faces:
face_area = w * h
# 拍摄位置占整体的比例
face_scale = (face_area) / float(height * width) * 100
# print("name %s,scale %s,x %s,y %s,w %s,h %s,area %s" %(file,face_scale,x,y,w,h,face_area))
# if face_scale<0.5:
# continue
faces_area.append(face_area)
faces_new = []
if(len(faces_area)>1):
face_max = max(faces_area)
for index,face in enumerate(faces) :
(x, y, w, h) = face
scale = (w*h)/float(face_max) * 100
# print("scale %s" % (scale))
if(scale<50):
# delete(faces,index,axis=0)
pass
else:
faces_new.append(face)
else:
faces_new = faces
return faces_new
#色彩识别
def blackWhite(self,filename):
image_file = Image.open(IMAGE_DIR+filename) # open colour image
#exception : Premature end of JPEG file . IOError: image file istruncated (1 bytes not processed)
try:
image_file = image_file.convert('L') # convert image to blackand white
except Exception as e:
raise
return IMAGE_DIR+filename
dst_path = IMAGE_DIR+"wb"+filename
image_file.save(dst_path)
return dst_path
#图像压缩处理
disImg = IMAGE_DIR +"ocrdis"+file
newImg = self.resizeImg(ori_img=newImg,dst_img=disImg,dst_w=1600,dst_h=1600,save_q=100)
with open(newImg, 'rb') as f:
content = f.read()
content = base64.b64encode(content)
try:
# ocr
# result = ocr.get_ocr_text(content, language='CHN_ENG')
result = ocr.get_ocr_text(content, language='ENG')
# print("file:"+file+"----------result:"+result)
# conf.info("file:"+file+"----------result:"+result)
return result
except Exception as e:
raise
# 图片如果宽或高大于300则等比例压缩
def resizeImg(self,**args):
args_key = {'ori_img': '', 'dst_img': '', 'dst_w': '', 'dst_h':'', 'save_q': 75}
arg = {}
for key in args_key:
if key in args:
arg[key] = args[key]
im = Image.open(arg['ori_img'])
ori_w, ori_h = im.size
widthRatio = heightRatio = None
ratio = 1
if (ori_w and ori_w > arg['dst_w']) or (ori_h and ori_h > arg['dst_h']):
if arg['dst_w'] and ori_w > arg['dst_w']:
widthRatio = float(arg['dst_w']) / ori_w # 正确获取小数的方式
if arg['dst_h'] and ori_h > arg['dst_h']:
heightRatio = float(arg['dst_h']) / ori_h
if widthRatio and heightRatio:
if widthRatio < heightRatio:
ratio = widthRatio
else:
ratio = heightRatio
if widthRatio and not heightRatio:
ratio = widthRatio
if heightRatio and not widthRatio:
ratio = heightRatio
newWidth = int(ori_w * ratio)
newHeight = int(ori_h * ratio)
else:
newWidth = ori_w
newHeight = ori_h
im.resize((newWidth, newHeight), Image.ANTIALIAS).save(arg['dst_img'], quality=arg['save_q'])
return arg['dst_img']
# 影像裁剪
def cropImg(self, file, faces):
oriImg = IMAGE_DIR + file
ipl_image = Image.open(oriImg)
# print(ipl_image.height)
if (len(faces) < 1):
# print("no face")
return faces
(x, y, w, h) = faces[0]
yy = int(y + 1.5*h)
hh = h * 6
(width, height) = ipl_image.size
if (hh > height - y):
hh = height - y
if(yy>=height):
return False
dst = ipl_image.crop((x, yy, x + w, y + hh))
dst.save(IMAGE_DIR + file)
#鉴别黄色图片
def isnude(self,file):
#图像压缩处理
imagePath = IMAGE_DIR + file
nudeImg = IMAGE_DIR +"nude_"+file
self.resizeImg(ori_img=imagePath,dst_img=nudeImg,dst_w=300,dst_h=300,save_q=100)
faces = self.face("nude_"+file)
self.cropImg("nude_"+file,faces)
n = Nude(nudeImg)
# n.setFaces(faces)
# n.resize(1000,1000)
n.parse()
# print n.result
return 1 if n.result else 0
# 果数识别
def countdigits(self,s):
digitpatt = re.compile('\d')
return len(digitpatt.findall(s))
# 图片特性识别
def one(self,file):
filepath = IMAGE_DIR+file
if(os.path.isfile(filepath)):
self.IMAGE_HASH = self.get_image_hash(filepath)
redis_result = self.get_result_from_redis(self.IMAGE_HASH)
is_pass = 1
#特征检测
fc = self.face(file)
if(len(fc)!=1):
l = -1
is_nude = -1
is_pass = 0
else:
#ocr
text = ""
text = self.ocr(file)
text = text.encode("utf-8")
l = self.countdigits(text)
if (l > 6):
is_nude = -1
is_pass = 0
else:
is_nude = self.isnude(file)
if(is_nude==1):
is_pass = 0
#保存图像数据
self.delImg(file)
# print {"face_count":len(fc),"digital_count":l,"is_nude":is_nude,"pass":is_pass}
result = str(len(fc))+","+str(l)+","+str(is_nude)+","+str(is_pass)
self.save_redis(self.IMAGE_HASH,result)
print result
else:
print("error:",file, "is not a img file")
if __name__ == '__main__':
api = Api()
api.one(sys.argv[1])
# api.one("9d27d550-4beb-11e6-aefd-4f827560e966.png")
# api.one("91787150-4bf1-11e6-aefd-4f827560e966.png")
pass。
本发明的一种棉花单株形态照片的拍摄方法所用到辅助装置,包括主体,所述的主体内部套接有钢钎,主体外部套接有嵌套管,嵌套管外部套接有夹持架,夹持架上设有夹持机构;钢钎底部设有插入端,钢钎侧壁设有T字架,主体侧壁设有活动孔,T字架从活动孔延伸出主体外部;夹持架底部设有压柄,压柄一端设有顶杆,顶杆和压柄之间设有压力弹簧,顶杆靠近嵌套管的一端设有防滑垫;夹持架上设有定位轴,定位轴外套接有夹持机构;夹持机构尾部两侧设有压板,压板之间设有扭力弹簧;夹持机构由若干组夹齿组成,每一组夹齿尾部都设有扭力弹簧,每一组夹齿套接在定位轴上。
本发明中,嵌套管底部和主体之间设有第一旋钮,主体底部和钢钎之间设有第二旋钮。
使用本发明提供的技术方案可以达到如下有益效果:
本发明提供的一种棉花单株形态照片的拍摄方法及其辅助装置,能够达到以三个方面的有益效果:
(1)拍摄效果可控。拍摄图片以统一高度的蓝天做背景,而且借助辅助装置能够利用统一角度的自然阳光进行拍摄,使得拍摄效果相对统一可控。
(2)拍摄效果佳。有效避免周边光影干扰,彻底消除背景杂乱和背景阴影,最大限度客观真实表现反映试验材料特征特性。
(3)简单高效低成本。利用本发明方法和装置一人即可独立完成田间试验小区棉花典型单株采取、固定和拍摄的全过程。不需要额外的人员及装备。本发明之辅助装置简单可靠实用低成本,各时间拍摄的图片能够准确记录和方便调取比对,方便了科学研究,而且经过长期记录保存能够为棉花种质资源和育种的科学研究领域积累大量的参考数据,在作物种质资源和育种研究领域具有广泛的实用性。
附图说明:
图1显示为本发明的电机控制系统界面图。
图2为本发明图像识别对比系统原理图。
图3为本发明图像特征识别系统界面图。
图4为本发明辅助装置结构示意图。
图5为本发明辅助装置剖视结构示意图。
图6为本发明辅助装置夹持机构结构示意图。
图7为本发明辅助装置夹持机构局部结构示意图。
图4-7中,1-主体、2-钢钎、3-嵌套管、4-插入端、5-夹持架、6-T字架、7-压柄、8-防滑垫、9-夹持机构、10-扭力弹簧、11-定位轴、12-顶杆、13-压力弹簧、14-压板、15-第一旋钮、16-第二旋钮。
具体实施方式
下面结合附图1-7和实施例,对本发明的具体实施方式作进一步详细描述,但本发明不限于下述实施例。
实施例一:本发明棉花单株形态照片的拍摄方法
为了解决上述问题,本发明采用的技术方案如下:
本发明提供的一种棉花单株形态照片的拍摄方法,包括如下步骤:
(1)在田间试验小区选择好典型单株后,用工具将该单株连根拔起,注意避免损伤单株,保持单株完整形态。
(2)在田间试验小区行间,用辅助装置将单株固定在装置上部、识别生长期寻找最佳角度,然后将固定有单株的辅助装置插入地下保持直立固定。
(3)拍摄机构调整角度背对阳光以蓝天为背景对最佳角度单株进行拍摄。
(4)取下该单株,开始下一单株拍摄。
本发明中,拍摄机构设有摄像机转动控制系统,摄像机转动控制系统包括角度调节电机、电机控制系统和图像识别对比系统。图像识别对比系统会识别棉花植株目前的生长阶段,选取需要拍照的部位。电机控制系统指挥角度调节电机根据棉花植株生长的阶段调节拍摄位置从而保证获得该阶段所要拍摄的部位。
本发明中,拍摄机构上设有信号传输线,信号传输线将拍摄图片和拍摄时间信息传输给计算机,计算机的图像特征识别系统识别获得的图片特征并保存。拍摄机构包括相机和电动云台。
实施例二:本发明电机控制系统
本发明中,电机控制系统控制摄像机上下左右移动,并显示当前摄像机以控制杆为基准的垂直与水平角度,当按下“拍摄”键,系统采集摄像机加传影像数据,并对该植株转动相机识别棉花特征判断,判断结果数据在右下方显示并保存到系统数据库,当按下“自动拍摄”键,系统自动判断棉花生长阶段,根据不同生长期的特定位置,调整植株被拍摄位置一致,对该植株转动相机识别棉花特征判断,自动判定该植株所在阶段拍摄关键位置并调整各相机角度,自动回显拍摄结果和保存到系统数据库。参考附图1。
电机控制系统具体程序如下:
package test;
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
public class PositionController extends JFrame {
MyPanel mp = null;
public static void main(String[] args) {
// TODO Auto-generated method stub
PositionController demo = new PositionController();
}
// 构造函数
public PositionController() {
mp = new MyPanel();
// mp加入到JFrame
this.add(mp); // 每定义一个 Demo9_4 都会产生一个对应的this
// 添加监听
this.addKeyListener(mp); // 键盘监听这个类所定义的对象用mp对象进行监听
this.setSize(400, 300);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setVisible(true);
}
}
// 定义的面板
class MyPanel extends JPanel implements KeyListener {
int x = 10;
int y = 10;
public void paint(Graphics g) {
super.paint(g);
g.setColor(Color.BLUE);
g.fillOval(x, y, 20, 20);
}
// 键被按下
public void keyPressed(KeyEvent arg0) {
// TODO Auto-generated method stub
// System.out.println("键被按下"+(char)arg0.getKeyCode() );
if (arg0.getKeyCode() == KeyEvent.VK_UP) {
// System.out.println("键被按上");
y -= 10;
}
if (arg0.getKeyCode() == KeyEvent.VK_DOWN) {
// System.out.println("键被按上");
y += 10;
}
if (arg0.getKeyCode() == KeyEvent.VK_LEFT) {
// System.out.println("键被按左");
x -= 10;
}
if (arg0.getKeyCode() == KeyEvent.VK_RIGHT) {
// System.out.println("键被按右");
x += 10;
}
// 调用 repaint() 函数,来重绘制界面
this.repaint();
}
// 键被释放
public void keyReleased(KeyEvent arg0) {
// TODO Auto-generated method stub
}
// 键的一个值被打印输出
public void keyTyped(KeyEvent arg0) {
// TODO Auto-generated method stub
}
}。
实施例三:本发明图像识别对比系统
自动识别中的核心算法,K-Means 算法是一种聚类分析的算法。K-Means聚类的目的是:把n个点(可以是样本的一次观察或一个实例)划分到k个聚类中,使得每个点都属于离他最近的均值(此即聚类中心)对应的聚类,以之作为聚类的标准。在计算机视觉领域中,空间中同一平面的任意两幅图像可以通过单应性关联在一起。比如一个物体可以通过旋转相机镜头获取两张不同的照片(这两张照片的内容不一定要完全对应,部分对应即可),我们可以把单应性设为一个二维矩阵M,那么照片1乘以M就是照片2。这有着很多实际应用,比如图像校正、图像对齐或两幅图像之间的相机运动计算(旋转和平移)等。参考附图2。
图像识别对比系统具体程序如下:
#!bin/evn python
# -*-coding:utf8-*-
import base64
import sys
import os
import logging
import datetime
import re
import multiprocessing
# from pylab import *
from PIL import Image
import cv2
from bceocrapi import BceOCRAPI
from bin.python.models.images import Images
from nude import Nude
import imagehash
from bin.python.utils import logger
from bin.python.models.redis_results import RedisResults
Image.LOAD_TRUNCATED_IMAGES = True
reload(sys)
sys.setdefaultencoding('utf-8')
IMAGE_DIR = "public/uploads/api/"
class Api:
def __init__(self):
self.IMAGE_HASH = ""
# 获取图片哈希值
def get_image_hash(self,file):
img = Image.open(file)
h = str(imagehash.dhash(img))
return h
# 图像识别
def face(self,file):
# Get user supplied values
oriImg = IMAGE_DIR + file
cascPath = "./data/lbpcascades/lbpcascade_frontalface.xml"
facecascade = cv2.CascadeClassifier(cascPath)
# 读取图像数据
image = cv2.imread(oriImg)
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
gray = cv2.equalizeHist(gray, gray) # 直方图均衡化:直方图均衡化是通过拉伸像素强度分布范围来增强图像对比度的一种方法。
gray = cv2.medianBlur(gray, 3) # 降噪
(height, width, a) = image.shape
# Detect faces in the image
faces = facecascade.detectMultiScale(
gray,
scaleFactor=1.1,
minNeighbors=2,
minSize=(30, 30),
flags=cv2.cv.CV_HAAR_SCALE_IMAGE
)
# 关键部位识别。
faces_area = []
face_count = 0
for (x, y, w, h) in faces:
face_area = w * h
# 拍摄位置占整体的比例
face_scale = (face_area) / float(height * width) * 100
# print("name %s,scale %s,x %s,y %s,w %s,h %s,area %s" %(file,face_scale,x,y,w,h,face_area))
# if face_scale<0.5:
# continue
faces_area.append(face_area)
faces_new = []
if(len(faces_area)>1):
face_max = max(faces_area)
for index,face in enumerate(faces) :
(x, y, w, h) = face
scale = (w*h)/float(face_max) * 100
# print("scale %s" % (scale))
if(scale<50):
# delete(faces,index,axis=0)
pass
else:
faces_new.append(face)
else:
faces_new = faces
return faces_new
#色彩识别
def blackWhite(self,filename):
image_file = Image.open(IMAGE_DIR+filename) # open colour image
#exception : Premature end of JPEG file . IOError: image file istruncated (1 bytes not processed)
try:
image_file = image_file.convert('L') # convert image to blackand white
except Exception as e:
raise
return IMAGE_DIR+filename
dst_path = IMAGE_DIR+"wb"+filename
image_file.save(dst_path)
return dst_path
#图像压缩处理
disImg = IMAGE_DIR +"ocrdis"+file
newImg = self.resizeImg(ori_img=newImg,dst_img=disImg,dst_w=1600,dst_h=1600,save_q=100)
with open(newImg, 'rb') as f:
content = f.read()
content = base64.b64encode(content)
try:
# ocr
# result = ocr.get_ocr_text(content, language='CHN_ENG')
result = ocr.get_ocr_text(content, language='ENG')
# print("file:"+file+"----------result:"+result)
# conf.info("file:"+file+"----------result:"+result)
return result
except Exception as e:
raise
# 图片如果宽或高大于300则等比例压缩
def resizeImg(self,**args):
args_key = {'ori_img': '', 'dst_img': '', 'dst_w': '', 'dst_h':'', 'save_q': 75}
arg = {}
for key in args_key:
if key in args:
arg[key] = args[key]
im = Image.open(arg['ori_img'])
ori_w, ori_h = im.size
widthRatio = heightRatio = None
ratio = 1
if (ori_w and ori_w > arg['dst_w']) or (ori_h and ori_h > arg['dst_h']):
if arg['dst_w'] and ori_w > arg['dst_w']:
widthRatio = float(arg['dst_w']) / ori_w # 正确获取小数的方式
if arg['dst_h'] and ori_h > arg['dst_h']:
heightRatio = float(arg['dst_h']) / ori_h
if widthRatio and heightRatio:
if widthRatio < heightRatio:
ratio = widthRatio
else:
ratio = heightRatio
if widthRatio and not heightRatio:
ratio = widthRatio
if heightRatio and not widthRatio:
ratio = heightRatio
newWidth = int(ori_w * ratio)
newHeight = int(ori_h * ratio)
else:
newWidth = ori_w
newHeight = ori_h
im.resize((newWidth, newHeight), Image.ANTIALIAS).save(arg['dst_img'], quality=arg['save_q'])
return arg['dst_img']
# 影像裁剪
def cropImg(self, file, faces):
oriImg = IMAGE_DIR + file
ipl_image = Image.open(oriImg)
# print(ipl_image.height)
if (len(faces) < 1):
# print("no face")
return faces
(x, y, w, h) = faces[0]
yy = int(y + 1.5*h)
hh = h * 6
(width, height) = ipl_image.size
if (hh > height - y):
hh = height - y
if(yy>=height):
return False
dst = ipl_image.crop((x, yy, x + w, y + hh))
dst.save(IMAGE_DIR + file)
#鉴别黄色图片
def isnude(self,file):
#图像压缩处理
imagePath = IMAGE_DIR + file
nudeImg = IMAGE_DIR +"nude_"+file
self.resizeImg(ori_img=imagePath,dst_img=nudeImg,dst_w=300,dst_h=300,save_q=100)
faces = self.face("nude_"+file)
self.cropImg("nude_"+file,faces)
n = Nude(nudeImg)
# n.setFaces(faces)
# n.resize(1000,1000)
n.parse()
# print n.result
return 1 if n.result else 0
# 果数识别
def countdigits(self,s):
digitpatt = re.compile('\d')
return len(digitpatt.findall(s))
# 图片特性识别
def one(self,file):
filepath = IMAGE_DIR+file
if(os.path.isfile(filepath)):
self.IMAGE_HASH = self.get_image_hash(filepath)
redis_result = self.get_result_from_redis(self.IMAGE_HASH)
is_pass = 1
#特征检测
fc = self.face(file)
if(len(fc)!=1):
l = -1
is_nude = -1
is_pass = 0
else:
#ocr
text = ""
text = self.ocr(file)
text = text.encode("utf-8")
l = self.countdigits(text)
if (l > 6):
is_nude = -1
is_pass = 0
else:
is_nude = self.isnude(file)
if(is_nude==1):
is_pass = 0
#保存图像数据
self.delImg(file)
# print {"face_count":len(fc),"digital_count":l,"is_nude":is_nude,"pass":is_pass}
result = str(len(fc))+","+str(l)+","+str(is_nude)+","+str(is_pass)
self.save_redis(self.IMAGE_HASH,result)
print result
else:
print("error:",file, "is not a img file")
if __name__ == '__main__':
api = Api()
api.one(sys.argv[1])
# api.one("9d27d550-4beb-11e6-aefd-4f827560e966.png")
# api.one("91787150-4bf1-11e6-aefd-4f827560e966.png")
pass。
实施例四:本发明图像特征识别系统
本发明中,图像特征识别系统通过算法自动识别拍摄对象蕾期-吐絮期的果枝、主茎,花铃期的茎、果枝、叶及其花和铃,吐絮期的吐絮铃,通过对棉花典型单株观察鉴定,获得株型、植株色素腺体、茎色、主茎硬度粗细、茎毛、叶毛多少、叶片形状、叶片颜色、叶片大小、株高、果枝数、果枝类型、花冠色、苞叶形状、苞叶大小、铃着生方式、铃色、铃形、单株铃数、纤维颜色的表型性状数据,并保存在系统数据库,供后期对比分析。参考附图3。
图像特征识别系统具体程序如下:
/**
* 分析对象属性
*
*/
public class PieData {
private String data;//关键位置
private String dataTemp;//株型
private String idLNG;//植株色素腺体
private String idLAT;//茎色
private String idPAK;//主茎硬度粗细
private String idTMA;//茎毛
private String ym;//叶毛
private String ypxz;//叶片形状
private String ypys;//叶片颜色
private String ypdx;//叶片大小
private String gzs;//果枝数
private String gzlx;//果枝类型
private String hgs;//花冠色
private String byxz;//苞叶形状
private String bydx;//苞叶大小
private String lzfs;//铃着生方式
private String ls;//铃色
private String dzls;//单株铃数
private String qwys;//纤维颜色
public String getData() {
return data;
}
public void setData(String data) {
this.data = data;
}
public String getDataTemp() {
return dataTemp;
}
public void setDataTemp(String dataTemp) {
this.dataTemp = dataTemp;
}
public String getIdLNG() {
return idLNG;
}
public void setIdLNG(String idLNG) {
this.idLNG = idLNG;
}
public String getIdLAT() {
return idLAT;
}
public void setIdLAT(String idLAT) {
this.idLAT = idLAT;
}
public String getIdPAK() {
return idPAK;
}
public void setIdPAK(String idPAK) {
this.idPAK = idPAK;
}
public String getIdTMA() {
return idTMA;
}
public void setIdTMA(String idTMA) {
this.idTMA = idTMA;
}
public String getIdTIP() {
return idTIP;
}
public void setIdTIP(String idTIP) {
this.idTIP = idTIP;
}
}
<!-- 数据库检索 -->
<xml version="1.0" encoding="UTF-8" >
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="test.DataDao">
<resultMap type="Data" id="DataResult">
<result property="dataTemp" column="temp" />
<result property="idLNG" column="jd" />
<result property="idLAT" column="wd" />
<result property="idPAK" column="sjb" />
<result property="idTMA" column="mac" />
<result property="idTIP" column="ip" />
<result property="data" column="mkdy" />
</resultMap>
<!-- 查询 (匹配有值的字段)-->
<select id="selectList" parameterType="Map" resultMap="DataResult">
SELECT * FROM flowers ORDER BY createTime DESC LIMIT 1
</select>
</mapper>
/**
*
*数据采集与获取处理
*
**/
import java.util.List;
import java.util.Map;
import javax.annotation.Resource;
import org.springframework.stereotype.Service;
import test.DataDao;
import test.PieData;
import test.DataService;
@Service("DataService")
public class DataSercviceImpl implements DataService {
@Resource
private DataDao DataDao;
@Override
public List<Data> select(Map<String, Object> map) {
return DataDao.select(map);
}
}
/**
*
* 显示处理逻辑控制
*
**/
@RequestMapping("/listData")
public String listData(Temp param, HttpServletRequest request,HttpServletResponse response) throws Exception {
JSONObject json = new JSONObject();
Map<String, Object> map = new HashMap<String, Object>();
Series series=new Series();
ItemStyle itemStyle=new ItemStyle();
Normal noraml=new Normal();
Label label=new Label();
//插入语句功能
try {
map.put("deviceNo","6");
List<Temp> list = tempService.select(map);
int[] data =new int[24];
/**
series: [{
data: [28, 27, 24, 26, 27, 28, 27, 28, 27, 27, 28, 27, 27,28, 257, 28, 27, 27, 28, 27, 27, 27, 28, 27],
type: 'line',
itemStyle : { normal: {label : {show: true}}}//显示数字
}]
*/
//json格式拼接
/**拼接type**/
series.setType("line");
/**拼接itemStyle**/
label.setShow(true);
noraml.setLabel(label);
itemStyle.setNormal(noraml);
series.setItemStyle(itemStyle);
/**拼接data**/
for(int j=0;j<list.size();j++){
data[j]=Integer.parseInt(list.get(j).getTemp());
}
series.setData(data);
/**返回检查拍摄结果数据集**/
JSONArray jsonArray = JSONArray.fromObject(series);
json.put("series", jsonArray);
json.put("authCode", "success");
// json.put("authCode", "success");
} catch (Exception e) {
logger.info(e);
json.put("message", "拍摄数据集获取失败!");
json.put("authCode", "failed");
}
response.setHeader("Access-Control-Allow-Origin", "*");
ResponseUtil.write(response, json);
return null;
}
实施例五:本发明棉花单株形态照片的拍摄方法所用到辅助装置
如参考附图4-7所示,本发明的一种棉花单株形态照片的拍摄方法所用到辅助装置,包括主体1,所述的主体1内部套接有钢钎2,主体1外部套接有嵌套管3,嵌套管3外部套接有夹持架5,夹持架5上设有夹持机构9;钢钎2底部设有插入端4,钢钎2侧壁设有T字架6,主体1侧壁设有活动孔,T字架6从活动孔延伸出主体1外部;夹持架5底部设有压柄7,压柄7一端设有顶杆12,顶杆12和压柄7之间设有压力弹簧13,顶杆12靠近嵌套管3的一端设有防滑垫8;夹持架5上设有定位轴11,定位轴11外套接有夹持机构9;夹持机构9尾部两侧设有压板14,压板14之间设有扭力弹簧10;夹持机构9由若干组夹齿组成,每一组夹齿尾部都设有扭力弹簧10,每一组夹齿套接在定位轴11上。
本发明中,嵌套管3底部和主体1之间设有第一旋钮15,主体1底部和钢钎2之间设有第二旋钮16。
在适用本发明棉花单株形态照片的拍摄方法所用到辅助装置时,将脚踩T字架6将钢钎2插入地下,根据植株高度等因素调节T字架6在活动孔中的位置,用第二旋钮16固定主体1和钢钎2相对位置,将铲得的棉花植株插入嵌套管3,按压压柄7调节夹持架5的高度保证能够稳定固定棉花植株,高度调节好后按压压板14使得夹持机构9打开夹持在棉花植株茎秆上,由于夹持机构9分为若干组,能够保证棉花秸秆不同粗细部位都能均匀受力稳定夹持,夹持好后开启拍摄机构和系统开始拍摄并保存图片。
如上所述,即可较好地实现本发明,上述的实施例仅仅是对本发明的优选实施方式进行描述,并非对本发明的范围进行限定,在不脱离本发明设计精神的前提下,本领域普通技术人员对本发明的技术方案作出的各种变形和改进,均应落入本发明确定的保护范围内。

Claims (10)

1.一种棉花单株形态照片的拍摄方法,其特征在于,所述方法包括如下步骤:
(1)在田间试验小区选择好典型单株后,用工具将该单株连根拔起,注意避免损伤单株,保持单株完整形态;
(2)在田间试验小区行间,用辅助装置将单株固定在装置上部、识别生长期寻找最佳角度,然后将固定有单株的辅助装置插入地下保持直立固定;
(3)拍摄机构调整角度背对阳光以蓝天为背景对最佳角度单株进行拍摄;
(4)取下该单株,开始下一单株拍摄。
2.权利要求1所述的一种棉花单株形态照片的拍摄方法,其特征在于,所述拍摄机构设有摄像机转动控制系统,摄像机转动控制系统包括角度调节电机、电机控制系统和图像识别对比系统。
3.利要求1所述的一种棉花单株形态照片的拍摄方法,其特征在于,所述的拍摄机构上设有信号传输线,信号传输线将拍摄图片和拍摄时间信息传输给计算机,计算机的图像特征识别系统识别获得的图片特征并保存。
4.权利要求3所述的一种智能舍友匹配系统,其特征在于,所述的图像特征识别系统通过算法自动识别拍摄对象蕾期-吐絮期的果枝、主茎,花铃期的茎、果枝、叶及其花和铃,吐絮期的吐絮铃,通过对棉花典型单株观察鉴定,获得株型、植株色素腺体、茎色、主茎硬度粗细、茎毛、叶毛多少、叶片形状、叶片颜色、叶片大小、株高、果枝数、果枝类型、花冠色、苞叶形状、苞叶大小、铃着生方式、铃色、铃形、单株铃数、纤维颜色的表型性状数据,并保存在系统数据库,供后期对比分析。
5.权利要求2所述的一种棉花单株形态照片的拍摄方法,其特征在于,所述电机控制系统控制摄像机上下左右移动,并显示当前摄像机以控制杆为基准的垂直与水平角度,当按下“拍摄”键,系统采集摄像机加传影像数据,并对该植株转动相机识别棉花特征判断,判断结果数据在右下方显示并保存到系统数据库,当按下“自动拍摄”键,系统自动判断棉花生长阶段,根据不同生长期的特定位置,调整植株被拍摄位置一致,对该植株转动相机识别棉花特征判断,自动判定该植株所在阶段拍摄关键位置并调整各相机角度,自动回显拍摄结果和保存到系统数据库。
6.权利要求5所述的一种棉花单株形态照片的拍摄方法,其特征在于,所述电机控制系统具体程序如下:
package test;
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
public class PositionController extends JFrame {
MyPanel mp = null;
public static void main(String[] args) {
// TODO Auto-generated method stub
PositionController demo = new PositionController();
}
// 构造函数
public PositionController() {
mp = new MyPanel();
// mp加入到JFrame
this.add(mp); // 每定义一个 Demo9_4 都会产生一个对应的this
// 添加监听
this.addKeyListener(mp); // 键盘监听这个类所定义的对象用mp对象进行监听
this.setSize(400, 300);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setVisible(true);
}
}
// 定义的面板
class MyPanel extends JPanel implements KeyListener {
int x = 10;
int y = 10;
public void paint(Graphics g) {
super.paint(g);
g.setColor(Color.BLUE);
g.fillOval(x, y, 20, 20);
}
// 键被按下
public void keyPressed(KeyEvent arg0) {
// TODO Auto-generated method stub
// System.out.println("键被按下"+(char)arg0.getKeyCode() );
if (arg0.getKeyCode() == KeyEvent.VK_UP) {
// System.out.println("键被按上");
y -= 10;
}
if (arg0.getKeyCode() == KeyEvent.VK_DOWN) {
// System.out.println("键被按上");
y += 10;
}
if (arg0.getKeyCode() == KeyEvent.VK_LEFT) {
// System.out.println("键被按左");
x -= 10;
}
if (arg0.getKeyCode() == KeyEvent.VK_RIGHT) {
// System.out.println("键被按右");
x += 10;
}
// 调用 repaint() 函数,来重绘制界面
this.repaint();
}
// 键被释放
public void keyReleased(KeyEvent arg0) {
// TODO Auto-generated method stub
}
// 键的一个值被打印输出
public void keyTyped(KeyEvent arg0) {
// TODO Auto-generated method stub
}
}。
7.要求4所述的一种棉花单株形态照片的拍摄方法,其特征在于,所述图像特征识别系统具体程序如下:
/**
* 分析对象属性
*
*/
public class PieData {
private String data;//关键位置
private String dataTemp;//株型
private String idLNG;//植株色素腺体
private String idLAT;//茎色
private String idPAK;//主茎硬度粗细
private String idTMA;//茎毛
private String ym;//叶毛
private String ypxz;//叶片形状
private String ypys;//叶片颜色
private String ypdx;//叶片大小
private String gzs;//果枝数
private String gzlx;//果枝类型
private String hgs;//花冠色
private String byxz;//苞叶形状
private String bydx;//苞叶大小
private String lzfs;//铃着生方式
private String ls;//铃色
private String dzls;//单株铃数
private String qwys;//纤维颜色
public String getData() {
return data;
}
public void setData(String data) {
this.data = data;
}
public String getDataTemp() {
return dataTemp;
}
public void setDataTemp(String dataTemp) {
this.dataTemp = dataTemp;
}
public String getIdLNG() {
return idLNG;
}
public void setIdLNG(String idLNG) {
this.idLNG = idLNG;
}
public String getIdLAT() {
return idLAT;
}
public void setIdLAT(String idLAT) {
this.idLAT = idLAT;
}
public String getIdPAK() {
return idPAK;
}
public void setIdPAK(String idPAK) {
this.idPAK = idPAK;
}
public String getIdTMA() {
return idTMA;
}
public void setIdTMA(String idTMA) {
this.idTMA = idTMA;
}
public String getIdTIP() {
return idTIP;
}
public void setIdTIP(String idTIP) {
this.idTIP = idTIP;
}
}
<!-- 数据库检索 -->
<xml version="1.0" encoding="UTF-8" >
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="test.DataDao">
<resultMap type="Data" id="DataResult">
<result property="dataTemp" column="temp" />
<result property="idLNG" column="jd" />
<result property="idLAT" column="wd" />
<result property="idPAK" column="sjb" />
<result property="idTMA" column="mac" />
<result property="idTIP" column="ip" />
<result property="data" column="mkdy" />
</resultMap>
<!-- 查询 (匹配有值的字段)-->
<select id="selectList" parameterType="Map" resultMap="DataResult">
SELECT * FROM flowers ORDER BY createTime DESC LIMIT 1
</select>
</mapper>
/**
*
*数据采集与获取处理
*
**/
import java.util.List;
import java.util.Map;
import javax.annotation.Resource;
import org.springframework.stereotype.Service;
import test.DataDao;
import test.PieData;
import test.DataService;
@Service("DataService")
public class DataSercviceImpl implements DataService {
@Resource
private DataDao DataDao;
@Override
public List<Data> select(Map<String, Object> map) {
return DataDao.select(map);
}
}
/**
*
* 显示处理逻辑控制
*
**/
@RequestMapping("/listData")
public String listData(Temp param, HttpServletRequest request,HttpServletResponse response) throws Exception {
JSONObject json = new JSONObject();
Map<String, Object> map = new HashMap<String, Object>();
Series series=new Series();
ItemStyle itemStyle=new ItemStyle();
Normal noraml=new Normal();
Label label=new Label();
//插入语句功能
try {
map.put("deviceNo","6");
List<Temp> list = tempService.select(map);
int[] data =new int[24];
/**
series: [{
data: [28, 27, 24, 26, 27, 28, 27, 28, 27, 27, 28, 27, 27,28, 257, 28, 27, 27, 28, 27, 27, 27, 28, 27],
type: 'line',
itemStyle : { normal: {label : {show: true}}}//显示数字
}]
*/
//json格式拼接
/**拼接type**/
series.setType("line");
/**拼接itemStyle**/
label.setShow(true);
noraml.setLabel(label);
itemStyle.setNormal(noraml);
series.setItemStyle(itemStyle);
/**拼接data**/
for(int j=0;j<list.size();j++){
data[j]=Integer.parseInt(list.get(j).getTemp());
}
series.setData(data);
/**返回检查拍摄结果数据集**/
JSONArray jsonArray = JSONArray.fromObject(series);
json.put("series", jsonArray);
json.put("authCode", "success");
// json.put("authCode", "success");
} catch (Exception e) {
logger.info(e);
json.put("message", "拍摄数据集获取失败!");
json.put("authCode", "failed");
}
response.setHeader("Access-Control-Allow-Origin", "*");
ResponseUtil.write(response, json);
return null;
}。
8.权利要求2所述的一种棉花单株形态照片的拍摄方法,其特征在于,所述图像识别对比系统具体程序如下:
#!bin/evn python
# -*-coding:utf8-*-
import base64
import sys
import os
import logging
import datetime
import re
import multiprocessing
# from pylab import *
from PIL import Image
import cv2
from bceocrapi import BceOCRAPI
from bin.python.models.images import Images
from nude import Nude
import imagehash
from bin.python.utils import logger
from bin.python.models.redis_results import RedisResults
Image.LOAD_TRUNCATED_IMAGES = True
reload(sys)
sys.setdefaultencoding('utf-8')
IMAGE_DIR = "public/uploads/api/"
class Api:
def __init__(self):
self.IMAGE_HASH = ""
# 获取图片哈希值
def get_image_hash(self,file):
img = Image.open(file)
h = str(imagehash.dhash(img))
return h
# 图像识别
def face(self,file):
# Get user supplied values
oriImg = IMAGE_DIR + file
cascPath = "./data/lbpcascades/lbpcascade_frontalface.xml"
facecascade = cv2.CascadeClassifier(cascPath)
# 读取图像数据
image = cv2.imread(oriImg)
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
gray = cv2.equalizeHist(gray, gray) # 直方图均衡化:直方图均衡化是通过拉伸像素强度分布范围来增强图像对比度的一种方法。
gray = cv2.medianBlur(gray, 3) # 降噪
(height, width, a) = image.shape
# Detect faces in the image
faces = facecascade.detectMultiScale(
gray,
scaleFactor=1.1,
minNeighbors=2,
minSize=(30, 30),
flags=cv2.cv.CV_HAAR_SCALE_IMAGE
)
# 关键部位识别。
faces_area = []
face_count = 0
for (x, y, w, h) in faces:
face_area = w * h
# 拍摄位置占整体的比例
face_scale = (face_area) / float(height * width) * 100
# print("name %s,scale %s,x %s,y %s,w %s,h %s,area %s" %(file,face_scale,x,y,w,h,face_area))
# if face_scale<0.5:
# continue
faces_area.append(face_area)
faces_new = []
if(len(faces_area)>1):
face_max = max(faces_area)
for index,face in enumerate(faces) :
(x, y, w, h) = face
scale = (w*h)/float(face_max) * 100
# print("scale %s" % (scale))
if(scale<50):
# delete(faces,index,axis=0)
pass
else:
faces_new.append(face)
else:
faces_new = faces
return faces_new
#色彩识别
def blackWhite(self,filename):
image_file = Image.open(IMAGE_DIR+filename) # open colour image
#exception : Premature end of JPEG file . IOError: image file istruncated (1 bytes not processed)
try:
image_file = image_file.convert('L') # convert image to blackand white
except Exception as e:
raise
return IMAGE_DIR+filename
dst_path = IMAGE_DIR+"wb"+filename
image_file.save(dst_path)
return dst_path
#图像压缩处理
disImg = IMAGE_DIR +"ocrdis"+file
newImg = self.resizeImg(ori_img=newImg,dst_img=disImg,dst_w=1600,dst_h=1600,save_q=100)
with open(newImg, 'rb') as f:
content = f.read()
content = base64.b64encode(content)
try:
# ocr
# result = ocr.get_ocr_text(content, language='CHN_ENG')
result = ocr.get_ocr_text(content, language='ENG')
# print("file:"+file+"----------result:"+result)
# conf.info("file:"+file+"----------result:"+result)
return result
except Exception as e:
raise
# 图片如果宽或高大于300则等比例压缩
def resizeImg(self,**args):
args_key = {'ori_img': '', 'dst_img': '', 'dst_w': '', 'dst_h':'', 'save_q': 75}
arg = {}
for key in args_key:
if key in args:
arg[key] = args[key]
im = Image.open(arg['ori_img'])
ori_w, ori_h = im.size
widthRatio = heightRatio = None
ratio = 1
if (ori_w and ori_w > arg['dst_w']) or (ori_h and ori_h > arg['dst_h']):
if arg['dst_w'] and ori_w > arg['dst_w']:
widthRatio = float(arg['dst_w']) / ori_w # 正确获取小数的方式
if arg['dst_h'] and ori_h > arg['dst_h']:
heightRatio = float(arg['dst_h']) / ori_h
if widthRatio and heightRatio:
if widthRatio < heightRatio:
ratio = widthRatio
else:
ratio = heightRatio
if widthRatio and not heightRatio:
ratio = widthRatio
if heightRatio and not widthRatio:
ratio = heightRatio
newWidth = int(ori_w * ratio)
newHeight = int(ori_h * ratio)
else:
newWidth = ori_w
newHeight = ori_h
im.resize((newWidth, newHeight), Image.ANTIALIAS).save(arg['dst_img'], quality=arg['save_q'])
return arg['dst_img']
# 影像裁剪
def cropImg(self, file, faces):
oriImg = IMAGE_DIR + file
ipl_image = Image.open(oriImg)
# print(ipl_image.height)
if (len(faces) < 1):
# print("no face")
return faces
(x, y, w, h) = faces[0]
yy = int(y + 1.5*h)
hh = h * 6
(width, height) = ipl_image.size
if (hh > height - y):
hh = height - y
if(yy>=height):
return False
dst = ipl_image.crop((x, yy, x + w, y + hh))
dst.save(IMAGE_DIR + file)
#鉴别黄色图片
def isnude(self,file):
#图像压缩处理
imagePath = IMAGE_DIR + file
nudeImg = IMAGE_DIR +"nude_"+file
self.resizeImg(ori_img=imagePath,dst_img=nudeImg,dst_w=300,dst_h=300,save_q=100)
faces = self.face("nude_"+file)
self.cropImg("nude_"+file,faces)
n = Nude(nudeImg)
# n.setFaces(faces)
# n.resize(1000,1000)
n.parse()
# print n.result
return 1 if n.result else 0
# 果数识别
def countdigits(self,s):
digitpatt = re.compile('\d')
return len(digitpatt.findall(s))
# 图片特性识别
def one(self,file):
filepath = IMAGE_DIR+file
if(os.path.isfile(filepath)):
self.IMAGE_HASH = self.get_image_hash(filepath)
redis_result = self.get_result_from_redis(self.IMAGE_HASH)
is_pass = 1
#特征检测
fc = self.face(file)
if(len(fc)!=1):
l = -1
is_nude = -1
is_pass = 0
else:
#ocr
text = ""
text = self.ocr(file)
text = text.encode("utf-8")
l = self.countdigits(text)
if (l > 6):
is_nude = -1
is_pass = 0
else:
is_nude = self.isnude(file)
if(is_nude==1):
is_pass = 0
#保存图像数据
self.delImg(file)
# print {"face_count":len(fc),"digital_count":l,"is_nude":is_nude,"pass":is_pass}
result = str(len(fc))+","+str(l)+","+str(is_nude)+","+str(is_pass)
self.save_redis(self.IMAGE_HASH,result)
print result
else:
print("error:",file, "is not a img file")
if __name__ == '__main__':
api = Api()
api.one(sys.argv[1])
# api.one("9d27d550-4beb-11e6-aefd-4f827560e966.png")
# api.one("91787150-4bf1-11e6-aefd-4f827560e966.png")
pass。
9.权利要求1所述的一种棉花单株形态照片的拍摄方法所用到辅助装置,包括主体,其特征在于,所述的主体内部套接有钢钎,主体外部套接有嵌套管,嵌套管外部套接有夹持架,夹持架上设有夹持机构;钢钎底部设有插入端,钢钎侧壁设有T字架,主体侧壁设有活动孔,T字架从活动孔延伸出主体外部;夹持架底部设有压柄,压柄一端设有顶杆,顶杆和压柄之间设有压力弹簧,顶杆靠近嵌套管的一端设有防滑垫;夹持架上设有定位轴,定位轴外套接有夹持机构;夹持机构尾部两侧设有压板,压板之间设有扭力弹簧;夹持机构由若干组夹齿组成,每一组夹齿尾部都设有扭力弹簧,每一组夹齿套接在定位轴上。
10.权利要求9所述的一种棉花单株形态照片的拍摄方法所用到辅助装置,其特征在于,所述的嵌套管底部和主体之间设有第一旋钮,主体底部和钢钎之间设有第二旋钮。
CN201910805712.3A 2019-08-29 2019-08-29 一种棉花单株形态照片的拍摄方法及其辅助装置 Active CN110414491B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN201910805712.3A CN110414491B (zh) 2019-08-29 2019-08-29 一种棉花单株形态照片的拍摄方法及其辅助装置

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN201910805712.3A CN110414491B (zh) 2019-08-29 2019-08-29 一种棉花单株形态照片的拍摄方法及其辅助装置

Publications (2)

Publication Number Publication Date
CN110414491A true CN110414491A (zh) 2019-11-05
CN110414491B CN110414491B (zh) 2024-06-14

Family

ID=68369662

Family Applications (1)

Application Number Title Priority Date Filing Date
CN201910805712.3A Active CN110414491B (zh) 2019-08-29 2019-08-29 一种棉花单株形态照片的拍摄方法及其辅助装置

Country Status (1)

Country Link
CN (1) CN110414491B (zh)

Cited By (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN112883996A (zh) * 2021-01-11 2021-06-01 柳州市彭莫山农业科技有限公司 一种钩藤茶高效采收加工方法及装置
WO2021208407A1 (zh) * 2020-04-16 2021-10-21 苏州极目机器人科技有限公司 目标物检测方法、装置和图像采集方法、装置

Citations (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US20050025357A1 (en) * 2003-06-13 2005-02-03 Landwehr Val R. Method and system for detecting and classifying objects in images, such as insects and other arthropods
CN102246205A (zh) * 2008-12-03 2011-11-16 于利奇研究中心有限公司 用于测量植物的叶盘生长的方法以及对此适合的装置
CN103093232A (zh) * 2011-11-08 2013-05-08 江苏省农业科学院 面向病虫识别的手持式多核实时在线网络系统
CN210270924U (zh) * 2019-08-29 2020-04-07 新疆农业科学院经济作物研究所 一种棉花单株形态照片的拍摄方法所用到辅助装置

Patent Citations (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US20050025357A1 (en) * 2003-06-13 2005-02-03 Landwehr Val R. Method and system for detecting and classifying objects in images, such as insects and other arthropods
CN102246205A (zh) * 2008-12-03 2011-11-16 于利奇研究中心有限公司 用于测量植物的叶盘生长的方法以及对此适合的装置
CN103093232A (zh) * 2011-11-08 2013-05-08 江苏省农业科学院 面向病虫识别的手持式多核实时在线网络系统
CN210270924U (zh) * 2019-08-29 2020-04-07 新疆农业科学院经济作物研究所 一种棉花单株形态照片的拍摄方法所用到辅助装置

Non-Patent Citations (4)

* Cited by examiner, † Cited by third party
Title
CHERYL MCCARTHY等: "On-the-go Machine Vision Sensing of Cotton Plant Geometric Parameters: First Results", MECHATRONICS AND MACHINE VISION IN PRACTICE, 31 December 2008 (2008-12-31), pages 305 *
郝延杰等: "棉花顶芽识别定位技术研究现状及展望", 中国农机化学报, 30 November 2018 (2018-11-30), pages 72 - 78 *
雷咏雯;王娟;郭金强;危常州;: "一种基于图像分析提取作物冠层生物学参数的方法与验证", 西北农业学报, no. 03, 16 May 2006 (2006-05-16), pages 45 - 49 *
黄真: "视觉伺服在棉花裸根苗分离技术中的应用", 中国优秀硕士学位论文全文数据库信息科技辑, 15 September 2012 (2012-09-15), pages 2 - 5 *

Cited By (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
WO2021208407A1 (zh) * 2020-04-16 2021-10-21 苏州极目机器人科技有限公司 目标物检测方法、装置和图像采集方法、装置
CN112883996A (zh) * 2021-01-11 2021-06-01 柳州市彭莫山农业科技有限公司 一种钩藤茶高效采收加工方法及装置
CN112883996B (zh) * 2021-01-11 2022-12-23 三江县连兴科技有限公司 一种钩藤茶高效采收加工方法及装置

Also Published As

Publication number Publication date
CN110414491B (zh) 2024-06-14

Similar Documents

Publication Publication Date Title
CN110414491A (zh) 一种棉花单株形态照片的拍摄方法及其辅助装置
Paruelo et al. Estimating aboveground plant biomass using a photographic technique.
CN109470179B (zh) 一种大规模水耕蔬菜长势检测系统及方法
CN114093505B (zh) 一种基于云边端架构的病理检测系统及方法
CN105868784A (zh) 一种基于sae-svm的病虫害检测系统
CN101403741A (zh) 基于多光谱的植物叶片数字信息采集与自动识别系统及其识别方法
WO2005068974A1 (en) Method and apparatus for testing fibres
CN211240747U (zh) 大豆植株考种仪
CN106706643B (zh) 一种肝癌对比切片检测方法
CN109741357A (zh) 一种基于图像处理的油菜花序计数方法和装置
CN110348326A (zh) 基于身份证识别和多设备访问的家庭健康信息处理方法
Leménager et al. Studying flowers in 3D using photogrammetry
CN113222988A (zh) 一种基于深度学习和图像超分的输液管液位识别方法
CN109451292A (zh) 图像色温校正方法及装置
CN110675386B (zh) 一种b族链球菌的检测系统
CN117636314A (zh) 一种缺苗识别方法、装置、设备及介质
WO2018032285A1 (zh) 一种花卉种植拍照监控系统
CN210924657U (zh) 一种基于机器视觉的多种类蚕茧计数装置
CN115034693B (zh) 基于物联网的生物信息数据安全管理方法、系统及存储介质
CN109406506B (zh) 一种共享式自测健康终端及测试方法
CN216984874U (zh) 一种便携式舌象采集辅助装置
CN110839366B (zh) 大豆植株考种仪及表型数据采集与识别方法
CN210270924U (zh) 一种棉花单株形态照片的拍摄方法所用到辅助装置
CN208110531U (zh) 增强现实养殖管理系统
CN209676326U (zh) 一种投影图像信息的大体标本成像设备

Legal Events

Date Code Title Description
PB01 Publication
PB01 Publication
SE01 Entry into force of request for substantive examination
SE01 Entry into force of request for substantive examination
GR01 Patent grant
GR01 Patent grant