我正在用OpenCV读取图像,并尝试用numpy做一些事情(旋转90度).imshow
从matplotlib 查看结果,这一切似乎都很好 - 图像旋转.但是,我不能在新图像上使用OpenCV的绘图方法.在以下代码中(我在sagemath云工作表中运行此代码):
%python
import cv2
import matplotlib.pyplot as plt
import numpy as np
import os, sys
image = np.array( cv2.imread('imagename.png') )
plt.imshow(image,cmap='gray')
image = np.array(np.rot90(image,3) ) # put it right side up
plt.imshow(image,cmap='gray')
cv2.rectangle(image,(0,0),(100,100),(255,0,0),2)
plt.imshow(image,cmap='gray')
Run Code Online (Sandbox Code Playgroud)
我在cv2.rectangle()
命令上收到以下错误:
TypeError: Layout of the output array img is incompatible with cv::Mat (step[ndims-1] != elemsize or step[1] != elemsize*nchannels)
Run Code Online (Sandbox Code Playgroud)
如果我np.array(np.rot90(image,4) )
改用(即旋转360),错误就会消失.因此,维度的变化似乎搞砸了.OpenCV是否在内部存储了我需要更新的维度或其他内容?
编辑:解决问题image = image.copy()
后添加rot90()
.请参阅下面的rayryeng的答案.
我收到此错误:运行以下代码时,输出数组img的布局与cv :: Mat(step [ndims-1]!= elemsize或step [1]!= elemsize*nchannels)不兼容:
I1 = cv2.imread('library1.jpg');
I2 = cv2.imread('library2.jpg');
# Load matching points
matches = np.loadtxt('library_matches.txt');
img = np.hstack((I1, I2))
# Plot corresponding points
radius = 2
thickness = 2
for m in matches:
# draw the keypoints
pt1 = (int(m[0]), int(m[1]))
pt2 = (int(m[2] + I1.shape[1]), int(m[3]))
lineColor = cv2.cv.CV_RGB(255, 0, 0)
ptColor = cv2.cv.CV_RGB(0, 255, 0)
cv2.circle(img, pt1, radius, ptColor, thickness)
cv2.line(img, pt1, pt2, lineColor, thickness)
cv2.circle(img, pt2, radius, ptColor, thickness)
cv2.imshow("Matches", img)
Run Code Online (Sandbox Code Playgroud)
此代码用于从不同视图中获取两个相似图像中的相应特征.有什么帮助吗?
numpy.array()中的order参数有什么作用?
它在文档中说我链接到它将指定数组的连续顺序,但我不知道这是什么意思.那么连续的顺序是什么?
订单参数文档的副本:
order:{'C','F','A'},可选指定数组的顺序.如果order是'C'(默认值),则数组将以C连续顺序排列(last-index变化最快).如果order为'F',则返回的数组将采用Fortran连续顺序(first-index变化最快).如果order是'A',则返回的数组可以是任何顺序(C-,Fortran-连续,甚至是不连续的).