plt.show无法显示图片,imread与random.randint生成narray数组的区别

使用np.random.randint生成了数组,但是没法像读取图像后生成的数组,使用plt.show显示图片显示如下错误(估计使用pil图像也是如此)

> Unsupported depth of input image:
>     'VDepth::contains(depth)'
> where
>     'depth' is 4 (CV_32S)

初步分析,应该是与数据类型相关

对比imread与randint生成数组的数据类型

首先,我们看使用randint生成的数组数据类型

img4Random = np.random.randint(0,256,1200,dtype= 'i')
bgrImg4Random  = img4Random.reshape(20,20,3)

这里生成的数组,每个元素的范围是从0~255,但是数据类型是int32(dtype=‘i’)

print(bgrImg4Random[0,0])
print(bgrImg4Random[0,0,0])
print(bgrImg4Random[0,0,1])
print(bgrImg4Random[0,0,2])
type(bgrImg4Random[0,0,2])

显示结果如下

[ 20 103  51]
20
103
51
numpy.int32

如果省略dtype参数,默认数据类型是int64

img4Random = np.random.randint(0,256,1200)

显示结果如下

numpy.int64

现在我们看看从jpg生成的数组情况,如下

img1 = cv2.imread("ls.jpg")
print(img1[0,1,0])
type(img1[0,0,0])

数据类型是 unit8,也可以用print(image1.dtype)来显示数据类型

33
numpy.uint8

转换数组的数据类型

使用np.unit8或者astype两种方式都可以进行转换到unit8

bgrImg4Random  = img4Random.reshape(20,20,3)
#bgrImg4Random = np.uint8(bgrImg4Random)
#bgrImg4Random=bgrImg4Random.astype(np.uint8)

图像显示出来了,随机的3通道图像,20*20个像素
Screen Shot 2021-03-06 at 2.37.07 PM

参考

数据读入就是unit8,使用np.unit8转换,这里介绍了pil图像,暂时我没有使用过;
解释opencv灰度图和RGB图数据类型,int是32位,而8位就足够了,采用int会浪费存储空间。
介绍opencv处理图像使用unit8

Learning OpenCV Day one

运行demo文件:

import cv2
image = cv2.imread('MyPic.png')
cv2.imwrite('MyPic.jpg', image)

出现如下错误

cv2.error: OpenCV(4.5.1) /tmp/opencv-20210108-6455-1src644/opencv-4.5.1/modules/imgcodecs/src/loadsave.cpp:753: error: (-215:Assertion failed) !_img.empty() in function 'imwrite'

修改mypic.png为绝对路径(/Users/m…/Study/learningOC/MyPic.png),修复完成。

解决opt_flow.py问题

terminal问题

昨天测试opt_flow还正常,今天发现在studio code下面就现实无法获取摄像头权限(hist.py都正常),命令行模式也无法运行。
做了如下修改:

brew update-reset

同时修改了pip的源(从清华修改为科大)。
因为做了两个操作,我也不清楚是哪个起了作用,命令行模式是ok了。

vscode问题

国外大拿分析(见参考),vscode下opcv摄像头没有权限,是由于apple mac没有给予vscode权限,在system preference里的camera部分,也没有能够增加vscode的地方,因此需要直接修改security&privacy存储数据的地方,见下面。完成后重启vscode即可(修改前,需要在system preference里授予terminal-Full Disk Access权限)

cd ~/Library/Application Support/com.apple.TCC
cp TCC.db TCC.db_backup
sqlite3 TCC.db
INSERT into access (service, client, client_type, auth_value, auth_reason, auth_version) VALUES ("kTCCServiceCamera","com.microsoft.VSCode",0,2,0,1);
INSERT into access (service, client, client_type, auth_value, auth_reason, auth_version) VALUES ("kTCCServiceMicrophone","com.microsoft.VSCode",0,2,0,1);
.exit

Screen Shot 2021-02-22 at 21.55.12

参考
vscode获得camera权限

brew和zsh的小问题

brew

昨天开始学习opencv,一天时间把环境都没有搞好,主要是mac系统升级到big sur以后,brew出现了很多告警,而且跟新起来除了很多问题,包括使用【brew update-reset】重新安装xcode tools也不行,终于下定决心,重新安装brew,问题基本搞定,安装脚本如下

/bin/zsh -c "$(curl -fsSL https://gitee.com/cunkai/HomebrewCN/raw/master/Homebrew.sh)"

然后依次安装opencv和scipy库

brew doctor
brew install python(我已经安装好了)
brew install opencv
brew install scipy

查看opencv版本如下

opencv_version

ZSH

使用国内中科大的源,安装完brew后,每次打开terminal,会出现如下提示

[oh-my-zsh] Insecure completion-dependent directories detected:
drwxrwxrwx 7 hans admin 238 2 9 10:13 /usr/local/share/zsh
drwxrwxrwx 6 hans admin 204 10 1 2017 /usr/local/share/zsh/site-functions

大意是zsh认为目录权限有问题,解决方法如下

chmod 755 /usr/local/share/zsh
chmod 755 /usr/local/share/zsh/site-functions

参考
1 zsh问题
2 brew中科大源