2010-12-07 15:51:55 iteye_236 阅读数 20

上一个项目顺利完成了,也就意味着下一个项目的开始。

码农的特点决定了我们要不停的学习,刚刚做完第一个android的项目,紧接着开始了另一个方面的调研,图像处理,已经很久很久没有看过这方面的东西了,在后面的日志中,会记录调研的一些东西。

2019-10-02 15:07:26 u013565669 阅读数 91

这段时间需要调整状态,对算法提不起兴趣,可能是之前一直读论文没有复现导致自己有点空虚,所以最近做了一些搬砖的工作,但是我觉的这对我们算法码农很重要。今天就讲一些关于python 调用c++动态库的话题(毕竟图像算法,我就用opencv做些事情啦)。

首先推荐一下Clion

以前在windows 上使用vs20..系列的IDE,被IDE蒙蔽了双眼,其实很多c/c++基本功底都没有掌握,现在使用macbook进行开发,没有vs可以用,所以我安利一下Clion,对于我们用惯pycharm的人会很爽,对学生也比较友好,我们上了班的程序员就尽量支持下正版啦,少使用点破解注册码。下面我们就进入正题啦,整篇都是代码。

1,C/C++编写Cmake的要点

我这个是clion生成了一部分,另一部分是我自己填写的,cmake就是加入一些关于代码编译的配置,
然后生成makefile,makefile使用make指令就能编译了
cmake_minimum_required(VERSION 3.14)
project(load_dylib_test)     #工程名
set(CMAKE_CXX_STANDARD 11)

set(OpenCV_DIR /Users/aidaihanati/Library_c++/opencv-4.1.1/opencv-4.1.1_lib/lib/cmake/opencv4)

set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${OpenCV_DIR}) 
#设置cmake的目录,找到opencv的cmake,从而找到opencv的include,OpenCV_DIR这个目录下有这些cmake
#文件,cmake就把这个当作module去用

find_package(OpenCV REQUIRED) 
#这个为什么这么设置,我们从OpenCVConfig.cmake文件里看,主要看看下图的红箭头,剩下的自己悟

message(${CMAKE_MODULE_PATH})  # 自己使用这句验证一下路径之类,帮助自己理解
message(${OpenCV_INCLUDE_DIRS})

include_directories(${OpenCV_INCLUDE_DIRS})
# 填加头文件路径,OpenCV_INCLUDE_DIRS就是在OpenCVConfig.cmake里定义的

#add_executable(load_dylib_test main.cpp) 
#这个可以写写验证程序, load_dylib_test这个就是生成的可执行文件的名字

add_definitions(-DENABLE_DEBUG -lstdc++ -o3) 
#定义一些编译选项,-fopenmp可以在我上个博客看看怎么安装。

add_library(ImgSegmentation SHARED ImgSegmentation.hpp ImgSegmentation.cpp) 
# 第一个是生成的库的名字,实际是libImgSegmentation.dylib,第二个是生成可调用库的类型,SHARED代# 表动态库,STATIC代表静态库。后面把编译要用到代码文件添加进来。

set(Opencv_lib /Users/aidaihanati/Library_c++/opencv-4.1.1/opencv-4.1.1_lib/lib)
# 这里我就自己设置一下opencv库的路径,其实可以使用OpenCVConfig.cmake里的OpenCV_LIBS
target_link_libraries(ImgSegmentation
        /usr/local/opt/libomp/lib/libomp.dylib
        ${Opencv_lib}/libopencv_core.4.1.1.dylib
        ${Opencv_lib}/libopencv_core.4.1.dylib
        ${Opencv_lib}/libopencv_core.dylib
        ${Opencv_lib}/libopencv_imgproc.4.1.1.dylib
        ${Opencv_lib}/libopencv_imgproc.4.1.dylib
        ${Opencv_lib}/libopencv_imgproc.dylib
        ${Opencv_lib}/libopencv_highgui.4.1.1.dylib
        ${Opencv_lib}/libopencv_highgui.4.1.dylib
        ${Opencv_lib}/libopencv_highgui.dylib
        )#这里添加一下我们会链接到的动态库文件,如果不知道添加哪些,可以先编译代码试试,笑哭脸~

想了解更多关于cmake的内容可以看这篇(https://blog.csdn.net/afei__/article/details/81201039)

 

二,开始写C/C++代码

1,创建ImgSegmentation.hpp

//
// Created by BboyHanat on 2019-09-25.
//

#ifndef LOAD_DYLIB_TEST_IMGSEGMENTATION_HPP
#define LOAD_DYLIB_TEST_IMGSEGMENTATION_HPP

#endif //LOAD_DYLIB_TEST_IMGSEGMENTATION_HPP


extern "C" { //因为python一般只支持c的接口(从网上查的,具体为什么,大家自己研究下哦)
typedef struct ImageBase {
    int w;                   //图像的宽
    int h;                    //图像的高
    int c;                    //通道数
    unsigned char *data;    //我们要写python和c++交互的数据结构,
};
typedef ImageBase ImageMeta;

void SegmentImage(ImageMeta *data, ImageMeta *level_mask);

};


2,创建ImgSegmentation.cpp

//
// Created by BboyHanat on 2019-09-25.
//
#include <opencv2/opencv.hpp>
#include "ImgSegmentation.hpp"
using namespace cv;

void SegmentImage(ImageMeta *data, ImageMeta *level_mask) {
    
    Mat img = Mat::zeros(Size(data->w,data->h),CV_8UC3);
    Mat img_cp;
    img.data=data->data;
    cv::resize(img, img_cp,Size(320,320));
    int sp = 15;        //空间窗口大小
    int sc = 30;          //色彩窗口大小
    int PyrLevel = 0;        //金字塔层数
    boxFilter(img_cp,img_cp, -1,Size(3,3));
    pyrMeanShiftFiltering( img_cp, img_cp, sp, sc, PyrLevel);
    Mat mask( img_cp.rows+2, img_cp.cols+2, CV_8UC1, Scalar::all(0) );
    for( int y = 0; y < img_cp.rows; y++ )
    {
        for( int x = 0; x < img_cp.cols; x++ )
        {
            if( mask.data[(y+1) * img_cp.cols + (x+1)] == 0 )//只填充没有填充过的区域
            {
                Vec3b rgb = img_cp.at<Vec3b>(y,x);
                Scalar newVal(rgb[0], rgb[1], rgb[2]);
                floodFill( img_cp, mask, Point(x,y), newVal, 0, Scalar::all(30), Scalar::all(30)); //漫水填充
            }
        }
    }
    Mat gray;
    cvtColor(img_cp, gray,COLOR_BGR2GRAY);
    resize(gray, gray, Size(data->w, data->h),0,0,INTER_NEAREST);
    memcpy(level_mask->data, gray.data,  data->w*data->h);
    return;
}

在这里是clion,就用小锤子build一下,会生成libImgSegmentation.dylib文件,

test3

不是clion 的话

mkdir build && cd build

cmake ..   #这里可以使用cmake gui去配置哦,mac下如果要用-fopenmp可能要使用 llvm 的clang

make

test4

3,编写python调用libImgSegmentation.dylib的代码

建立run.py, 并把libImgSegmentation.dylib拷贝到同级目录

from ctypes import *
from io import BytesIO
import numpy as np
import cv2

# 这个写法是看到yolo的darknet.py里看到的,学以致用一下

def c_array(ctype, values):    # 把图像的数据转化为内存连续的列表使c++能使用这块内存 
    arr = (ctype * len(values))()
    arr[:] = values
    return arr

def array_to_image(arr):    
    c = arr.shape[2]
    h = arr.shape[0]
    w = arr.shape[1]
    arr = arr.flatten()
    data = c_array(c_uint8, arr)
    im = IMAGE(w, h, c, data)
    return im

class IMAGE(Structure):           # 这里和ImgSegmentation.hpp里面的结构体保持一致。
    _fields_ = [("w", c_int),
                ("h", c_int),
                ("c", c_int),
                ("data", POINTER(c_uint8))]

img = cv2.imread('5.jpg')
h, w, c = img.shape[0], img.shape[1], img.shape[2]
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)*0
gray = np.reshape(gray, (h, w, 1))          # 一定要使用(h, w, 1),最后的1别忘。
im = array_to_image(img)
gray_img = array_to_image(gray)

lib = CDLL('./libImgSegmentation.dylib')    # 读取动态库文件
segment = lib.SegmentImage                  # 这个就是我们的函数名
segment.argtypes = [POINTER(IMAGE), POINTER(IMAGE)]    # 设置函数参数
segment(im, gray_img)                       # 执行函数,这里直接修改gray_img的内存数据
y = gray_img.data                           # 获取data
array_length = h*w
“”“转化为numpy的ndarray”“”
buffer_from_memory = pythonapi.PyMemoryView_FromMemory    # 这个是python 3的使用方法
buffer_from_memory.restype = py_object
buffer = buffer_from_memory(y, array_length)
img = np.frombuffer(buffer, dtype=np.uint8)
img = np.reshape(img, (h, w))

cv2.imshow('test', img)
cv2.waitKey(0)

4,大功告成!

python run.py

代码里的5.jpg

test6

生成结果

test7

最后一句就是:有问题的地方欢迎大家的指正。毕竟我也是分享一下自己的菜鸟经验。

2019-12-31 14:52:50 WANXT1024 阅读数 23

先说明一下个人基本情况,本硕东南自动化,实验室主要是做一些图像处理相关的项目,后面发现自己对算法并没有太大的热情,于是转向了C++后台开发,在秋招过程中,投递了大概10+家公司(基本都在7月份完成投递),最终拿到了以下offer,大部分是sp或者ssp:

腾讯PCG分布式存储
百度Feed推荐技术架构部
阿里云计算平台事业部
字节跳动视频架构
拼多多服务端研发
远景智能后端开发
商汤科技后端开发
华为顶尖人才计划(***软件院)
美团到店平台技术部
网易互娱游戏研发

拿下15家一线互联网Offer,一个本硕非科班码农的后台开发之路

如何选择

在开始介绍学习路线之前,想先和大家分享一下我的几个观点,读研还是工作,算法还是开发,C++还是Java,国企还是互联网,除了第一个问题外,都曾经困扰过我,当然我相信很多人也会遇到类似的迷茫,所以在这里分享一些我的想法,希望能给有需要的人提供一些参考,自己已经想的很明确的可以直接跳过~

(1)读研还是工作
这个问题是牛客上经常被讨论的一个问题,已经拿了某大厂的offer是否还有必要读研,这个问题我的看法是这样:如果自己很明确就是想进互联网做开发,并且读研的学校比较一般,那我建议选择就业,能力强的人在三年内就能有很好的技术积累,这些是在研究生期间很难得到的锤炼;相反,学校本身还可以,自己也没有明确以后就是互联网做研发,有可能考虑国企或者研究所,或者从事偏研究性的算法工作,建议读研,因为国企和研究所学历卡的比较严,读研意味着以后有更多的选择。对于我个人而言,本科阶段基本没有计算机相关的就业能力,所以读研让我有了更多的时间去思考自己的规划,并且在自律上有了很大的提高,这些都算是我在读研过程中的收获。

(2)算法还是开发
这几年算法由于起薪较高,偏研究性质的工作吸引了大量的人才涌入,也就造成了现在激烈的竞争情况,不过这都是符合市场规律的正常现象,毕竟风口在哪,热钱就在哪,总会吸引一大批优秀的人才涌入。对于这个问题,我的看法是个人兴趣结合个人特长,算法算是一个投入反馈比较慢的工作,也就是可能投入了大量的精力也会得不到实时有效的反馈,而开发则基本能够得到实时的反馈,于是我这种本身不是很能耐得住性子的人,对于算法就有些难以接受了(个人有过一段1个多月的算法实习);同时,算法要求一定的数学能力,我很清楚自己更擅长一些逻辑性的问题,而不喜欢数学推理论证性的问题,这也会影响以后的上限。最后就是实验室有一位坚定走在算法道路上的大佬,@daili0015(牛客),大佬读完论文后经常脑子里冒出一些骚操作,看的我是目瞪口呆,发现自己是真的不适合算法。

(3)C++还是Java
刚开始转开发的时候,纠结过一段时间Java还是C++,有一位师兄劝我转向Java,毕竟机会多,而我纠结了一段时间后最终选择了C++,理由是:为什么大家都选Java我就要选Java呢,这可能也是性格偶尔有些叛逆的原因吧。好了,回到主题上来,C++应用场景确实不如Java广泛,但是也是有自己的立足之地的,这里可以参考@TeeKee 牛客大佬的帖子,C++因为更偏底层一些,可能上手上难度会略大,说回来其实还是个方向选择上的问题,Java大多是业务侧,数据库以及各种组件就会很重要,而C++偏底层一些,操作系统以及Linux相关的知识更为重要一些,具体选择,因人而异,给个说服自己的理由就好。其实在校招过程中,更加关注的还是基础知识的把握能力,还有项目过程中体现出来的问题解决能力,快速上手能力,个人的思考,这些都是在美团、远景(这两个offer的部门都是Java系)包括春招实习投递的蚂蚁Java岗中注重考查的点。

(4)国企还是互联网
这真的是一个围城,城外的人想进去,城里的人想出来。看过一些国企待不下去跳互联网去的人,身边也有不少朋友(复旦、南京大学等本科生)进入国企后,觉得工作上没有动力,升职加薪遥遥无期,我觉得自己是那个最了解自己的人,所以一定要想清楚自己想要什么,然后做出自己的选择。

调整心态

我的秋招之路,始于牛客,也在此终于牛客。在牛客上找到了学习路线,学习资源,也明白了自信与坚持的重要性,在这里放一段(@XiaoTeng )牛客大佬在面经中的一段话:

offer = 心态 * (实力 + 面试技巧) + 缘分运气

1、心态

首先是要正视自己的能力,不轻视,不高估。不轻视:对自己有信心,机会那么多,怎么都能有个差不多的offer,不至于失业 。不高估:清楚自己的能力范围,保持好心态,面试是有偶然性的。
不要总给自己消极的暗示,心态差了积极调整,一个乐观向上的态度是非常重要的,提高效率,专注寻找自己的方向。
多交流,不比较。对于每一次面试,只跟自己比有提高就已经很好了,每个人适合的方向和技术栈都不一样。

2、硬实力是关键

我是从2018年3月底开始准备校招,因为是在18年春招实习的时候获得了两次面试机会,分别是网易游戏和去哪儿,下面给大家还原一下真实面试场景,其实我也是和各位非科班的同学一样,基本是零基础开始准备秋招,但希望大家相信只要努力,永远不晚。

2018.03.27 —— 网易游戏研发工程师实习面试(下面以Q代表面试官,A代表我)

Q:C里面内联有什么作用

A:不知道…

Q:struct和class有什么区别,和union有什么区别

A:不知道…

Q:虚函数有什么作用

A:不知道…

Q:智能指针听说过吗

A:没听说过…内心os(啥,这玩意是啥…)

就是在这种情况下,面试官还拿着准备好的题目一直面了我40分钟,面试体验很棒,QAQ

2018.04.某天 —— 去哪儿后台开发实习面试

Q:知道二叉树的各种遍历顺序吗?

A:知道,前序中序后序,分别说了下怎么遍历的

Q:好,那你手写一下中序遍历…

A:拿笔挣扎了好久…一个字没写

Q:要不你再好好想想,你都知道遍历顺序了,应该可以写出来的

A:我真不会写…

Q:那今天就到这吧…

总结:相信很多同学在开始的基础都比我好,所以一定要有自信,然后坚持学习,秋招肯定是收获满满(不仅仅是offer上的收获,还有很多关于自主学习能力、个人自律以及自信上的收获)。

学习路线

毕竟以前没刷过题,没看过书…写的大部分都是C#代码,于是决定开始着手秋招,从语言开始系统学习,关于学习的几个建议(个人觉得算法开发通用,且可能比学习路线更实用!!!):

1、一定要做笔记!!!好记性不如烂键盘,知识温故而知新,每次回顾总结再原来基础上再引申一些新学到的知识,如果能达到这样的效果,就相当于自己在给自己面试!做到面试效果好,还不会紧张

2、笔记可以选择很多可在线编辑的软件,个人在用的是Evernote,可能已经积累了数十万字的笔记

3、可以先在网上看看相关的面经,记录常见的考点,在读书过程中及时总结自己的答案,这样既高效,面试时的答案又有自己的理解,绝对加分项!

4、talk is cheap,show me the code. 无论是算法还是开发,只要你是计算机编码相关从业人员,能刷题都是很重要的,这里面不仅可以反映你写代码的速度和质量、思维的灵活性、对常用算法的掌握与迁移以及将抽象的问题具体化的能力,一定要刷题

下面是各方面知识体系的学习资料和路线,大部分是书籍,少部分是我推荐的一些公开课或者b站视频

C++:
C++Primer 基础书籍,初学者建议精读,可重点关注一些C++11的新特性,比如智能指针、移动构造等在面试中常考的特性
深度探索C++面向对象模型,这是一本建立起C++面向对象模型观的好书,个人收益良多,另附一份此书总结的技术博客,写的很好,读完本书再读一遍博客,绝对收获满满,以至于我后面复习C++面向对象观,直接对着博客看了
STL源码分析,主要看各种STL容器的底层实现方式、内存管理方式,看完自然会对这些容器内部对象到底分配在堆上还是栈上,迭代器失效情况,内存是连续还是非连续等各种问题都有一个很好的掌握
Effective C++和More Effective C++,需要对C++有一定了解和使用经验后阅读,里面主要是介绍各种安全管理、效率提升的小细节,可以参考阅读,有些小细节可以在手写代码时体现,给面试官很好的印象!
操作系统 :
清华大学 陈渝老师的公开课(b站和网易云课堂上都有),非常系统的讲述操作系统的一些实现原理,也把包括生产者消费者、读者写者、哲学家就餐等经典问题讲得非常透彻,作为清华的公开课,又不失知识的广度和深度,推荐 。
深入理解计算机系统(CSAPP),这本书真的是讲解整个计算机系统的一部神书,短短的篇幅内能涵盖到这么多的技术点(看完公开课后再来读效果应该会更好),我翻来覆去读了三四遍,每次读都有新的收获,极力推荐 。
现代操作系统,详细讲述操作系统的基本概念,其实我并没有读过,因为没有找到这本书的电子资源…但是很多人推荐,应该也是一本好书!
Unix环境高级编程(APUE),详细讲述Unix环境下的各种编程机制和接口,建议书上的代码都自己敲一遍执行,才能有更好的理解。(尤其是以腾讯为目标的同学们,此书必读)
计算机网络 :
图解TCP/IP,图解系列的书籍都是比较浅显易懂,但是作为入门或者第一本相关书籍,可以看到全貌却有不打击大家的学习积极性,可以快速阅读 。
图解HTTP,建议同上,但是我其实对HTTP了解并不多,因为实际上C++开发很少与http打交道,基本是C++与Java通信,Java再与前端通信,但是还是应该扩充自己的知识面 。
计算机网络,这本书是本科上课时我们选用的教材,对于计算机网络有一个比较深入的讲解,包括网络协议中的各种设计细节以及相关算法的原理,值得阅读 。
UNIX网络编程(UNP),同前面操作系统一样,可以配合Allen大佬的技术博客,学习一些底层的网络编程知识,尤其是打算准备网络相关的项目时,建议细读本书 。
TCP/IP详解,非常详细讲述了TCP/IP协议栈下的各个技术细节,建议大家挑自己感兴趣的阅读,都是拔高点,体现个人技术深度的点 。
数据结构:
大话数据结构,入门书籍,把每个抽象数据类型(ADT)的实现方式都讲得比较透彻,也涉及了相关的算法,可以仔细阅读,后面面试可能也会涉及一些让你在某个应用场景下的适用数据结构,应该详细掌握 。
清华大学 邓俊辉老师的公开课,详细细致讲述了数据结构与算法相关的内容,因为算法和数据结构密不可分,在讲述基本的数据结构与算法同时,包含一些时间复杂度的推导,课程又有一定的深度,老师讲课也非常有趣!值得深入学习 。
网易云浙江大学 数据结构公开课 ,课程感觉不如邓俊辉老师的有趣,但是优点是有配套的学习平台和练习题,配合课程刷题,效果更佳!
算法(这块其实是我的薄弱点,我大概只刷了200道题+剑指offer):
leetcode2016,这本书是在北美找工作的国内同学总结的,将leetcode上的一些经典题目按照各种方法总结在一起的,大约有200题,建议按照专题开始刷!这本电子书我会在后面给出百度网盘的链接,大家可以自己下载 。
剑指Offer,不多说了,哪里不会刷哪里 。
算法图解,一本适合刚开始接触算法的初学者,用通俗易懂的语言说明了一些常用的算法 。
程序员代码面试指南,左神神书,适合算法进阶,题的数量和质量都有保障 。
数据库:
Mysql必知必会,介绍了sql查询相关的用法,读完之后可以配合牛客上的SQL查询相关练习进行熟悉 。
高性能Mysql
MySQL技术内幕 InnoDB存储引擎
Redis设计与实现,前面几本书都是sql相关的知识储备,而详细了解一款nosql也是很有必要的,因为各自有不同的应用场景,面试中也常考一些Redis相关知识 。
Mysql:Mysql技术内幕和高性能Mysql侧重于数据库本身的底层实现,而这套视频则是从实用的角度出发,讲解了数据的查询到优化等方面的知识,配合使用效果更佳 。
设计模式:
大话设计模式,描述了二十多种设计模式的使用场景,设计模式只有了解了概念以后,在实际项目中去加深理解,单例模式、工厂模式、***模式、中介者模式等都是在实际项目中常用的设计模式 。
Linux与编译原理:
鸟哥的Linux家常菜,基本就是讲一些Linux下的命令操作,C++必然是跟Linux结合在一起的,所以如果对Linux不够熟悉,可以粗读一遍,熟悉相关的命令 。
Linux内核完全注释,采用早期Linux内核0.11或0.12版本的代码进行完全注释讲解,作者是同济的一名老师,阅读本书需要有一定的汇编基础、硬件基础和操作系统基础,适合对Linux内核机制比较感兴趣,想了解底层源码的同学 。
程序员的自我修养——链接、装载与库,校招面试过程中发现,只要面试一深入,就经常会讨论到编译和链接过程中的一些问题,虽然对开发并没有太大的作用,但是掌握过程中发生的情况,可以帮助分析和解决一些问题 。
面试相关 :
(下面这两本书中都有很多常见的面试题,可以细读当做个人知识的一个查漏补缺,也需要关注一些常见的智力题,比如头条有时候就会问一些相关的智力题):

程序员面试笔试宝典
王道程序员面试宝典

项目面试问题

在具体的面试中,一些技术问题可能因为公司或者面试官的不同而不太一样,但是经过大大小小几十场面试发现,关于项目上,有几个问题经常被提及,能够看出一个人的项目深度以及是否在项目过程中有自己独立的思考:

(1)项目中的难点以及解决方法

建议项目做完一定要及时总结,回顾过程中踩过的坑,走过的弯路,回答这个问题时,可以给出一些参考的解决方式,最后结合实际需求,给出自己的方案。

(2)与现有的一些类似产品,有什么优势?或者说为什么在你们的使用场景下,要用这种方案 。

因为主要的项目经历是推荐场景下的分布式KV存储,所以经常被问到与Redis相比的优势在哪,为什么不用这些现有的KV存储方式。在做项目过程中,就要培养自己的好奇心,多问自己Why,而不是一味的只是How。

(3)如果再给你一次重新做的机会,你觉得哪些方面会有改进和提高?

做完项目以后,一定要去复盘,想想这里面可能存在的问题,或者说哪些方面可以被改进

总结:以上几个问题都是在各大厂面试中经常提及的问题,希望各位做项目时,一定要保持充分的好奇心,对自己的方案有绝对的把控力,然后及时总结和复盘。

写在最后

上面大概就是我个人的一个学习路线,基本是书籍+公开课+网课为主要学习路线,当然对于硕士来说,准备秋招的过程中肯定免不了会穿插有实验室的一些工作,这就得看个人的时间规划和安排了,另外效率是很关键的一点,如果遇到了心浮气躁学不下去的情况,建议找个适合自己的方式去放松一下,保持好自己的学习效率。接下来想说一些秋招过程中的一些奇葩经历:

字节跳动的十一轮面试经历,是的你没有看错,我从春招到秋招一共面了十一轮字节跳动!!!

1、3月初,本来打算投春招实习的我简历莫名流到了一个日常实习中,想着面就面面吧,然后上来一面面试官说你是C++的啊,我不会C++啊,然后说你在××实习过呀,我以前在那边工作过几年,但是我图像相关的知识我也忘了,没法面啊,要不就算了吧…(一轮凉凉)

2、4月,春招实习统一面试,面了三轮,只记得第三轮面试时撕的代码是两个链表的大数相加问题,大概涉及到链表的逆置和进行10进制的加法运算…代码量比较大,写得比较久,然后三面完就收到感谢信了(三轮凉凉)

3、6月底,投递字节跳动的超级工程师计划,简历没有通过,然后又流到一个实习生的招聘中,跟HR商量可以按照校招提前批的要求进行面试,深圳头条信息流部门,然后因为实习2个月没有刷题,二面题目没写好,并且问了很多智力题和工程设计题(都是常见问题,在程序员面试笔试宝典和王道程序员面试宝典基本都有覆盖到,所以建议大家面试前细读两本面试书籍查漏补缺),可惜我以前没有接触过,临时想太慢了(二面凉凉,HR小姐姐还给我看了面试评价,基础还可以,可以实习提升工程能力后再来面…)我是真的题刷的少…

4、7月中,投递字节提前批,EE部门toB端,面试中问了很多http相关和web服务器相关的知识,平时了解的较少(一面凉凉)

5、8月中,字节正式批,投递的是上海的基础架构部门,全程聊rpc框架的设计细节…很多没答上来,我真的很恍惚以为面的是社招…因为我本身实习做的是分布式存储,并不是rpc框架开发,一面完让我等一下,结果20分钟后收到凉凉短信,可能是跟主管商量后觉得欠缺相关开发经验给挂了(一面凉凉,I’m fine…)

6、本来以为秋招就此与字节无缘,结果视频架构部门又把我给捞了…这次一口气三面,其中聊了很多网络相关的知识,都是在一些相关知识的基础上,问一些场景设计的问题,比如说让你去设计TCP传输中的超时重传,你该怎么去设计这种…好在我对计算机网络有一定的理解,顺利通过了这次面试,第二天HR就联系发了意向书(3面过)

所以我一共面了1+3+2+1+1+3=11轮…我已经可以想象字节内部我的面试评价可能已经占满了一页,哈哈哈哈…

由于我个人没有记面经的习惯,但是每次遇到一些不太明白的知识点,都会记录到笔记中,面试总结也转成了PDF,放在了我提供了百度网盘中(阅读原文见链接),当然由于个人水平有限,其中肯定会有些错误的地方,还希望各位在学习过程中保持你的好奇心和质疑的能力!

现在由于经济下行、大量人才的涌入,互联网就业确实存在着竞争越来越激烈的问题,但是在秋招求职道路上,只要你能拥有一份清晰且目标明确的学习计划+良好的学习习惯+高效的学习效率+适当的学习记录和思考,都能拿到想要的offer,希望诸君都能享受自己选择的生活~

最后用一句宫崎骏的台词与各位共勉——起风了,唯有努力生存。

接下来,要准备毕设,希望顺利毕业啦!

如果觉得本文不错,希望大家能关注转发下哈,后续会持续给大家更新新的技术内容,你的支持就是对我的动力,感谢大家了。

2018-12-11 20:56:17 weixin_39576743 阅读数 245

图像处理与机器视觉初学者学习路线

 

首先,搞图像处理,熟悉图像算法是必经之路,如果上过图像处理这门课的话,再好不过。如果没有,我推荐中科院研究生院刘定生老师的数字图像处理与分析(视频),这位老师上课引人入胜,值得推荐。其次,在这个阶段,配套的书籍自然是《冈萨雷斯版数字图像处理》这本书,最好同时用matlab软件,仿真每一个图像算法案例,推荐《matlab宝典》。大概花一个月时间,基本的图像算法,相信你已经学完了。第二阶段,希望你再次认真学习C++,推荐《C++ Primer》,因为以后我们开发程序,都是基于类的开发,什么虚函数,类的继承、多态、命名空间、文件的输入输出、模板STL都应非常熟悉。在这之后,VC++你也应该掌握,圣经级的书籍自然是孙鑫的《VC++深入详解》,大概花一个时间,将书上每一个代码都敲一边,消息的映射机制,尤其要非常熟悉,MFC的框架结构也应明白。在此阶段,有时间的话,看看中科院研究生院杨力祥老师的高级windows程序设计(视频),这些代码开发都是基于VC6.0的。

以上如果你都搞明白了,就进入重头戏了。将图像处理算法和代码结合起来,进行开发。首推北航老师谢凤英,赵主培主编的《Visual C++数字图像处理》这本书,将上面的代码都敲一边,你会有不一样的感觉。

最后一个阶段,因为在实际的开发过程中,不可能每一基本算法都要自己写,前人已经写好了。所以推荐大家使用opencv这个开源库,他实现了大多数图像算法,实际开发中,用他的函数就够了,推荐书籍《学习opencv》,《opencv教程》,视频自然是庞峰老师的视频,大家可以在opencv中文论坛上免费观看。至此,该掌握的工具你已经掌握了,但是将MFC和opencv结合起来开发,最好是要有一个项目,你会理解许多。下面是一些大牛:

第一波是一些资源丰富的博客,有算法介绍,也有代码实现:


1、毕业于荷兰特温特大学的Dirk-Jan Kroon博士,在Mathworks的FileExchange上的链接,曾经到访过他原来读书时的主页,当时有句话对他的评价是,他非常喜欢计算机编程,这个真不假,下面这个链接里有他用Matlab写成的近百个程序源码,质量非常高,而且涉猎广泛。

http://www.mathworks.com/matlabcentral/fileexchange/authors/29180


2、这是研究 image matting(中文叫抠图——这名字真难听,不知道是谁始作俑者)必去的一个网站,里面有大量关于这个主题内容的介绍,包括最新的成果,评测和对比。
http://www.alphamatting.com/


3、laviewpbt的专栏,他有两个基本同步的博客,一个在CSDN,一个在博客园,自称是“一心无二用,本人只专注于基础图像算法的实现与优化,如图像增强、滤镜、分割、解码编码等,无心恋及图像识别。 ”。博客中很少有提供完整的源代码,但是对理论算法的介绍非常到位,我也同意博主的看法,如果真的对算法理解到位了,写代码处理并不是难事。
http://www.cnblogs.com/Imageshop/


4、Rachel Zhang的专栏(浙大计算机女硕士),CSDN博客排名百名以内的名博,里面有大量图像处理和计算机视觉的资料,有算法讲解,也有很多代码实现(OpenCV居多,少量Matlab)
http://blog.csdn.net/abcjennifer/article/category/1173803/2


5、小魏的修行路(又一个女学霸,博主应该是北大女硕士),博客都是图文并茂的,很详细很用心,代码实现上也是用OpenCV的居多。
http://blog.csdn.net/xiaowei_cqu/


6、非常棒的网站,超多资源。IPOL is a research journal of image processing and image analysis. Each article contains a text on an algorithm and its source code。讨论了超过20个大的Topics,具体每个Topics里面还有许多具体的实现分支,配有可供研究的源代码。研究图像处理不可不看的网站。

http://www.ipol.im/

 

7、LIBROW,口号是The Helpful Mathematics,算法文章 && C++代码(算法偏基础),适合初学者参考。

http://www.librow.com/articles

 

8、采石工的博客

数学功底深厚、原理推导明晰的博客。非常值得推荐!

http://www.cnblogs.com/quarryman/

 

第二波是我所关注的一些研究方向上比较前沿的学者主页:

 

1、KAZE特征检测作者的主页,里面有文章,也有代码实现。Pablo F. Alcantarilla博士人非常Nice,我给他写Email讨论问题,基本上8个小时之内就能收到回复,也非常感谢他提供的一些参考资料。

http://www.robesafe.com/personal/pablo.alcantarilla/kaze.html

 

2、在去噪领域中当前最成功的算法莫过于BM3D系列(当然还有BM4D等等),下面这个是项目的主页,非常值得推荐,对于研究降噪问题的同学实在应该仔细看看。

http://www.cs.tut.fi/~foi/GCF-BM3D/

 

3、布朗大学Douglas Lanman博士的主页,很多有意思的成果,部分有代码资源下载
http://mesh.brown.edu/dlanman/courses.html

 

4、两位以色列学者(犹太人)的主页。经验中,大部分Paper的作者会在自己的网站上贴出文章,但很少附有代码,如果你自己去写个代码,很多都无法达到作者paper中给出的效果,吹水的可能性极大。但是在研究Close-form soluting 的图像matting时,看到了以色列女学者Anat Levin的主页,作者就提供有matlab代码,很值得推荐。
http://www.wisdom.weizmann.ac.il/~levina/
另外一个以色列学者(以色列理工的Guy Gilboa教授)的主页(有关于TV去噪的代码)。
http://visl.technion.ac.il/~gilboa/PDE-filt/tv_denoising.html

2011-08-03 17:22:41 sun6223508 阅读数 638
在应用开发中  经常用到图片转化,固定图片大小。于是,在这里封装好了 提供给大家用,以后直接拷贝到代码中就可以了。码农都是这样出来的。
如果要学的好。那么C++必须学好,如果不想做码农  那么C++。。。。






     // 缩放图片
    public static Bitmap zoomImg(String img, int newWidth ,int newHeight){
    // 图片源
        Bitmap bm = BitmapFactory.decodeFile(img);
        if(null!=bm){
            return zoomImg(bm,newWidth,newHeight);
        }
        return null;
    }
    
    public static Bitmap zoomImg(Context context,String img, int newWidth ,int newHeight){
        // 图片源
        try {
            Bitmap bm = BitmapFactory.decodeStream(context.getAssets()
                    .open(img));
            if (null != bm) {
                return zoomImg(bm, newWidth, newHeight);
            }
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return null;
        }
     // 缩放图片
    public static Bitmap zoomImg(Bitmap bm, int newWidth ,int newHeight){
        // 获得图片的宽高
        int width = bm.getWidth();
        int height = bm.getHeight();
        // 计算缩放比例
        float scaleWidth = ((float) newWidth) / width;
        float scaleHeight = ((float) newHeight) / height;
        // 取得想要缩放的matrix参数
        Matrix matrix = new Matrix();
        matrix.postScale(scaleWidth, scaleHeight);
        // 得到新的图片
        Bitmap newbm = Bitmap.createBitmap(bm, 0, 0, width, height, matrix, true);
        return newbm;
    }

 //将Drawable转化为Bitmap
  public static Bitmap drawableToBitmap(Drawable drawable){
      int width = drawable.getIntrinsicWidth();
      int height = drawable.getIntrinsicHeight();
      Bitmap bitmap = Bitmap.createBitmap(width, height,
        drawable.getOpacity() != PixelFormat.OPAQUE ? Bitmap.Config.ARGB_8888
                         : Bitmap.Config.RGB_565);
      Canvas canvas = new Canvas(bitmap);
      drawable.setBounds(0,0,width,height);
      drawable.draw(canvas);
      return bitmap;
      
     }



//获得圆角图片的方法
 public static Bitmap getRoundedCornerBitmap(Bitmap bitmap,float roundPx){
  
  Bitmap output = Bitmap.createBitmap(bitmap.getWidth(), bitmap
    .getHeight(), Config.ARGB_8888);
  Canvas canvas = new Canvas(output);
 
  final int color = 0xff424242;
  final Paint paint = new Paint();
  final Rect rect = new Rect(0, 0, bitmap.getWidth(), bitmap.getHeight());
  final RectF rectF = new RectF(rect);
 
  paint.setAntiAlias(true);
  canvas.drawARGB(0, 0, 0, 0);
  paint.setColor(color);
  canvas.drawRoundRect(rectF, roundPx, roundPx, paint);
 
  paint.setXfermode(new PorterDuffXfermode(Mode.SRC_IN));
  canvas.drawBitmap(bitmap, rect, rect, paint);
 
  return output;
 }

//获得带倒影的图片方法
 public static Bitmap createReflectionImageWithOrigin(Bitmap bitmap){
  final int reflectionGap = 4;
  int width = bitmap.getWidth();
  int height = bitmap.getHeight();
  
  Matrix matrix = new Matrix();
  matrix.preScale(1, -1);
  
  Bitmap reflectionImage = Bitmap.createBitmap(bitmap,
    0, height/2, width, height/2, matrix, false);
  
  Bitmap bitmapWithReflection = Bitmap.createBitmap(width, (height + height/2), Config.ARGB_8888);
  
  Canvas canvas = new Canvas(bitmapWithReflection);
  canvas.drawBitmap(bitmap, 0, 0, null);
  Paint deafalutPaint = new Paint();
  canvas.drawRect(0, height,width,height + reflectionGap,
    deafalutPaint);
  
  canvas.drawBitmap(reflectionImage, 0, height + reflectionGap, null);
  
  Paint paint = new Paint();
  LinearGradient shader = new LinearGradient(0,
    bitmap.getHeight(), 0, bitmapWithReflection.getHeight()
    + reflectionGap, 0x70ffffff, 0x00ffffff, TileMode.CLAMP);
  paint.setShader(shader);
  // Set the Transfer mode to be porter duff and destination in
  paint.setXfermode(new PorterDuffXfermode(Mode.DST_IN));
  // Draw a rectangle using the paint with our linear gradient
  canvas.drawRect(0, height, width, bitmapWithReflection.getHeight()
    + reflectionGap, paint);
 
  return bitmapWithReflection;
 }


HALCON图像处理软件

阅读数 2692

1.从头开始

阅读数 20

百度人脸识别Java版

阅读数 1748

没有更多推荐了,返回首页