制作简易的图像标注小工具,即使你年收入百万技术视觉工程师
分类:多线程

招聘岗位:软件开发人员

即使你年收入百万技术视觉工程师,这份招聘也可以看看,因为机会就在这里

搞图像深度学习的童鞋一定碰过图像数据标注的东西,当我们训练网络时需要训练集数据,但在网上又没有找到自己想要的数据集,这时候就考虑自己制作自己的数据集了,这时就需要对图像进行标注。图像标注是件很枯燥又很费人力物力的一件事情,但是又不能回避,毕竟搞深度学习如果没有数据集那一切都是瞎搞。最近我在参加一个有关图像深度学习的比赛,因为命题方没有给出训练集,所以需要队伍自己去标注训练集,所以我花点时间开发了一些图像标注小工具给我的团队使用,以减轻标注的难度,加快标注的速度。

zw版·Halcon与delphi(兼谈opencv)

QQ群 247994767(delphi与halcon) 

 

      《Halcon与delphi》系列,早两年就想写,不过一方面,因为Halcon是售价高达数万欧元(不是人民币)的专业软件,知道的人不多,
      另外一方面,个人琐事太多,一直没时间动笔,这次借国庆空闲,匆匆忙忙,开个头先。
      标题本来准备用:《Halcon、opencv与delphi、python、vb、c++》
      太杂,虽然现在流行长标题,还是简化了。

 

 

图片 1

 

 

图片 2

 

 

      做图像分析有十多年,写过原生的OCR字符识别,当时没有opencv,全部是原生代码,写的很痛苦,和写汇编差不多
      不过也学习到不少东西,blur、细化、骨架、闭合、。。。。。。,从这点看,学习下opencv,对于基础也是必要的
      效果还可以,基本上除开QQ过于变态,一般的论坛、csdn、工行、移动、博客园、老版新浪微博的验证码,都能简单愉快的暴力识别。
      这几年,主要做图像分析、字体结构的图像分析、AI大数据方面的项目。

       实业方面,主要是PCB抄板设计,这个是protel电路图逆向工程,必需的。

      图像分析用过:agg、opencv、matlab、cgal、labview、vision、Halcon、sci、pil,以及一大波gis内置的高素质几何计算库
      编程语言早期是:c、c++、,这几年是:python、delphi,
      目前,图像分析基本上就只是:delphi+Halcon,(机器学习与大数据,是python+sci.xxx+pandas)
      delphi+Halcon,这个组合,可以说是图像分析的神级配置,无论是开发效率,还是运行速度,实在是太高了,分分钟秒杀c+opencv,python+cv,c+matlab,以及其他各种组合,

      特别是开发效率,几乎只有cv与c++的十分之一一,因为Halcon内置的,就是简化版pascal脚本语言,而且Halcon的控件封装,非常庞大、专业、细致,基本上和原生vcl控件差不多。

 

要求学历:大学及以上学历     

全球招聘计算机视觉工程要求如下:

这篇文章我将分享三个标注小工具,分别用于图像分类、目标检测以及语义分割的图像标注任务。

Halcon与opencv

      机器人,是目前国家鼓励的科技、产业项目,目前程序员缺口极大,而国内早期,和目前,delphi程序员,可能是世界上最多的,早几年,还传说,盛大准备收购delphi,虽然没成,不过绝对不是钱的问题。:)
      机器人,最核心的两块是:人工智能与机器视觉,人工智能,python已经是标准
      机器视觉,说白了,还是图像分析,这块,德国的Halcon(海尔肯,自己随便音译的),是目前行业最好的方案,基本上没有对手,
      国内,学术界目前还是opencv为主,虽然cv是免费的,Halcon的售价高达数万欧元,但凭借其强大的功能和一线生产力效率,企业领域,基本上是Halcon独大。
      opencv虽然很强大,但与Halcon相比,无论在开发效率,运行速度以及内置模块功能方面,完全是业余级的。
      这个原因是多方面的:

  • ::opencv是开源软件,受版权、专利限制,无法收录最新的专利、商业算法,至少有5-10年时间的技术差距
  • ::许多企业自身开发的算法是严格保密的,Halcon不少内置函数,即使是专业人员也无法理解函数采用的算法、模型。
  • ::opencv偏重于学术,算法虽然简单,但效率不高,即使是最基本的hough直线检测,如果不对内部源码进行二次修改,对原图进行过滤、去噪等细节预处理,结果基本无法直接使用
  • ::opencv优化不够,近年虽然也加入gpu、cuda和不少c语言高效函数,但与Halcon汇编级的优化,差距还是很大的
  • ::opencv不够全面,只有最基本的图像分析模块,缺乏专业的几何计算模块,用于实际项目,必需借助sci,sympy,cgal等其他第三方几何计算库,大家知道,图像数据,极占内存,数据交换成本很高,严重影响运行速度,大大增加了开发成本和学习周期

   例如,即使是最简单的轮廓分析,opencv只有最基本的矩形、园、椭圆几种,而Halcon要丰富的多;

    再如,形态学内置模型,cv只有cross、rect、circle三种,而Halcon预制模型高达数十种。

    象下图的堆砌原件,opencv基本上无能为力,而Halcon直接秒杀:

 

 图片 3图片 4

 

     从上面几张图中,可以清楚看到,Halcon可以轻松地根据预设模型,将不同层面的准3D模式,堆砌的零件,准确切割,并且,对遮挡的图像,进行准确、完整的轮廓补全,这个功能,以及其他类似的功能模块,非常强大、实用,即使是2015.6月,最新发布的cv3.0,也是无法直接处理的。

     

薪酬待遇:后议

  1. 熟悉掌握Python语言,熟练使用常见的python库;

图像分类标注小工具

实现图像分类的小工具太好开发了,因为它功能很简单,无非是对一个文件夹内的所有图片进行分类,生成每张图片所对应的类别标签,用txt文件存储起来,当然也可以把每一类图片放在对应的该类的文件夹下。

我实现的这个图像分类小工具的功能就是,循环弹出一个文件夹内所有的图片,标注人员对这张图片进行分类,属于1类就按1,属于2类就按2,如此类推,按完相应号码后图片自动跳到下一张,直至文件夹内的图片都被标注完毕。

我们以下面的图库为例,将其分为3类。

图片 5

首先我们需要创建相应的文件夹来存储每个类的图片

图片 6

图像分类标注小工具代码:

#include "opencv2/imgproc.hpp"
#include "opencv2/highgui.hpp"
#include <iostream>

#define  DATA_DIR ".\dataset\"
#define  IMG_MAX_NUM  20


using namespace cv;
using namespace std;

int main()
{
    FILE* fp;
    FILE* fp_result;
    fp = fopen("start.txt", "r");  //读取开始的图片名字,方便从某一图片开始标注
    int start_i = 0;
    fscanf(fp, "%d", &start_i);
    fclose(fp);

    fp_result = fopen("classify_record.txt", "a+");   //用于记录每张图每个框的标注信息

    printf("start_i: %dn", start_i);

    /*循环读取图片来标注*/
    for (int i = start_i; i < IMG_MAX_NUM; i++)
    {
        stringstream ss1,ss2,ss3;

        ss1 << DATA_DIR <<"data\"<< i << ".jpg";
        ss3 << i << ".jpg";
        Mat src = imread(ss1.str());
        if (src.empty())
        {
            continue;
        }
        printf("正在操作的图像: %sn", string(ss1.str()).c_str());

        imshow("标注", src);

        char c = 0;
        c = waitKey(0);
        while ( c != '1' && c != '2' && c != '3')  
        {
            c = waitKey(0);
            printf("invaid input!n");
        }

        ss2 << DATA_DIR << c << "\" << i << ".jpg";

        char type = c - '0';
        printf("分类为: %dn", c - '0');  
        imwrite(ss2.str(), src);   //copy一份到对应类别的文件夹
        fprintf(fp_result, "%s %dn", string(ss3.str()).c_str(), type);
    }


    fclose(fp_result);
    return 0;
}

利用工具进行标注

图片 7

每一类图片被分到相应的文件夹内

图片 8

同时也生成标签文件,每行以图片路径+对应的类别的方式呈现。

图片 9

opencv真的便宜吗

ps,10,6日补充

    opencv唯一的优势,也许就是free+open 免费开源

    不过,opencv真的便宜吗?

    Halcon很贵,数万欧元的价格。

     对于生产流水线而言,哪怕只有1%的生产率提升,这个投入就超值了,更何况,自动化生产线,投资都是以百万、千万计算,相对其他部件而言,Halcon算是廉价的了。

     CCTV监控系统,车牌、人脸识别,通常都是采用c/s模式,各个摄像头,只是图像采集节点,所有数据传送到中心服务器,特别是目前互联网+app模式,几个小区的硬件投入,就超过Halcon,而且Halcon对于识别准确率、识别效率以及后期维护的支持,都远超opencv。

     有开发商认为,Halcon会增加成本,影响投标的竞争力,个人认为,这个问题的答案:并非绝对。 

     对于50万以下的项目,Halcon的确不太适合,对于50W以上,特别是百万以上的项目,Halcon绝对是首选。(机器视觉方面的项目,极少有低于百万的)

     成本方面,如果采用类似C/S、B/S的网络结构,各个节点只负责采集图像,传送到中心服务器主机,以Halcon的处理能力,通常只需一套主机license授权书,(实时项目除外)

     如果是大型、超大型项目,增加几套runtime的license授权书,成本增加也不多。

     关键是服务商,给用户提供的是业界最专业、最顶尖的服务,而且是正版服务。

      对于政府、上市公司而言,招标项目,必须采购正版软件,这个做过地铁、高铁项目CAD设计、网络建设的公司应该都知道。

      对于服务商而言,采用Halcon的另外一个成本优势、竞争优势,在于大幅度缩短了开发周期,降低了维护成本,Halcon的开发周期,通常只有opencv的1/3-1/5。

    举个简单的例子,ocr、车牌识别、人脸识别,是目前图像分析的热点,

    这些项目,Halcon的核心代码通常才20-30行,而opencv,不管是vc+cv、还是python+cv,至少要上千行。

【参见】

《只有2行代码的超市收款单ocr脚本》http://www.cnblogs.com/ziwang/p/4856854.html

 《简单的令人发指,只有10行代码的车牌识别脚本》http://www.cnblogs.com/ziwang/p/4856322.html

 

 

     目前,图像程序员的平均年薪都在20w,1-2个程序员节省的工资,就把Halcon的成本对冲了。

    对于企业而言,opencv虽然是free+open

     关键的一击在于:opencv在功能方面,远远落后于Halcon。

     opencv通常只能完成Halcon 1/10的功能,即使配合多种第三方软件开发库,最乐观的估计,也不到1/3

    就象如今手机、pc、触控一体化的win10时代,你还在使用dos,完全没有竞争力。   

     这样看来,opencv,真的便宜吗?

     航母很贵,核弹更贵,

      Halcon的确很贵,作为图像开发项目的刀尖,如果能够真正解决问题,相对回报而言,这个价格,真心不算贵。

 

岗位职责:

2 有一定的计算机视觉基础知识;

目标检测图像标注小工具

在目标检测相关的网络训练中,我们需要有带有以下标签的数据集:

图片 10

我们做标注时不仅仅要把我们想要识别的物体用矩形框将其框出来,还需要记录这个框的相关信息,比如这个框的左顶点坐标、宽度高度等(x,y,w,h)。为了能实现这个标注任务,这个标注小工具必须具备框图和自动记录(x,y,w,h)信息的功能。

利用opencv我们可以快速实现用矩形框框出对应物体的功能,再加上将每个矩形框的信息有序记录在txt文件的功能,一个用于检测图像标注小工具就算开发好了。

目标检测图像标注小工具代码:

#include "opencv2/imgproc.hpp"
#include "opencv2/highgui.hpp"
#include <iostream>


#define  DATA_DIR ".\cut256\"
#define  IM_ROWS  5106
#define  IM_COLS  15106
#define  ROI_SIZE 256

using namespace cv;
using namespace std;

Point ptL, ptR; //鼠标画出矩形框的起点和终点,矩形的左下角和右下角
Mat imageSource, imageSourceCopy;
FILE* fp_result;


struct UserData
{
    Mat src;
    vector<Rect> rect;
};


void OnMouse(int event, int x, int y, int flag, void *dp)
{
    UserData *d = (UserData *)dp;
    imageSourceCopy = imageSource.clone();

    if (event == CV_EVENT_LBUTTONDOWN)  //按下鼠标右键,即拖动开始
    {
        ptL = Point(x, y);
        ptR = Point(x, y);
    }
    if (flag == CV_EVENT_FLAG_LBUTTON)   //拖拽鼠标右键,即拖动进行
    {
        ptR = Point(x, y);
        imageSourceCopy = imageSource.clone();
        rectangle(imageSourceCopy, ptL, ptR, Scalar(0, 255, 0));
        imshow("标注", imageSourceCopy);

    }
    if (event == CV_EVENT_LBUTTONUP)  //拖动结束
    {
        if (ptL != ptR)
        {
            rectangle(imageSourceCopy, ptL, ptR, Scalar(0, 255, 0));
            imshow("标注", imageSourceCopy);

            int h = ptR.y - ptL.y;
            int w = ptR.x - ptL.x;


            printf("选择的信息区域是:x:%d  y:%d  w:%d  h:%dn", ptL.x, ptL.y, w, h);

            d->rect.push_back(Rect(ptL.x, ptL.y, w, h));
            //d->src(imageSourceCopy);
        }
    }

    //点击右键删除一个矩形
    if (event == CV_EVENT_RBUTTONDOWN)
    {
        if (d->rect.size() > 0)
        {
            Rect temp = d->rect.back();

            printf("删除的信息区域是:x:%d  y:%d  w:%d  h:%dn", temp.x, temp.y, temp.width, temp.height);
            d->rect.pop_back();

            for (int i = 0; i < d->rect.size(); i++)
            {
                rectangle(imageSourceCopy, d->rect[i], Scalar(0, 255, 0), 1);
            }

        }
    }

}


void DrawArea(Mat& src, string img_name, string path_name)
{
    Mat img = src.clone();
    char c = 'x';
    UserData d;
    d.src = img.clone();
    while (c != 'n')
    {
        Mat backup = src.clone();
        imageSource = img.clone();

        namedWindow("标注", 1);
        imshow("标注", imageSource);
        setMouseCallback("标注", OnMouse, &d);

        c = waitKey(0);

        if (c == 'a')
        {
            printf("rect size: %dn", d.rect.size());
            for (int i = 0; i < d.rect.size(); i++)
            {
                rectangle(backup, d.rect[i], Scalar(0, 255, 0), 1);
            }

            img = backup.clone();

        }
    }

    fprintf(fp_result, "%sn", img_name.c_str());
    fprintf(fp_result, "%dn", d.rect.size());
    for (int i = 0; i < d.rect.size(); i++)
    {
        Rect t = d.rect[i];

        fprintf(fp_result, "%d %d %d %dn", t.x, t.y, t.width, t.height);
    }

    imwrite(path_name, img);


}
int main()
{
    FILE* fp;
    fp = fopen("start.txt", "r");
    int start_i = 0;
    int start_j = 0;
    fscanf(fp, "%d %d", &start_i, &start_j);
    fclose(fp);

    fp_result = fopen("record.txt", "a+");

    printf("start_i: %d, start_j: %dn", start_i, start_j);


    /*循环读取图片来标注*/
    for (int i = start_i; i< IM_ROWS / ROI_SIZE + 1; i++)
    {
        for (int j = start_j; j<IM_COLS / ROI_SIZE; j++)
        {
            stringstream ss1, ss2;

            ss1 << DATA_DIR << "2017\" << i << "_" << j << "_" << ROI_SIZE << "_.jpg";
            ss2 << DATA_DIR << "label_img\" << i << "_" << j << "_" << ROI_SIZE << "_.jpg";
            cout << ss1.str() << endl;
            string str(ss1.str());
            string str2(ss2.str());
            cv::Mat src = cv::imread(ss1.str());

            DrawArea(src, str,str2);


        }

    }
    fclose(fp_result);
    return 0;
}

以标注建筑物为例子吧!

图片 11

图片 12

然后在txt文件中可以看到我们标记的矩形信息记录,第一行是图片路径+框的个数,第二行开始是每个矩形的x,y,w,h。

图片 13

 opencv与Halcon的差距到底有多大

 

    以笔者亲身的体会而言:

    • 前面提到,笔者曾经开发过原生的ocr软件,这个相当于八路军延安时期,小米加步枪的水平
    • 后来,了解到opencv,发现blur,filter这些,都有现成的模块,而且优化不错,这个,相当于抗美援朝,标配AK47,歼8,或者喀秋莎时代
    • 再后,采用Halcon,完全是海湾战争,全信息化目标、数字化网络,再看opencv,也就伊拉克国民卫队水平

 

      ps,需要说明的是,笔者并非故意抨击opencv,实际上,在opencv3.0的测试阶段,国内最早一批,也许是第一套,python3.0-cv3.0的测试脚本,就是笔者用2to3人工转换,并一一进行测试的。cv开源,对于图像教学而言,的确是难得资源,但对于专业的图像应用,特别是商业领域,实在是有些力不从心。

 

Halcon与delphi

      Halcon的内置语言,基本上是简化版本的pascal,不过增加了python的元组tuple数据。
      奇怪的是,国内Halcon开发,基本上是vb,和c++(csharp)两种模式
      一线,基层用户用vb的多,专业学者,大部分使用c++(csharp),而delphi很少有人用。
      这个一方面,与delphi自身近年衰退有关,另外,delphi调用Halcon,每次会有20m左右的内存泄露,也有关系。
     不过,delphi再不行,在TIOBE2105编程语言排名榜上,也是仅次于c(含c、c++、objc、occsharp)的行业第二大原生编程语言。(java,vb严格说来,不是原生编程语言)
     (ps,xe9、xe10,delphi强化了并行开发,不过远不如python的map优雅方便,如果delphi能够整合cuda开发,进入gpu、hpc领域,才是真正凤凰涅槃)

       至于内存泄露,是crack的问题,就是c++调用Hlacon的com控件,也有内存泄露,而vb,因为使用Halcon的.net封装模块,凭借net平台内置的gc管理,回避了这个问题,其实delphi也可以采用.net模块,现在32G内存才几百元钱,64位系统,20m的内存,即使run一天,也没事情。

 图片 14

协助开发完成一个用于图像标注的软件。主要负责用软件界面的制作、完善以及用于图像标注的opencv算法的编写。

3.有使用opencv进行计算机视觉应用开发的经验

语义分割图像标注小工具

语义分割的标注相比上面的标注要复杂得多,所以标注工具开发起来也略难一点。

比如有这么一个任务,我们需要把图像中的建筑物给标注出来,生成一个mask图。

比如这样子

图片 15

然后我们以后就可以根据这些mask图作为label来进行语义分割网络的训练了。

实现这么一个工具还是不算太复杂,主要功能的实现就在于使用了opencv的多边形的生成与填充函数。标注人员只需要在要标注的物体边缘打点,然后工具就会自动填充该区域,进而生成黑白mask图。

#include <iostream>
#include <sstream>
#include <vector>
#include <opencv2/opencv.hpp>
using namespace std;

#define  DATA_DIR ".\cut256\"

#define  IM_ROWS  5106
#define  IM_COLS  15106
#define  ROI_SIZE 256
struct UserData
{
    cv::Mat src;
    vector<cv::Point> pts;
};

FILE* fpts_set;

void on_mouse(int event, int x, int y, int flags, void *dp)
{
    UserData *d = (UserData *)dp;
    if (event == CV_EVENT_LBUTTONDOWN)
    {
        d->pts.push_back(cv::Point(x, y));
    }
    if (event == CV_EVENT_RBUTTONDOWN)
    {
        if (d->pts.size()>0)
            d->pts.pop_back();
    }
    cv::Mat temp = d->src.clone();
    if (d->pts.size()>2)
    {
        const cv::Point* ppt[1] = { &d->pts[0] };
        int npt[] = { static_cast<int>(d->pts.size()) };
        cv::fillPoly(temp, ppt, npt, 1, cv::Scalar(0, 0, 255), 16);

    }
    for (int i = 0; i<d->pts.size(); i++)
    {
        cv::circle(temp, d->pts[i], 1, cv::Scalar(0, 0, 255), 1, 16);
    }
    cv::circle(temp, cv::Point(x, y), 1, cv::Scalar(0, 255, 0), 1, 16);
    cv::imshow("2017", temp);

}

void WriteTxT(vector<cv::Point>& pst)
{
    for (int i = 0; i < pst.size(); i++)
    {
        fprintf(fpts_set, "%d %d", pst[i].x, pst[i].y);
        if (i == pst.size() - 1)
        {
            fprintf(fpts_set, "n");
        }
        else
        {
            fprintf(fpts_set, " ");
        }
    }
}

int label_img(cv::Mat &src, cv::Mat &mask, string& name)
{
    char c = 'x';

    vector<vector<cv::Point> > poly_point_set;

    while (c != 'n')
    {
        UserData d;
        d.src = src.clone();

        cv::namedWindow("2017", 1);
        cv::setMouseCallback("2017", on_mouse, &d);
        cv::imshow("2017", src);
        c = cv::waitKey(0);
        if (c == 'a')
        {
            if (d.pts.size()>0)
            {
                const cv::Point* ppt[1] = { &d.pts[0] };
                int npt[] = { static_cast<int>(d.pts.size()) };
                cv::fillPoly(src, ppt, npt, 1, cv::Scalar(0, 0, 255), 16);
                cv::fillPoly(mask, ppt, npt, 1, cv::Scalar(255), 16);
                poly_point_set.push_back(d.pts);
            }


        }
    }

    fprintf(stdout, "%s %dn", name.c_str(), poly_point_set.size());
    fprintf(fpts_set, "%s %dn", name.c_str(), poly_point_set.size());

    //将点集写入文件
    for (int i = 0; i < poly_point_set.size(); i++)
    {
        WriteTxT(poly_point_set[i]);
    }

    return 0;
}
int main()
{
    FILE* fp;
    fp = fopen("start.txt", "r");
    int start_i = 0;
    int start_j = 0;
    fscanf(fp, "%d %d", &start_i, &start_j);
    fclose(fp);

    fpts_set = fopen("semantic_label.txt", "a+");

    printf("start_i: %d, start_j: %dn", start_i, start_j);

    for (int i = start_i; i<IM_ROWS / ROI_SIZE + 1; i++)
    {
        for (int j = start_j; j<IM_COLS / ROI_SIZE; j++)
        {
            stringstream ss1,ss2,ss3;
            cv::Mat mask(256, 256, CV_8UC1);
            mask.setTo(0);

            ss1 << DATA_DIR << "2017\" << i << "_" << j << "_" << ROI_SIZE << "_.jpg";
            ss2 << DATA_DIR << "label\" << i << "_" << j << "_" << ROI_SIZE << "_.jpg";
            ss3 << i << "_" << j << "_" << ROI_SIZE << "_.jpg";
            cout << ss1.str() << endl;

            cv::Mat src = cv::imread(ss1.str());

            label_img(src, mask, string(ss3.str()));// label based on tiny
            cv::imwrite(ss2.str(), mask);
        }

    }

    fclose(fpts_set);
    return 0;
}

所以我们可以利用这个标注工具对任意形状的物体进行标注,原理就是利用多边形的逼近。看看效果吧

图片 16

图片 17

图片 18

生成的mask图

图片 19

当然我们也可以根据需求把每个标注的每个图形的边缘点记录下来
图片 20

希望这三款小工具能给你带来一点小帮助和小启发~

delphi、c++、vb、python与图像处理

       vb即使对于初学者,以及产品开发原型阶段,也是很差的编程工具,更何况复杂的图像开发,机器视觉领域。

      初学者,以及简单的产品原型开发,笔者推荐python+opencv,cv3.0已经支持python3了。
      可惜,delphi的cv库还是v2.49版本的,不然,delphi+cv3也是个不错的选择,特别是调试、效率方面

     c++,无论如何,不是图像分析理想的工具,
     对于图像分析,c语言类的底线,差不多只有c了,即使是opencv,90%也是c,
    (ps,fontforge的开发者,是如此痛恨c++,以至于在faq里,对c++都忍不住,大段大段吐槽)

     图像分析起点就是2D,二维的,复杂一些,连续图像序列,3D,动态图像分析,都是多维的数据模型。
     而c语言,先天缺乏内置数组,采用*指针结构,作为数组。
     *指针数组,对于简单的一维数据分析,勉强可以,但对于2维、3维以及更高的多维数据,非常痛苦。

     没感觉,看看,*img1,**img2,***img3,&img1,&&img2,&&&img,这些绝对是非人类的设计。

     大家知道,图像处理非常吃内存,而c的内存管理,完全是*指针模式,复杂无比。      对于一线程序员而言,采用c++进行图像处理,在c++编程语言方面的时间成本,甚至要高于图像分析算法本身。

     此外,对于学习者而言,c作为图像处理,最大的问题是入门易,精通难,很多都卡只blur,去噪,以及现有图像库的调用阶段,就无法深入下去,

    主要是无法进行深入的图像算法内部分析,即使借助Halcon、opencv这些库,也很难完成。      至于c++,唯一的优点,可能就是速度。      而c的速度优势,是相对于vb、python的,可能有10-20倍的运行速度优势,不过对于delphi,就是在最严格的对比当中,也是基本差不多。
     不过delphi十倍于c的开发效率,使程序员,能够在软件开发的原型、中期、调试、交付、维护等各个阶段,采用更多的模型算法,进行优化,

     通常,用c++,一周时间才能完成的软件开发任务,delphi一天就可以完成,真真正正的10x、十倍速效率。

     实战当中,delphi+Halcon的组合,要远远优于c+Halcon,c+opencv
     以往,图像处理,delphi唯一的短板,是缺乏工业级的图像库,cv、cgal对于delphi的支持一直不够好
     不过短板这个已经被halocn给完美的弥补了。

     重要的话要说三遍,3x

      delphi+Halcon,图像分析神级配置,分分钟秒杀c+opencv,python+cv,c+matlab,以及其他各种组合

      delphi+Halcon,图像分析神级配置,分分钟秒杀c+opencv,python+cv,c+matlab,以及其他各种组合**

      delphi+Halcon,图像分析神级配置,分分钟秒杀c+opencv,python+cv,c+matlab,以及其他各种组合

 

QQ群 247994767(delphi与halcon) 【zw版《delphi与halcon系列原创教程》,网址,cnblogs.com/ziwang/ 】 QQ:2592439395(zw) , delphi+halcon,图像分析神级配置, 分分钟秒杀 c+opencv,python+opencv,c+matlab, 以及其他各种组合

 

职位要求:

  1. 熟悉linux系统,能够在linux系统下进行开发

1.    大学及以上学历。

5.良好的代码编写习惯和学习能力,责任心强,善于沟通。

2.    有熟练的Qt语言编程经验以及opencv的开发经历。

  1. 能够无障碍阅读英文文档岗位职责:

3.    具有图像处理的经验。

1)实现从纯色背景中提取物体

4.    愿意承当工作压力并及时汇报进展。

2)将提取出的物体与没有物体的空背景叠加,形成合成的图片,同时自动生成合成图片的标注数据,用于训练模型

5.    计算机、软件等相关专业者优先。

3) 在合成过程中,对以下因素进行随机设置:l 物体的位置、大小以及旋转角度l 物体的阴影及图像噪声l 从多个空背景中随机选择空背景

完成期限:一周之内

4)用python实现,可以基于opencv库,最好在ubuntu系统下实现

工作地点北京,薪酬比你想想的还高

有兴趣发简历到690606983@qq.com的邮箱。

记住:机会只给有准备之人。

本文由10bet手机官网发布于多线程,转载请注明出处:制作简易的图像标注小工具,即使你年收入百万技术视觉工程师

上一篇:没有了 下一篇:公司未直接回应,这是恶意侮辱
猜你喜欢
热门排行
精彩图文