np.ndarray转化为cv2
时间: 2023-11-23 22:56:18 浏览: 123
np.ndarray可以通过使用np.array方法将其转换为cv2可以处理的格式。cv2读取和保存的图片都是ndarray数组,形状为HxWxC。要注意的是,cv2读取的图片通道顺序是BGR,如果需要使用正常的RGB通道顺序,可以使用cv2.cvtColor方法进行通道转换。保存时,数据形式是uint8的ndarray数组。<span class="em">1</span><span class="em">2</span><span class="em">3</span>
#### 引用[.reference_title]
- *1* *2* *3* [opencv,numpy,tensor格式转换](https://blog.csdn.net/weixin_38645650/article/details/126031126)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"]
[ .reference_list ]
相关问题
将numpy.ndarray格式转化为jpg图像
要将 numpy.ndarray 格式的数据转换为 jpg 图像,可以使用 OpenCV 库中的 cv2.imwrite() 函数。
cv2.imwrite() 函数用于将图像数据写入到文件中。你需要提供文件名和图像数据。函数会根据文件名的扩展名确定图像格式。例如,如果文件名以 .jpg 结尾,则图像将被保存为 JPG 格式。如果文件名以 .png 结尾,则图像将被保存为 PNG 格式。
以下是一个将 numpy.ndarray 格式转换为 JPG 图像的示例代码:
```python
import cv2
import numpy as np
# 从文件中读取图像数据
img_data = cv2.imread('image.npy')
# 将图像数据转换为 8 位整数类型
img_data = img_data.astype(np.uint8)
# 将图像数据保存为 JPG 图像
cv2.imwrite('image.jpg', img_data)
```
在这个示例中,我们首先使用 cv2.imread() 函数从文件中读取图像数据,然后将图像数据转换为 8 位整数类型,最后使用 cv2.imwrite() 函数将图像数据保存为 JPG 图像。你可以根据实际情况修改文件名和路径。
可以解决AttributeError: 'numpy.ndarray' object has no attribute 'queryIdx问题吗,这部分的代码是def matched_points(K, img_depth1, img_depth2, keypoint1, keypoint2, good_matches): # 测试图像特征点坐标列表(->int) points1 = np.array([list(keypoint1[x.queryIdx].pt) for x in good_matches]).astype(int) # 样本图像特征点坐标列表(->int),PnP 3D-2D中的2D points2 = np.array([list(keypoint2[x.trainIdx].pt) for x in good_matches]).astype(int) points_3d1 = [] points_3d2 = [] # shape函数是Numpy中的函数,它的功能是读取矩阵的长度,比如shape[0]就是读取矩阵第一维度的长度 for i in range(points1.shape[0]): depth1 = img_depth1[points1[i][1], points1[i][0]] # 深度信息,由于imread得到宽高顺序,所以1,0 depth2 = img_depth2[points2[i][1], points2[i][0]] if depth1 == 0 or depth2 == 0: # 没有读取到深度->bad depth continue # 坐标转化为归一化坐标 point1 = pixel2cam(points1[i], K) point2 = pixel2cam(points2[i], K) # 读取深度,这里除以5000不太清楚是固定步骤还是说可改参数( dd1 = point1 / 5000.0 dd2 = point2 / 5000.0 points_3d1.append([point1[1] * dd1, point1[0] * dd1, dd1]) # 世界坐标系坐标 points_3d2.append([point2[1] * dd2, point2[0] * dd2, dd2]) # 相机图像坐标系坐标 points_3d1 = np.array(points_3d1).astype(np.float64) points_3d2 = np.array(points_3d2).astype(np.float64) return points_3d1, points_3d2
这个问题可能是因为good_matches中的元素类型不是cv2.DMatch,而是numpy.ndarray。可以在函数调用之前将其转换为cv2.DMatch类型。
修改代码如下:
```
def matched_points(K, img_depth1, img_depth2, keypoint1, keypoint2, good_matches):
# 将good_matches转换为cv2.DMatch类型
good_matches = [cv2.DMatch(*match) for match in good_matches]
# 测试图像特征点坐标列表(->int)
points1 = np.array([list(keypoint1[x.queryIdx].pt) for x in good_matches]).astype(int)
# 样本图像特征点坐标列表(->int),PnP 3D-2D中的2D
points2 = np.array([list(keypoint2[x.trainIdx].pt) for x in good_matches]).astype(int)
points_3d1 = []
points_3d2 = []
for i in range(points1.shape[0]):
depth1 = img_depth1[points1[i][1], points1[i][0]] # 深度信息,由于imread得到宽高顺序,所以1,0
depth2 = img_depth2[points2[i][1], points2[i][0]]
if depth1 == 0 or depth2 == 0: # 没有读取到深度->bad depth
continue
# 坐标转化为归一化坐标
point1 = pixel2cam(points1[i], K)
point2 = pixel2cam(points2[i], K)
# 读取深度,这里除以5000不太清楚是固定步骤还是说可改参数(
dd1 = depth1 / 5000.0
dd2 = depth2 / 5000.0
points_3d1.append([point1[1] * dd1, point1[0] * dd1, dd1]) # 世界坐标系坐标
points_3d2.append([point2[1] * dd2, point2[0] * dd2, dd2]) # 相机图像坐标系坐标
points_3d1 = np.array(points_3d1).astype(np.float64)
points_3d2 = np.array(points_3d2).astype(np.float64)
return points_3d1, points_3d2
```
阅读全文