Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/130.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ OpenCV速度问题_C++_Performance_Opencv_Computer Vision_Projective Geometry - Fatal编程技术网

C++ OpenCV速度问题

C++ OpenCV速度问题,c++,performance,opencv,computer-vision,projective-geometry,C++,Performance,Opencv,Computer Vision,Projective Geometry,我想转换许多点(整个720p图像将是最好的)与约30fps。 现在我只是在一个遮罩中循环,寻找标记的像素。然后,我将每个标记的像素转换为一个新帧。有没有办法加快速度? 代码在windows平板电脑上运行,所以我不知道CUDA是否能帮上忙 //Look for white pixels in mask image and transform them to new frame orientation for (int row = 0; row < mask.rows; row++){

我想转换许多点(整个720p图像将是最好的)与约30fps。 现在我只是在一个遮罩中循环,寻找标记的像素。然后,我将每个标记的像素转换为一个新帧。有没有办法加快速度? 代码在windows平板电脑上运行,所以我不知道CUDA是否能帮上忙

//Look for white pixels in mask image and transform them to new frame orientation
for (int row = 0; row < mask.rows; row++){
    for (int col = 0; col < mask.cols; col++){

        if (mask.at<uchar>(row, col) == 255){

            //Point in 2D hom
            p = (Mat_<double>(3, 1) << col, row, 1);
            p11 = CameraMatrix480.inv()*p;  //Pixel-->Camera


            //Project 2D Points to table
            double d = abs((p11 - midCam).dot(table_normal_cam)); //intersection of point with table surface is z value
            ps = p11 - d*table_normal_cam;
            p11 *= -Mat(p11 - ps).at<double>(2);

            //Get point in new frame in hom camera coordinates
            p11.copyTo(p_hom1(Range(0, 3), Range(0, 1)));
            p_hom2 = M * p_hom1; //p_hom in frame2

            //Point in frame2 in pixel coordinates
            p12 = (1 / p_hom2.at<double>(2))*(CameraMatrix480*p_hom2(Range(0, 3), Range(0, 1))); //Camera-->Pixel
            pixel = Point(p12.at<double>(0), p12.at<double>(1));

            //Check if new location is in the frame
            if (rect.contains(pixel)){
                RGB& rgb = output.ptr<RGB>(pixel.y)[pixel.x];
                rgb = white;
            }

        }
    }
//在蒙版图像中查找白色像素并将其转换为新的帧方向
对于(int row=0;row像素
像素=点(p12.at(0),p12.at(1));
//检查新位置是否在框架中
if(矩形包含(像素)){
RGB&RGB=output.ptr(pixel.y)[pixel.x];
rgb=白色;
}
}
}

在不进行测试的情况下,我认为逆相机矩阵的计算是代码中最昂贵的操作。假设相机矩阵为常数,可以预先计算逆相机矩阵

Mat invCameraMatrix(CameraMatrix480.inv());
...
p11=invCameraMatrix*p;//像素-->相机
...

此外,您可以使用
OpenMP
轻松地将
for
循环并行化,并检查其是否获得任何性能。要使用
CUDA
,您将需要一个Nvidia图形卡,这可能在您的windows平板电脑设备中不可用。

如果不进行测试,我认为逆相机矩阵的计算是最重要的这是代码中最昂贵的操作。假设摄影机矩阵是常数,可以预先计算逆矩阵

Mat invCameraMatrix(CameraMatrix480.inv());
...
p11=invCameraMatrix*p;//像素-->相机
...

此外,您可以使用
OpenMP
轻松地并行
for
循环,并检查其是否获得任何性能。要使用
CUDA
,您将需要一个Nvidia图形卡,这可能在您的windows平板电脑设备中不可用。

您可以尝试使用
cv::UMat
进行性能测试吗


我使用
OpenMP
进行像素级的快速图像操作。

您可以尝试使用
cv::UMat
进行性能测试吗


我使用
OpenMP
进行像素级的快速图像操作。

您是否考虑过将操作更改为
float
而不是
double
?因为您在移动设备上,这可能有助于加快操作速度


另外,上一个
if
条件中的
rect
是什么?

您是否考虑过将操作更改为
float
而不是
double
?因为您在移动设备上,这可能有助于加快操作速度


另外,在上一个
if
条件中,什么是
rect

我设法在~40ms内为720p图像运行变换,只需使用Matx而不是Mat。图像存储在UMat中,这可能也有帮助。

我设法在~40ms内为720p图像运行变换,只需使用Matx而不是Mat图像存储在UMat中,这可能也有帮助。

你能写下你在用数学公式做什么吗?在线性代数中,可能有一些步骤你可以重新排序以预计算。基本上我有一个测试设置,在房间里有一张桌子。现在我抓取桌子的视频帧并在这张图片中绘制。然后我将图片映射到桌子表面e(因此我得到了具有深度的3D摄像机坐标)并将绘图转换为下一帧的方向。这允许我在一个抓取的帧中绘制一些东西,每一帧都保持在相同的位置。这无助于优化…我指的是数学公式…但只是出于好奇:你是否在发布模式下使用发布库编译?你能写出你想要的吗“你在做数学公式吗?在线性代数中,可能有一些步骤可以重新排序以预计算。基本上,我在房间里有一个带有桌子的测试设置。现在,我抓取桌子的视频帧并在这张图片中绘制。然后我在桌子表面绘制图形(因此我可以获得具有深度的3D相机坐标)并将绘图转换为下一帧的方向。这允许我在一个抓取的帧中绘制一些东西,每一帧都保持在相同的位置。这无助于优化…我指的是数学公式…但只是出于好奇:您是否使用发布库在发布模式下编译?inv()只需要总计算量的3%,但我仍然会预计算。最昂贵的部分是16%的点积。我不认为函数太慢,我只是经常调用它们(每帧最多10万次迭代)你确定吗?我刚刚在我的机器上测试过。反转一个
3x4
矩阵比两个
3x1
向量的点积慢大约3倍(反转大约需要0.3毫秒,点积大约需要9.9e-5毫秒)。inv()只需要总计算量的3%,但我仍然会预计算。最昂贵的部分是16%的点积。我不认为函数太慢,我只是经常调用它们(每帧最多10万次迭代)你确定吗?我刚刚在我的机器上测试过。反转一个
3x4
矩阵比两个
3x1
向量的点积慢大约3倍(反转大约需要0.3毫秒,点积大约需要9.9e-5毫秒)