- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我想扭曲图像的子部分以将其投影到不均匀的表面上。最终我想像看到的那样扭曲图像 HERE ,有点像在 HERE 中完成的来自 THIS项目。
我的问题是当我将变换应用到图像的每个子部分时,事情就是不对齐
这是我实现转换然后拼接(裁剪并将它们粘贴到最终图像上)的过程。
这 4 个点用于将图像与相应的原始 4 个点进行变换。这是使用我的函数 perspective_transform() 完成的
一个。我取 2 组 4 个点并将它们传递给 M = cv2.getPerspectiveTransform(corners, newCorners)
然后我调用:warped = cv2.warpPerspective(roi, M, (width, height))
在获得新的扭曲图像后,我使用蒙版根据与之关联的 ROI 将所有内容拼接在一起:
一个。这是由函数 quadr_croped() 完成的
img0 = np.array(sct.grab(monitor))
clone = img0.copy()
total_height, total_width, channels = img0.shape
xSub =int (input("How many columns would you like to divide the screen in to? (integers only)"))
ySub =int (input("How many rows would you like to divide the screen in to? (integers only)"))
roi_width = float(total_width/xSub)
roi_height = float(total_height/ySub)
point_list = []
def perspective_transform(image, roi, corners, newCorners, i = -1 ):
corners = list (corners)
newCorners = list (newCorners)
height, width, pixType = image.shape
corners = np.array([[corners[0][0],corners[0][1],corners[0][2],corners[0][3]]],np.float32)
newCorners = np.array([[newCorners[0][0],newCorners[0][1],newCorners[0][2],newCorners[0][3]]],np.float32)
M = cv2.getPerspectiveTransform(corners, newCorners)
#warped = cv2.warpPerspective(roi, M, (width, height), flags=cv2.INTER_LINEAR)
warped = cv2.warpPerspective(roi, M, (width, height))
return warped
def quadr_croped (mainImg,image, pts, i): # example
# mask defaulting to black for 3-channel and transparent for 4-channel
# (of course replace corners with yours)
mask = np.zeros(image.shape, dtype=np.uint8)
roi_corners = pts #np.array([[(10,10), (300,300), (10,300)]], dtype=np.int32)
# fill the ROI so it doesn't get wiped out when the mask is applied
channel_count = image.shape[2] # i.e. 3 or 4 depending on your image
ignore_mask_color = (255,)*channel_count
cv2.fillConvexPoly(mask, roi_corners, ignore_mask_color)
# apply the mask
masked_image = cv2.bitwise_and(image, mask)
mainImg = cv2.bitwise_or(mainImg, mask)
mainImg = mainImg + masked_image
# cv2.imshow("debug: image, mainImg: " +str(i), mainImg)
return mainImg
def draw_quadr(img1):
#set up list for ROIquadrilateral == polygon with 4 sides
numb_ROI = xSub * ySub
skips =int((numb_ROI-1)/xSub)
numb_ROI = skips + numb_ROI
quadrilateral_list.clear()
for i in range(numb_ROI):
if not point_list[i][0] <= point_list[(i+xSub+2)][0]:
continue
vert_poly = np.array([[
point_list[i],
point_list[i+1],
point_list[i+xSub+2],
point_list[i+xSub+1]
]], dtype=np.int32)
verticesPoly_old = np.array([[
H_points_list[i],
H_points_list[i+1],
H_points_list[i+xSub+2],
H_points_list[i+xSub+1]
]], dtype=np.int32)
roi = img0.copy()
# cv2.imshow("debug: roi"+str(i), roi)
overlay = perspective_transform(
img1,
roi,
verticesPoly_old,
vert_poly,
i)
img1 = quadr_croped(img1,overlay,vert_poly,i)
cv2.polylines(img1,vert_poly,True,(255,255,0))
quadrilateral_list.append(vert_poly)
pt1 = point_list[i]
pt2 = point_list[i+xSub+2]
cntPt = (int( (pt1[0]+pt2[0])/2),int((pt1[1]+pt2[1])/2) )
cv2.putText(img1,str(len(quadrilateral_list)-1),cntPt,cv2.FONT_HERSHEY_SIMPLEX, 1,(0,255,0),2,cv2.LINE_AA)
#cv2.imshow(str(i), img1)
return img1
请查看这些,因为它们很好地说明了问题。
没有失真的原始图像
此图像从中心向左偏移(没有 y 方向移动)
x方向畸变图像的结果
此图像从中心向上偏移(没有 x 方向移动)
y方向畸变图像的结果
这张图片从中心向上和向左偏移
x和y方向畸变图像的结果
我是计算机视觉和 stackoverflow 的新手,我希望我已经包含了帮助描述问题的所有内容,如果您需要了解任何其他帮助,请告诉我
最佳答案
代码中肯定存在一些错误,因为输出图像看起来不像它们应该的那样(或可能不是)。但是由于透视变换的数学性质,您永远无法准确地得到您想要的东西。即,因为它们是非线性的。您可以使矩形角点重合,但在角点之间图像缩放不均匀,并且您不能使这些不均匀性在分界线的两侧相同。
但是您可以使用仿射变换来统一缩放图像。这保证了如果一条线上的两点重合,则所有其他点也重合。这里唯一的问题是仿射变换是使用三角形确定的,因此您需要将四边形拆分为三角形。例如。在下面的代码中,每个四边形都被分成 4 个三角形,使用四边形的中心作为附加顶点。
import numpy as np
import matplotlib.pyplot as plt
import cv2
# generate a test image
im = np.full((400,600), 255, 'u1')
h, w = im.shape
for i in range(1, w//20):
im = cv2.line(im, (i*20, 0), (i*20, h), i*8)
for i in range(1, h//20):
im = cv2.line(im, (0, i*20), (w, i*20), i*10)
plt.figure(figsize=(w/30, h/30))
plt.imshow(im, 'gray')
plt.show()
# Number of grid cells
nx, ny = 3, 2
p0 = np.meshgrid(np.linspace(0, w-1, nx+1, dtype='f'), np.linspace(0, h-1, ny+1, dtype='f'))
print(np.vstack(p0))
p1 = [v.copy() for v in p0]
# Move the central points
p1[0][1,1] -= 30; p1[1][1,1] -= 40
p1[0][1,2] += 20; p1[1][1,2] += 10
print(np.vstack(p1))
# Set perspective = True to see what happens if we use perspective transform
perspective = False
im1 = np.zeros_like(im)
for i in range(nx):
for j in range(ny):
x0, y0 = p0[0][j,i], p0[1][j,i]
c0 = np.stack((p0[0][j:(j+2),i:(i+2)].ravel() - x0, p0[1][j:(j+2),i:(i+2)].ravel() - y0))
c1 = np.stack((p1[0][j:(j+2),i:(i+2)].ravel(), p1[1][j:(j+2),i:(i+2)].ravel()))
if perspective:
ic0 = np.round(c0).astype('i')
ic1 = np.round(c1).astype('i')
M = cv2.getPerspectiveTransform(c0.T, c1.T)
imw = cv2.warpPerspective(im[ic0[1,0]:ic0[1,3], ic0[0,0]:ic0[0,3]], M, (w, h))
im1 |= cv2.fillConvexPoly(np.zeros_like(im), ic1[:,[0,1,3,2]].T, 255) & imw
else:
c0 = np.append(c0, np.mean(c0, axis=1, keepdims=True), 1)
c1 = np.append(c1, np.mean(c1, axis=1, keepdims=True), 1)
ic0 = np.round(c0).astype('i')
ic1 = np.round(c1).astype('i')
for ind in ([0,1,4], [1,3,4], [3,2,4], [2,0,4]):
M = cv2.getAffineTransform(c0[:,ind].T, c1[:,ind].T)
imw = cv2.warpAffine(im[ic0[1,0]:ic0[1,3], ic0[0,0]:ic0[0,3]], M, (w, h))
im1 |= cv2.fillConvexPoly(np.zeros_like(im), ic1[:,ind].T, 255) & imw
plt.figure(figsize=(w/30, h/30))
plt.imshow(im1, 'gray')
plt.show()
关于opencv - 图像子部分的扭曲透视变换不对齐,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55872909/
我正在尝试从我的系统中完全删除 opencv。我试图学习 ROS,而在教程中我遇到了一个问题。创建空工作区后,我调用catkin_make 它给出了一个常见错误,我在 answers.ros 中搜索并
我在尝试逐步转移对warpAffine的调用时遇到崩溃(不是异常): void rotateImage( const Mat& source, double degree, Mat& output )
如何处理opencv gpu异常?是否有用于opencvgpu异常处理的特定错误代码集api? 我尝试了很多搜索,但只有1个错误代码,即CV_GpuNotSupported。 请帮帮我。 最佳答案 虽
笔记 我是 OpenCV(或计算机视觉)的新手,所以告诉我搜索查询会很有帮助! 我想问什么 我想编写一个从图片中提取名片的程序。 我能够提取粗略的轮廓,但反射光会变成噪点,我无法提取准确的轮廓。请告诉
我想根据像素的某个阈值将Mono16类型的Mat转换为二进制图像。我尝试使用以下内容: 阈值(img,ret,0.1,1,CV_THRESH_BINARY); 尝试编译时,出现make错误,提示: 错
我对使用GPU加速的OpenCV中的卷积函数有疑问。 使用GPU的卷积速度大约快3.5 运行时: convolve(src_32F, kernel, cresult, false, cbuffer);
我正在尝试使用非对称圆圈网格执行相机校准。 我通常找不到适合CirclesGridFinder的文档,尤其是findHoles()函数的文档。 如果您有关于此功能如何工作以及其参数含义的信息,将不胜感
在计算机上绘图和在 OpenCV 的投影仪上投影之间有什么区别吗? 一种选择是投影显示所有内容的计算机屏幕。但也许也有这样的选择,即在投影仪上精确地绘制和投影图像,仅使用计算机作为计算机器。如果我能做
我将Processing(processing.org)用于需要人脸跟踪的项目。现在的问题是由于for循环,程序将耗尽内存。我想停止循环或至少解决内存不足的问题。这是代码。 import hyperm
我有下面的代码: // Image Processing.cpp : Defines the entry point for the console application. // //Save
我正在为某些项目使用opencv。并有应解决的任务。 任务很简单。我有一张主图片,并且有一个模板,而不是将主图片与模板进行比较。我使用matchTemplate()函数。我只是好奇一下。 在文档中,我
我正在尝试使用以下命令创建级联分类器: haartraining -data haarcascade -vec samples.vec -bg negatives.dat -nstages 20 -n
我试图使用OpenCV检测黑色图像中一组形状的颜色,为此我使用了Canny检测。但是,颜色输出总是返回为黑色。 std::vector > Asteroids::DetectPoints(const
我正在尝试使用OpenCv 2.4.5从边缘查找渐变方向,但是我在使用cvSobel()时遇到问题,以下是错误消息和我的代码。我在某处读到它可能是由于浮点(??)之间的转换,但我不知道如何解决它。有帮
我正在尝试构建循环关闭算法,但是在开始开发之前,我想测试哪种功能描述符在真实数据集上效果更好。 我有两个在两个方向拍摄的走廊图像,一个进入房间,另一个离开同一个房间。因此它们代表相同的场景,但具有2个
有没有一种方法可以比较直方图,但例如要排除白色,因此白色不会影响比较。 最佳答案 白色像素有 饱和度 , S = 0 .因此,在创建直方图时很容易从计数中删除白色像素。请执行下列操作: 从 BGR 转
就像本主题的标题一样,如何在OpenCV中确定图像的特定像素(灰度或彩色)是否饱和(例如,亮度过高)? 先感谢您。 最佳答案 根据定义,饱和像素是指与强度(即灰度值或颜色分量之一)等于255相关联的像
我是OpenCV的新用户,正在从事大学项目。程序会获取输入图像,对其进行综合模糊处理,然后对其进行模糊处理。当对合成模糊图像进行反卷积时,会生成边界伪像,因为...好吧,到目前为止,我还没有实现边界条
我想知道OpenCV是haar特征还是lbp是在多尺度搜索过程中缩放图像还是像论文中提到的那样缩放特征本身? 编辑:事实证明,检测器可以缩放图像,而不是功能。有人知道为什么吗?通过缩放功能可以更快。
我在openCv中使用SVM.train命令(已定义了适当的参数)。接下来,我要使用我的算法进行分类,而不是使用svm.predict。 可能吗?我可以访问训练时生成的支持 vector 吗?如果是这
我是一名优秀的程序员,十分优秀!