opencv学习笔记

1.图像读写压缩
img=cv2.imread(r"1.png",1) # 读取
cv2.imshow(“image”,img) # 显示
cv2.imwrite(“out1.jpg”,img,) # 写
cv2.imwrite(“yasuo.png”,img,[cv2.IMWRITE_PNG_COMPRESSION,9] ) #png 压缩
jpg压缩0-100(100质量最好) ,png 0-9(0质量最好)

2.图像resize dst=cv2.resize(img,(w,h))
2.1最近邻域插值法 iNew=int(i*(height1.0/des_height)) jNew=int(j(width*1.0/des_width))
2.2双线性插值法

3.缩放矩阵
[[A1 ,A2,B1] , [A3,A4,B2]] == > 拆分为[[A1,A2],[A3,A4]] 和 [[B1,B2]] 对于输入xy来说
Newx = A1x+A2Y+B1
newY =A2x+A2y +B2
4.仿射函数
获取仿射变换矩阵 cv2.getAffineTransform(mat_src,mat_det) #左上左下右上三个点映射,
获取旋转矩阵 cv2.getRotationMatrix2D((width/2,height/2),45,0.5)#中心,旋转
角度,缩放比
然后进行仿射变换

5.转灰度图
cv2.imread(“1.jpg”,0)
dest=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
心理学公式r0.299+g0.587+b*0.114

6.颜色反转 负片 255 -像素(灰度 bgr都可以)
7.马赛克 相邻10个像素用同一个像素替换 例子

foriinrange(100,500):
forjinrange(200,400):
ifi%100andj%100:
b,g,r=img[i,j]
forxinrange(0,10):
for y inrange(0,10):
dest[i+x,j+y]=(b,g,r)

8.毛玻璃效果 与马赛克类似,只不过是一定范围内随机取像素替代
mm=8#范围
For i in range(0,h-mm):
For j in range(0,w-mm):
index=int(random.random()*8)
b,g,r=img[i+index,j+index]
dest[i,j]=(b,g,r)
9.边缘检测
9.1 canny 灰度 去噪声 最后检测
img=cv2.imread(“1.jpg”,1)
gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
cv2.GaussianBlur(gray,(3,3),0) # 卷积核
dest=cv2.Canny(img,300,300) # 300是阈值
9.2sobel 2个矩阵,公式为 像素分别卷积这两个矩阵。分别得出x y方向的卷积值,然后,算梯度,比阈值
#x方向的矩阵
#[[1,2,1],
#[0,0,0],
#[-1,-2,-1]]
#y方向的矩阵
#[[1,0,-1],
#[2,0,-2],
#[1,0,-1]]

For I in range(0,h-2):
	For j in range(0,w-2):
		gy=gray[i,j]+gray[i,j+1]*2+gray[i,j+2]-gray[i+2,j]-2*gray[i+2,j+1]-gray[i+2,j+2]
		gx=gray[i,j]-gray[i,j+2]+2*gray[i+1,j]-2*gray[i+1,j+2]+gray[i+2,j]-gray[i+2,j+2]
		gard=math.sqrt(gx*gx+gy*gy) # 求梯度
		If gard > 300:    # 阈值300
			dest[i,j]=255
		else:
			dest[i,j]=0

10 浮雕效果 公式 (x)点像素-(x+1)点像素+150
11 油画 效果
#1灰度化
#2图片分为若干个方块,统计小方块灰度值
#3把灰度值分等级如8个段,把步骤2的灰度值映射到等级里
#4找到灰度等级最多的等级,并计算平均值
#5平均值替换原来的像素值

12 绘制
12.1直线绘制 cv2.line(dst,(100,200),(400,200),(0,255,0),10,cv2.LINE_AA)#图,起始位置,结束位置,颜色,宽度,抗锯齿参数
12.2矩形绘制cv2.rectangle(dst,(100,100),(400,400),(0,255,255),-1)#图,起始,结束,颜色,内容填充-1为填充,>0为宽度
12.3 圆形 cv2.circle(dst,(200,200),50,(255,0,0),-1)#图,圆心,半径,颜色,填充

13视频处理
cap=cv2.VideoCapture(“1.mp4”)
isOpen=cap.isOpened()
fps=cap.get(cv2.CAP_PROP_FPS)#fps
width=int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))#每一帧宽
height=int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))#每一帧宽
(flag,frame)=cap.read()#读取一帧 ,flag成功与否,frame

#图片生成视频
videoWirte=cv2.VideoWriter("out.mp4",-1,24,(640,480)) #,保存的视频,文件名,变啊默契,帧率,尺寸
videoWirte.write(img) #写图片
14. 特征
	a. harr特征 +adaboost分类
	b. Hog 特征 +svm分类 寻求最优超平面
		svm=cv2.ml.SVM_create()#创建支持向量积
		svm.setType(cv2.ml.SVM_C_SVC)#svmtype类型
		svm.setKernel(cv2.ml.SVM_LINEAR)#线性分类器
		svm.setC(0.01)
		result=svm.train(data,cv2.ml.ROW_SAMPLE,label)
		#预测
		(pre1,pre2)=svm.predict(pt_data)
		
		i. 特征 img   整个图
		ii. windows窗体   图中一部分,推荐大小为 64*128 , 特征计算最顶层单元,得到目标全部信息特征,可以判决
		iii. Block    窗体种一部分  ,来滑动的计算的 ,windowsize的wh是其整数倍,推荐大小16*16,步长一般8*8 。 计算block的数量为((64-16)/8+1) *((128-16)/8+1) =105
		iv. Cell      block中一部分 ,一般8*8     一个block有四个,
		v. Bin   一个bin 40度,一个cell含有九个bin
		vi. hog特征维度 是一个向量,维度 =105*4*9 =3780   (wind bolck个数* block下cell个数*cell下bin个数)
		vii. 梯度:像素为单位 (需要计算 windows窗体下所有元素)特征模板 :水平[1 0 -1]竖直[[1] [0] [1]]    将像素与模板进行卷积运算 。  f为 根号下(a方+b方) angle =arctan(a/b)
华为OD机试是华为公司用于招聘软件开发工程师的一项重要考核环节。2024年的华为OD机试题库中包含了多种类型的编程题目,主要以C语言为主。以下是一些常见的题型和示例: 1. **基础算法题**: - 题目:实现一个函数,计算两个整数的最大公约数(GCD)。 - 示例代码: ```c #include <stdio.h> int gcd(int a, int b) { if (b == 0) return a; return gcd(b, a % b); } int main() { int a, b; printf("Enter two integers: "); scanf("%d %d", &a, &b); printf("GCD of %d and %d is %d\n", a, b, gcd(a, b)); return 0; } ``` 2. **数据结构题**: - 题目:实现一个简单的链表,并提供插入和删除操作。 - 示例代码: ```c #include <stdio.h> #include <stdlib.h> struct Node { int data; struct Node* next; }; void insert(struct Node** head_ref, int new_data) { struct Node* new_node = (struct Node*)malloc(sizeof(struct Node)); new_node->data = new_data; new_node->next = (*head_ref); (*head_ref) = new_node; } void deleteNode(struct Node** head_ref, int key) { struct Node *temp = *head_ref, *prev; if (temp != NULL && temp->data == key) { *head_ref = temp->next; free(temp); return; } while (temp != NULL && temp->data != key) { prev = temp; temp = temp->next; } if (temp == NULL) return; prev->next = temp->next; free(temp); } void printList(struct Node* node) { while (node != NULL) { printf("%d ", node->data); node = node->next; } } int main() { struct Node* head = NULL; insert(&head, 3); insert(&head, 2); insert(&head, 1); printf("Created Linked List: "); printList(head); deleteNode(&head, 2); printf("\nLinked List after Deletion of 2: "); printList(head); return 0; } ``` 3. **逻辑题**: - 题目:给定一个整数数组,找出其中没有出现的最小正整数。 - 示例代码: ```c #include <stdio.h> int firstMissingPositive(int* nums, int numsSize) { for (int i = 0; i < numsSize; i++) { while (nums[i] > 0 && nums[i] <= numsSize && nums[nums[i] - 1] != nums[i]) { int temp = nums[nums[i] - 1]; nums[nums[i] - 1] = nums[i]; nums[i] = temp; } } for (int i = 0; i < numsSize; i++) { if (nums[i] != i + 1) { return i + 1; } } return numsSize + 1; } int main() { int nums[] = {3, 4, -1, 1}; int size = sizeof(nums)/sizeof(nums[0]); printf("The smallest missing positive integer is %d\n", firstMissingPositive(nums, size)); return 0; } ``` 这些题目涵盖了C语言编程中的基础算法、数据结构和逻辑思维等方面。准备华为OD机试时,建议多练习类似题型,提升编程能力和解题技巧。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值