duangsuse::Echo
718 subscribers
4.26K photos
130 videos
583 files
6.48K links
import this:
美而不丑、明而不暗、短而不凡、长而不乱,扁平不宽,读而后码,行之天下,勿托地上天国。
异常勿吞,难过勿过,叹一真理。效率是很重要,盲目最是低效。
简明是可靠的先验,不是可靠的祭品。
知其变,守其恒,为天下式;穷其变,知不穷,得地上势。知变守恒却穷变知新,我认真理,我不认真。

技术相干订阅~
另外有 throws 闲杂频道 @dsuset
转载频道 @dsusep
极小可能会有批评zf的消息 如有不适可退出
suse小站(面向运气编程): https://WOJS.org/#/
Download Telegram
Forwarded from dnaugsuz
其实我晚上下去散步的时候结合之前看到的一些代码也想到了这个无厘头的方式,不过把它当笑话了
毕竟 UMat <-> ndarray <-> Image 感觉有点太嵌套了
Forwarded from dnaugsuz
我只知道 cv::Mat 好像不是个指针的样子,U 的意思是 unified ?
duangsuse::Echo
Photo
非常容易移植到 OpenCV,只有 font, font_size, scale, spacing 和 text, image 这几个参数
我只需要把 ImageDraw 抽象一个就好了

其实移植到 Java 的 java.awt.image.BufferedImagejava.awt.Graphics 也一点也不困难,甚至可以用 C++ or JNI 的,但我觉得能用是最重要的,而且本来也该可以画些非字符的东西。
Forwarded from Aelita Lyoko
其实opencv对图像这个矩阵的抽象有三代
opencv 1 是C语言风格实现,用的是 IplImage 和 CvMat 这个东西,就是个指向c结构体的指针,用各种函数的时候就要把这个指针传来传去
opencv 2 开始是C++风格实现,用的是Mat这个东西,本质上是一个c++类,通常在栈上,然后数据放在堆上,和std::vector是同样的设计风格,用各种函数的时候传的就是引用了
但是在这个时候,如果需要做GPU计算,比如opencl或者cuda,那么就得用专门的cv::ocl或者cv::cuda名字空间里面的东西,还得把数据的格式在主机内存和显卡内存直接转换来转换去的
opencv 3 开始就试图统一 主机内存和显卡内存,发明了UMat这个东西,这个东西和Mat的不同之处就是,UMat底层可能对应到主机内存或者显卡内存,所以限制了部分显卡内存里面没法实现的函数和操作,用起来的手感有点像是直接用ocl空间里面的东西
opencv 4 现在在搞计算图graph这个东西,目测是想搞lazy计算那种吧?还在起步实验阶段的样子
def solveItemColorLayout(img, item_size, scale, spacing):
(width, height) = img.size
(w_item, h_item) = tuple(int((item_size+sp)*scale) for sp in spacing)
(m_item, n_item) = tuple(int(v) for v in [width / w_item, height / h_item])
(padLeft, padTop) = tuple(int(v*scale / 2) for v in [(width % w_item), (height % h_item)])

imgable_area = img.crop((padLeft, padTop, img.width-padLeft, img.height-padTop))
img_average = imgable_area.resize((m_item, n_item), Image.ANTIALIAS)

for i in range(0, n_item):
for j in range(0, m_item):
(y, x) = (i*h_item, j*w_item)
yield (x, y, img_average.getpixel((j, i)) )
#Python #code #CV 这段安排布局,算 (w, h) (m, n) (padLeft, padTop) 的才是关键代码
它也依赖 Image.size, Image.getpixel, Image.cropImage.resize

然后就一把:
areas = solveItemColorLayout(scaledImage, cfg.font_size, cfg.scale, cfg.spacing)
drawTextMontage(newImage, areas, cycle(cfg.text), cfg.font, calc_draw_color)
提供 font_size, scale, spacing 和 image, areas, seq, font, calc_color 即可

OpenCV 的画图根本不能用 truetype 这么自由,它的字体都是内置的!

如果想要给 OpenCV 脚本画的视频打时间轴,还得靠 expandRangeStarts 这个函数来展开一堆 [start, stop, value] 才可以
img = np.zeros((200,400,3),np.uint8)
b,g,r,a = 0,255,0,0

## Use cv2.FONT_HERSHEY_XXX to write English.
text = time.strftime("%Y/%m/%d %H:%M:%S %Z", time.localtime())
cv2.putText(img, text, (50,50), cv2.FONT_HERSHEY_SIMPLEX, 0.7, (b,g,r), 1, cv2.LINE_AA)

## Use simsum.ttc to write Chinese.
fontpath = "./simsun.ttc"
font = ImageFont.truetype(fontpath, 32)
img_pil = Image.fromarray(img)
draw = ImageDraw.Draw(img_pil)
draw.text((50, 100), "国庆节/中秋节 快乐!", font = font, fill = (b, g, r, a))
img = np.array(img_pil)


#Python #CV ——http://stackoverflow.com/questions/37191008/ddg#46558093
看来还是得用 numpy 互化才可以…… 根本不应该尝试用 cv2 弄这种画文字的东西嘛
def zipWithNext(xs: list):
require(len(xs) % 2, lambda it: it == 0, "list not paired, rest ")
for i in range(1, len(xs), 2):
yield (xs[i-1], xs[i])

def expandRangeStarts(starts, n):
indexed = list(range(n))
def assign(start, stop, value):
nonlocal indexed
for i in range(start, stop): indexed[i] = value
sorted_starts = sorted(starts, key=lambda it: it[0])
for (a, b) in zipWithNext(sorted_starts):
assign(a[0], b[0], a[1])
(last, last_value) = sorted_starts[-1]
assign(last, n, last_value)


#Python #code 🤔
OpenCV 的 VideoWriter 真是无聊,本来以为 fourcc 设计也就是个 4*len(ascii) 不能算嘈点,结果静默失败,我调用了 write 结果输出个空文件,还不能当参数传不然莫名其妙返回什么 NULL 错误
#bilibili #cv 2018.3 左右弹幕使似乎加入背景检测算法了,可以避免弹幕挡住活动物体,你们说是不是 🤔(注:有人猜测只是弹幕和视频的绘制/更新顺序有点问题导致的 bug=feature,经查 v5.44.2 无相应开关)
Forwarded from 喜欢吃 花生
fread时发生奔溃A/libc: Fatal signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 0x0,该怎么debug
Forwarded from dnaugsuz
上 c++ 问,说不定是 native 内存给小了
Forwarded from 喜欢吃 花生
malloc了33104的内存,然后errno就12 out of memory了
Forwarded from 喜欢吃 花生
Forwarded from 喜欢吃 花生
profiler上显示native占用的60mb的的内存
Forwarded from dnaugsuz
我感觉 Android 群懂 mmap() 相关的人可能不多,你应该找 C++ 或者 libc 群去问
但在之前应该先确认是不是调用参数弄错了
#Java #Kotlin 如何拿到 Array<Class<*>>Class<T>
Forwarded from 梦断代码
请问有人知道 Class[].class 对应在 Kotlin 中应该怎么写吗?
我尝试了 Array<Class>::class.java 和 Array<Class<*>>::class.java 都无法编译
Forwarded from STRRL