import cv2 import numpy as np def main(): # 1.导入图片 img_src = cv2.imread("cc.jpg") # 2.灰度化,二值化 img_gray = cv2.cvtColor(img_src, cv2.COLOR_BGR2GRAY) ret, img_bin = cv2.threshold(img_gray, 127, 255, cv2.THRESH_BINARY) # 3.连通域分析 img_bin, contours, hierarchy = cv2.findContours(img_bin, cv2.RETR_LIST, cv2.CHAIN_APPROX_SIMPLE) # 4.获取最小外接矩形并打印 min_rect = cv2.minAreaRect(contours[0]) print("返回值min_rect:\n", min_rect) rect_points = cv2.boxPoints(min_rect) print("返回值rect_points:\n", rect_points) rect_points = np.int0(rect_points) # 5.绘制最小外接矩形 img_result = img_src.copy() cv2.drawContours(img_result, [rect_points], 0, (255, 255, 255), 2) # 6.显示结果图片 cv2.imshow("img_src", img_src) cv2.imshow("img_result", img_result) cv2.waitKey() cv2.destroyAllWindows() if __name__ == '__main__': main()怎么把图像摆正
时间: 2024-03-11 09:50:29 浏览: 169
要将图像摆正,您可以使用cv2.warpAffine()函数。该函数使用变换矩阵将图像旋转、平移、缩放等转换。以下是一个示例,可以将最小外接矩形旋转到水平方向:
```python
# 计算旋转角度
angle = min_rect[2]
if angle < -45:
angle += 90
# 计算旋转中心
center = tuple(np.array(img_src.shape[1::-1]) / 2)
# 生成变换矩阵
M = cv2.getRotationMatrix2D(center, angle, 1)
# 应用变换矩阵
img_result_rotated = cv2.warpAffine(img_result, M, img_src.shape[1::-1], flags=cv2.INTER_CUBIC)
```
这将生成一个旋转后的图像img_result_rotated。您可以将其保存为图像文件并使用cv2.imshow()函数显示。
相关问题
import cv2 import numpy as np def cv_show(name,img): cv2.imshow(name,img) cv2.waitKey() cv2.destroyAllWindows() def get_img(path1,path2): img1 = cv2.imread(path1) img2 = cv2.imread(path2) img1 = cv2.resize(img1, (300, 400)) img2 = cv2.resize(img2, (300, 400)) #原图像变换为灰度图 img1_gray = cv2.cvtColor(img1, cv2.COLOR_BGR2GRAY) img2_gray = cv2.cvtColor(img2, cv2.COLOR_BGR2GRAY) return img1,img2,img1_gray,img2_gray def get_info(img1_gray,img2_gray): # 尺度不变特征变换 sift = cv2.SIFT_create() # 关键点以及特征向量计算 kp1, des1 = sift.detectAndCompute(img1_gray, None) kp2, des2 = sift.detectAndCompute(img2_gray, None) kp1 = np.float32([kp.pt for kp in kp1]) kp2 = np.float32([kp.pt for kp in kp2]) return kp1,des1,kp2,des2 def get_match(kp1,kp2,des1,des2): # 特征点交叉检验 bf = cv2.BFMatcher() matches = bf.knnMatch(des1, des2,k=2) idx_pair=[] for m,n in matches: if m.distance<n.distance*0.75: idx_pair.append((m.queryIdx,m.trainIdx)) if len(idx_pair)>4: pt_list1 = np.float32([kp1[i] for (i, _) in idx_pair]) pt_list2 = np.float32([kp1[i] for (_, i) in idx_pair]) H,_ = cv2.findHomography(pt_list2,pt_list1,cv.RANSAC,4) result = cv2.warpPerspective(img2, H, (img1.shape[1] + img2.shape[1], img1.shape[0])) result[0:img1.shape[0], 0:img1.shape[1]] = img1 return result #main函数 path1='img1.jpg' path2='img2.jpg' img1,img2,img1_gray,img2_gray=get_img(path1,path2) kp1,des1,kp2,des2=get_info(img1_gray,img2_gray) result=get_match(kp1,des1,kp2,des2) cv_show('result',result)对以上代码debug
这段代码的功能是将两张图片进行拼接,其中使用了SIFT算法进行特征点提取和匹配,以及RANSAC算法计算单应性矩阵。对于代码本身,我看到以下几个问题:
1.第一行的import语句应该写在不同的行中,而不是在同一行中。
2.在函数get_match()中,第12行的cv.RANSAC应该改为cv2.RANSAC。
3.在函数get_match()中,第20行的kp1应该改为kp2。
4.在函数get_match()中,第22行的img2应该改为img1。
5.在主函数中,img1和img2的大小应该保持一致,否则无法进行拼接。
6.在主函数中,应该调用cv_show()函数来显示img1和img2,以便查看它们的内容。
7.在主函数中,应该将result保存为文件,而不是直接展示在屏幕上。
希望我的解答能够帮助到你!
import numpy import numpy as np import tensorflow as tf import matplotlib.pyplot as plt import os import cv2 as cv from sklearn.model_selection import train_test_split def getImgeAndLabels(path): #存放训练图片 facesSamples = [] #存放图片id ids = [] #存放路径和名称 imagPaths = [] for f in os.listdir(path): #连接文件夹路径和图片名称 result = os.path.join(path,f) #存入 imagPaths.append(result) face_detector = cv.CascadeClassifier(r'D:\pyh\envs\OpenCV\Lib\site-packages\cv2\data\haarcascade_frontalface_default.xml') for imagPath in imagPaths: #读取每一种图片 img = cv.imread(imagPath) PIL_img = cv.cvtColor(img,cv.COLOR_BGR2GRAY) #获取每张图片的id 利用os.path.split的方法将路径和名称分割开 id = int(os.path.split(imagPath)[1].split('.')[0]) facesSamples.append(PIL_img) ids.append(id) return facesSamples,ids if __name__ == '__main__': path = './data/' faces,ids = getImgeAndLabels(path) x = np.array(faces,dtype = np.uint8) y = np.array(ids,dtype = np.uint8) x_train,x_test,y_train,y_test = train_test_split(x,y,test_size=0.2,random_state=0) model = tf.keras.models.Sequential([ tf.keras.layers.Input(shape=(112, 92)), #拉平转化为一维数据 tf.keras.layers.Flatten(input_shape=(112,92)), #定义神经网络全连接层,参数是神经元个数以及使用激活函数 tf.keras.layers.Dense(200,activation='relu'), #设置遗忘率 # tf.keras.layers.Dropout(0.2), #定义最终输出(输出10种类别,softmax实现分类的概率分布) tf.keras.layers.Dense(16,activation='softmax') ]) model.compile( optimizer = 'adam', loss = 'sparse_categorical_crossentropy', metrics = ['accuracy']) print("模型*************") model.fit(x,y,epochs=80) print("成绩***********") model.evaluate(x_test,y_test) class_name = ['u1','u2','u3', 'u4','u5','u6','u7','u8','u9','u10','u11','u12','u13',] predata = cv.imread(r'./data/5.pgm') predata = cv.cvtColor(predata, cv.COLOR_RGB2GRAY) reshaped_data = np.reshape(predata, (1, 112, 92)) #预测一个10以内的数组,他们代表对10种不同服装的可信度 predictions_single = model.predict(reshaped_data) max = numpy.argmax(predictions_single) #在列表中找到最大值 print(class_name[max-1]) plt.imshow(x_test[10],cmap=plt.cm.gray_r) plt.show()
这段代码是一个人脸识别的模型,使用了 TensorFlow 和 OpenCV 库。首先通过 getImgeAndLabels 函数获取训练数据集,然后使用 train_test_split 函数将数据集分成训练集和测试集。接着使用 Sequential 模型定义了一个神经网络模型,包含了一个输入层、一个全连接层和一个输出层,其中激活函数采用了 relu 和 softmax。使用 compile 函数对模型进行编译,指定了优化器、损失函数和评价指标。然后使用 fit 函数对模型进行训练,使用 evaluate 函数对模型进行测试。最后使用预测函数 predict 进行预测并输出结果。
阅读全文
相关推荐
















