以上就是给各位分享Python中的OpenCVPCA计算,其中也会对calchistopencvpython进行解释,同时本文还将给你拓展c–使用python中的OpencvCuda函数、opencv
以上就是给各位分享Python中的OpenCV PCA计算,其中也会对calchist opencv python进行解释,同时本文还将给你拓展c – 使用python中的Opencv Cuda函数、opencv python中的椭圆检测、OpenCV Python中的渐变蒙版混合、OPENCV PYTHON中的透视变换等相关知识,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!
本文目录一览:- Python中的OpenCV PCA计算(calchist opencv python)
- c – 使用python中的Opencv Cuda函数
- opencv python中的椭圆检测
- OpenCV Python中的渐变蒙版混合
- OPENCV PYTHON中的透视变换
Python中的OpenCV PCA计算(calchist opencv python)
我正在通过OpenCV(在Python中)加载一组尺寸为128x128的测试图像,将它们整形为矢量(1、128x128),然后将它们全部放在一起形成矩阵以计算PCA。我正在使用新的cv2库…
编码:
import osimport cv2 as cvimport numpy as npmatrix_test = Nonefor image in os.listdir(''path_to_dir''): imgraw = cv.imread(os.path.join(''path_to_dir'', image), 0) imgvector = imgraw.reshape(128*128) try: matrix_test = np.vstack((matrix_test, imgvector)) except: matrix_test = imgvector# PCAmean, eigenvectors = cv.PCACompute(matrix_test, np.mean(matrix_test, axis=0))
而且它在PCA部件上始终失败(我测试了图像加载,并且所有结果矩阵都是应该的)……我得到的错误是:
在第22行的文件“ main.py”中
平均值,特征向量= cv.PCACompute(matrix_test,np.mean(matri_test,axis = 0))
cv2.error:/path/to/OpenCV-2.3.1/modules/core/src/matmul.cpp:2781:错误:(-215)_mean.size()==函数operator()中的mean_sz
答案1
小编典典我认为问题在于
np.mean(matrix_test, axis=0)
它的大小是(128x128),而不是(1,128x128)。因此下面的代码应该工作
mean, eigenvectors = cv.PCACompute(matrix_test, np.mean(matrix_test, axis=0).reshape(1,-1))
c – 使用python中的Opencv Cuda函数
我现在非常需要的两个函数是cuda :: warpPerspective和cv :: cuda :: DescriptorMatcher :: knnmatch().
我试图按照@ostrumvulpes在Accessing OpenCV CUDA Functions from Python (No PyCUDA)中提出的建议来实现warpPerspective并且它工作正常.现在我被困在DescriptorMatcher :: knnmatch()中.更确切地说,我需要使用蛮力描述符匹配器knnmatch函数(CUDA).我在网上搜索了用C编写的例子,这样我就可以初步了解如何通过cython将其转换为使其工作.
我发现的大多数例子如下:
Ptr<cuda::DescriptorMatcher> matcher = cuda::DescriptorMatcher::createBFMatcher(); vector< vector< DMatch> > matches; matcher->knnMatch(descriptors_object_Gpu,descriptors_scene_Gpu,matches,2);
为了实现这三行,我首先在.pxd文件中添加了我认为必要的内容.我的pxd文件如下所示:
GpuWrapper.pxd
from libcpp cimport bool from cpython.ref cimport PyObject from libcpp.vector cimport vector # References PyObject to OpenCV object conversion code borrowed from OpenCV's own conversion file,cv2.cpp cdef extern from 'pyopencv_converter.cpp': #mrc689 April 20,2017 void import_array() cdef PyObject* pyopencv_from(const Mat& m) cdef bool pyopencv_to(PyObject* o,Mat& m) cdef extern from 'opencv2/imgproc.hpp' namespace 'cv': cdef enum InterpolationFlags: INTER_NEAREST = 0 cdef enum ColorConversionCodes: COLOR_BGR2GRAY cdef extern from 'opencv2/core/core.hpp': cdef int CV_8UC1 cdef int CV_32FC1 cdef extern from 'opencv2/core/core.hpp' namespace 'cv': cdef cppclass Size_[T]: Size_() except + Size_(T width,T height) except + T width T height ctypedef Size_[int] Size2i ctypedef Size2i Size cdef cppclass Scalar[T]: Scalar() except + Scalar(T v0) except + cdef extern from 'opencv2/core/core.hpp' namespace 'cv': cdef cppclass Mat: Mat() except + void create(int,int,int) except + void* data int rows int cols #added to test the Algorithm class inside core.hpp on May5th 12.52 AM. cdef cppclass Algorithm: Algorithm() except + cdef extern from 'opencv2/core/base.hpp' namespace 'cv': cdef enum normTypes: norM_INF= 1,norM_L1= 2,norM_L2= 4,norM_HAMMING= 6,norM_HAMMING2= 7,cdef extern from 'opencv2/core/cuda.hpp' namespace 'cv::cuda': cdef cppclass GpuMat: GpuMat() except + void upload(Mat arr) except + void download(Mat dst) const cdef cppclass Stream: Stream() except + cdef extern from 'opencv2/core/types.hpp' namespace 'cv': cdef cppclass DMatch: Dmatch() except + float distance int imgIdx int queryIdx int trainIdx cdef extern from 'opencv2/core/cvstd.hpp' namespace 'cv': cdef cppclass Ptr[T]: T element_type Ptr() except + cdef extern from 'opencv2/cudafeatures2d.hpp' namespace 'cv::cuda': cdef cppclass DescriptorMatcher: @staticmethod Ptr[DescriptorMatcher] createBFMatcher(int normType) except+ #Expected to see error here void knnMatch(GpuMat queryDescriptors,GpuMat trainDescriptors,vector[vector[DMatch]] &matches,int k) cdef extern from 'opencv2/cudawarping.hpp' namespace 'cv::cuda': cdef void warpPerspective(GpuMat src,GpuMat dst,Mat M,Size dsize,int flags,int borderMode,Scalar borderValue,Stream& stream) # Function using default values cdef void warpPerspective(GpuMat src,int flags)
我的pyx看起来像这样:
GpuWrapper.pyx
import numpy as np # Import Python functions,attributes,submodules of numpy cimport numpy as np # Import numpy C/C++ API def match_feature(np.ndarray[np.float32_t,ndim=3] _src,np.ndarray[np.float32_t,ndim=2] _M): np.import_array() # Create GPU/device InputArray for src cdef Mat src_mat cdef GpuMat src_gpu pyopencv_to(<PyObject*> _src,src_mat) src_gpu.upload(src_mat) cdef Mat src_mat_2 cdef GpuMat src_gpu_2 pyopencv_to(<PyObject*> _M,src_mat_2) src_gpu_2.upload(src_mat_2) cdef Ptr[DescriptorMatcher] matcher= Ptr() matcher = DescriptorMatcher.createBFMatcher(4) cdef vector[vector[DMatch]] matches matcher.knnMatch(src_gpu,src_gpu_2,2) print("no problem so far")
当我试图编译它时,我得到一个错误,说’Ptr [DescriptorMatcher]’没有属性’knnMatch’.
现在据我所知,Ptr是DescriptorMatcher类型的共享指针,所以我从.pxd文件定义Ptr的方式肯定有问题.
我只是不知道如何解决它.如果有人能帮我解决,我将非常感激.
解决方法
查看如何制作Ptr的好地方是Cython which wrap the similar classes std::shared_ptr
and std::unique_ptr
内置的C标准库包装器.
您不希望执行T element_type行,因为它不会被解释为typedef(就像在OpenCV标头中一样) – 它被解释为具有类型为T的element_type的成员(它不存在).
您可能想为Ptr设置一些其他构造函数.就目前而言,你只包装了默认的空单. (对于您的代码,它看起来并不重要,因为您从工厂函数中获取它).
最重要的是,您还需要设置解除引用运算符(运算符*).这可能只是你需要实现它才能工作:
cdef cppclass Ptr[T]: Ptr() except + Ptr(Ptr*) except + T& operator* () # probably no exceptions
要使用它use the cython.operator.dereference
:
# at the top from cython.operator cimport dereference # later dereference(matcher).knnMatch(src_gpu,2)
(我没有详细查看其余的代码,所以我没有评论它是否正确)
opencv python中的椭圆检测
我的图片在这里:
我正在寻找更好的解决方案或算法来检测这张照片中的椭圆部分(盘),并在Opencv中的另一张照片中对其进行遮罩。你能给我一些建议或解决方案吗?我的代码是:
circles = cv2.HoughCircles(img,cv2.HOUGH_GRADIENT,1.2,1,param1=128,minRadius=200,maxRadius=600)
# draw detected circles on image
circles = circles.tolist()
for cir in circles:
for x,y,r in cir:
x,r = int(x),int(y),int(r)
cv2.circle(img,(x,y),r,(0,255,0),4)
# show the output image
cv2.imshow("output",cv2.resize(img,(500,500)))
OpenCV Python中的渐变蒙版混合
我有一个图像和圆圈区域。除了圆圈区域,我需要模糊所有内容。我还需要使圆的边界平滑。
现在我在python中有代码,这不会模糊圆的边界。
def blur_image(cv_image,radius,center,gaussian_core,sigma_x):
blurred = cv.GaussianBlur(cv_image,sigma_x)
h,w,d = cv_image.shape
# masks
circle_mask = np.ones((h,w),cv_image.dtype)
cv.circle(circle_mask,(0,0),-1)
circle_not_mask = np.zeros((h,cv_image.dtype)
cv.circle(circle_not_mask,(2,2,2),-1)
# Computing
blur_around = cv.bitwise_and(blurred,blurred,mask=circle_mask)
image_in_circle = cv.bitwise_and(cv_image,cv_image,mask=circle_not_mask)
res = cv.bitwise_or(blur_around,image_in_circle)
return res
当前版本:
如何模糊圆的边界?在输出示例中,我在程序中使用了渐变蒙版。在opencv中有类似的东西吗?
更新04.03
所以,我已经从这个回答的主题以及我所拥有的内容中尝试了公式: 代码:
def blend_with_mask_matrix(src1,src2,mask):
res = src2 * (1 - cv.divide(mask,255.0)) + src1 * cv.divide(mask,255.0)
return res
此代码应与最近的代码相似,但事实并非如此。圆圈中的图像略有不同。颜色有问题。 问题仍然悬而未决。
OPENCV PYTHON中的透视变换
您将X,Y坐标颠倒了。 Python / OpenCV要求它们以X,Y列出(即使您将它们定义为numpy值)。您必须为getPerspectiveTransform指定的数组必须将它们列出为X,Y。
输入:
import numpy as np
import cv2
# read input
img = cv2.imread("sudoku.jpg")
# specify desired output size
width = 350
height = 350
# specify conjugate x,y coordinates (not y,x)
input = np.float32([[62,71],[418,59],[442,443],[29,438]])
output = np.float32([[0,0],[width-1,height-1],[0,height-1]])
# compute perspective matrix
matrix = cv2.getPerspectiveTransform(input,output)
print(matrix.shape)
print(matrix)
# do perspective transformation setting area outside input to black
imgOutput = cv2.warpPerspective(img,matrix,(width,height),cv2.INTER_LINEAR,borderMode=cv2.BORDER_CONSTANT,borderValue=(0,0))
print(imgOutput.shape)
# save the warped output
cv2.imwrite("sudoku_warped.jpg",imgOutput)
# show the result
cv2.imshow("result",imgOutput)
cv2.waitKey(0)
cv2.destroyAllWindows()
结果:
您应该注意:
- 坐标颠倒:宽度、高度
- 目的地按比例缩放: 第一名比例:宽/高 第二名比例:高/宽
- 点坐标的顺序无关紧要,但源点和目标点应相互对应。
我们今天的关于Python中的OpenCV PCA计算和calchist opencv python的分享已经告一段落,感谢您的关注,如果您想了解更多关于c – 使用python中的Opencv Cuda函数、opencv python中的椭圆检测、OpenCV Python中的渐变蒙版混合、OPENCV PYTHON中的透视变换的相关信息,请在本站查询。
本文标签: