小编Ban*_*ana的帖子

从图像点计算x,y坐标(3D)

我有一个任务是在3D坐标系中定位一个对象.由于我必须得到几乎精确的X和Y坐标,我决定使用已知的Z坐标跟踪一个颜色标记,该坐标将放置在移动对象的顶部,如此图片中的橙色球: undistored

首先,我已完成相机校准以获取内部参数,之后我使用cv :: solvePnP获取旋转和平移向量,如下面的代码所示:

std::vector<cv::Point2f> imagePoints;
std::vector<cv::Point3f> objectPoints;
//img points are green dots in the picture
imagePoints.push_back(cv::Point2f(271.,109.));
imagePoints.push_back(cv::Point2f(65.,208.));
imagePoints.push_back(cv::Point2f(334.,459.));
imagePoints.push_back(cv::Point2f(600.,225.));

//object points are measured in millimeters because calibration is done in mm also
objectPoints.push_back(cv::Point3f(0., 0., 0.));
objectPoints.push_back(cv::Point3f(-511.,2181.,0.));
objectPoints.push_back(cv::Point3f(-3574.,2354.,0.));
objectPoints.push_back(cv::Point3f(-3400.,0.,0.));

cv::Mat rvec(1,3,cv::DataType<double>::type);
cv::Mat tvec(1,3,cv::DataType<double>::type);
cv::Mat rotationMatrix(3,3,cv::DataType<double>::type);

cv::solvePnP(objectPoints, imagePoints, cameraMatrix, distCoeffs, rvec, tvec);
cv::Rodrigues(rvec,rotationMatrix);
Run Code Online (Sandbox Code Playgroud)

拥有所有矩阵之后,这个可以帮助我转换图像的方程指向wolrd坐标:

transform_equation

其中M是cameraMatrix,R - rotationMatrix,t - tvec和s是未知的.Zconst表示橙色球的高度,在本例中为285毫米.所以,首先我需要解决前面的方程,得到"s",然后通过选择图像点找出X和Y坐标: 方程2

解决这个问题我可以找到变量"s",使用矩阵的最后一行,因为Zconst是已知的,所以这里有以下代码:

cv::Mat uvPoint = (cv::Mat_<double>(3,1) << 363, 222, 1); // u = 363, v = 222, got this point using mouse callback …
Run Code Online (Sandbox Code Playgroud)

opencv camera-calibration pose-estimation

54
推荐指数
2
解决办法
2万
查看次数

将C++/CUDA类传递给PyCUDA的SourceModule

我有一个用C++编写的类,它也使用了cuda_runtime.h中的一些定义,这是一个名为ADOL-C的开源项目的一部分,你可以看看这里!

这在我使用CUDA-C时有效,但我想以某种方式在PyCUDA中导入这个类,如果有可能的话.因此,我将在内核(而不是'main')中使用此类来定义用于计算函数派生的特定变量.有没有办法将这个类传递给PyCUDA的SourceModule?

我问了一个类似的问题,但在这里我想再解释一下.所以,有一个解决方案使用nvcc -cubin编译我的C代码(感谢talonmies)然后用driver.module_from_file()导入它,但是,我想使用SourceModule并在.py文件中写入这些内核,所以它可能更加用户友好.我的例子看起来像这样:

from pycuda import driver, gpuarray
from pycuda.compiler import SourceModule
import pycuda.autoinit
kernel_code_template="""
__global__ void myfunction(float* inx, float* outy, float* outderiv)
{
    //defining thread index
    ...
    //declare dependent and independet variables as adoubles
    //this is a part of my question
    adtl::adouble y[3];
    adtl::adouble x[3];
    // ... 
}
"""
Run Code Online (Sandbox Code Playgroud)

......这只是一个想法,但是SourceModule不知道什么是"adouble",因为它们是在类定义adoublecuda.h中定义的,所以我希望你现在更好地理解我的问题.有谁知道我应该从哪里开始?如果没有,我将在CUDA-C中编写这个内核,并使用nvcc -cubin选项.

感谢帮助!

python cuda boost-python pycuda

7
推荐指数
1
解决办法
3293
查看次数

cv :: findContours正在修改源图像OpenCV 2.3

从OpenCV文档中,cv :: findContours中的源图像被获取为const,但我的应用程序正在发生一些奇怪的事情.我正在使用cv :: inRange函数来获取特定颜色的阈值图像,然后,使用cv :: moments,我可以在阈值图像中获得白色像素的中心,这是正常的.

另外,我想实现用于寻找最大轮廓和在该轮廓中定位中心力矩的代码.在代码中添加了cv :: findContours之后,我在输出中发现了奇怪的行为,之后我想使用以下代码检查源图像的内容:

cv::Mat contourImage;
threshedImage.copyTo(contourImage); // threshedImage is the output from inRange
cv::findContours(threshedImage, contours, CV_RETR_LIST, CV_CHAIN_APPROX_NONE, cv::Point(0,0));
cv::Mat temp;
cv::absdiff(threshedImage,contourOutput, temp);
cv::namedWindow("absdiff");
cv::imshow("absdiff",temp);
Run Code Online (Sandbox Code Playgroud)

在此之后,输出显示threshedImage和contourImage之间存在差异.这怎么可能?有没有人与cv :: findContours有类似的结果?

c++ opencv image-processing

7
推荐指数
1
解决办法
2346
查看次数

使用cv :: Mat :: at运算符访问像素值

我正在使用OpenCV 2.3.1(c ++ api),当我尝试获取彩色图像的像素值时,我得到了非常奇怪的结果,而不是值数字,输出是这样的:?,*,| 等.例如,代码如下:

cv::Mat inputImage = cv::imread("Picture1.jpg");
std::cout << inputImage.at<cv::Vec3b>(x,y)[0] << std::endl; //print B component
Run Code Online (Sandbox Code Playgroud)

其中x和y是鼠标回调函数的坐标.我认为这种类型是错误的,你知道我还能用什么来代替Vec3b吗?

c++ opencv

1
推荐指数
1
解决办法
5849
查看次数

Apache CMIS:分页查询结果

最近我开始使用Apache CMIS并阅读官方文档和示例.我没有注意到有关分页查询结果的任何信息.

有一个示例显示如何列出文件夹项,使用operationContext设置maxItemsPerPage,但似乎可以在getChilder方法中使用operationContext:

int maxItemsPerPage = 5;
int skipCount = 10;
CmisObject object = session.getObject(session.createObjectId(folderId));
Folder folder = (Folder) object;
OperationContext operationContext = session.createOperationContext();
operationContext.setMaxItemsPerPage(maxItemsPerPage);
ItemIterable<CmisObject> children = folder.getChildren(operationContext);
ItemIterable<CmisObject> page = children.skipTo(skipCount).getPage();
Run Code Online (Sandbox Code Playgroud)

在列出u文件夹时这是可以的.但我的情况是从自定义搜索查询中获取结果.基本方法是:

String myType = "my:documentType";
ObjectType type = session.getTypeDefinition(myType);
PropertyDefinition<?> objectIdPropDef = type.getPropertyDefinitions().get(PropertyIds.OBJECT_ID);
String objectIdQueryName = objectIdPropDef.getQueryName();
String queryString = "SELECT " + objectIdQueryName + " FROM " + type.getQueryName();
ItemIterable<QueryResult> results = session.query(queryString, false);
for (QueryResult qResult : results) {
    String objectId = qResult.getPropertyValueByQueryName(objectIdQueryName);
    Document doc …
Run Code Online (Sandbox Code Playgroud)

cmis apache-chemistry opencmis cmis-workbench

1
推荐指数
1
解决办法
4417
查看次数