Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.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++_Opencv_Matrix - Fatal编程技术网

C++ 在OpenCV的两个矩阵中保留具有最小绝对值的有符号值

C++ 在OpenCV的两个矩阵中保留具有最小绝对值的有符号值,c++,opencv,matrix,C++,Opencv,Matrix,在OpenCV中,我有两个大小相同的矩阵1和矩阵2。我想找到在两个矩阵中具有最小绝对值的有符号值,并将其保留在矩阵1中。为此,我使用以下代码: for (int i = 0; i < One.rows; ++i) { p=One.ptr<float>(i); p_two = Two.ptr<float>(i); for (int j = 0; j < One.cols; ++j) { if(fabsf(p_two

在OpenCV中,我有两个大小相同的矩阵1和矩阵2。我想找到在两个矩阵中具有最小绝对值的有符号值,并将其保留在矩阵1中。为此,我使用以下代码:

for (int i = 0; i < One.rows; ++i)
{
    p=One.ptr<float>(i);
    p_two = Two.ptr<float>(i);
    for (int j = 0; j < One.cols; ++j)
    {
        if(fabsf(p_two[j])<fabsf(p[j])) 
             p[j] = p_two[j];
    }
}
for(int i=0;i<1.rows;++i)
{
p=1.ptr(i);
p_two=2.ptr(i);
对于(int j=0;j<1.cols;++j)
{

如果(fabsf(p_two[j])你的代码不是你程序的瓶颈。它确实非常快。你需要分析你的代码,看看实际的瓶颈在哪里


如果矩阵是连续的(这在实践中非常常见),您可以对其进行一些优化,例如:

您可以看到您的方法非常快。我的方法快了一点。@s1h速度较慢,但更简洁易读

代码 您可以使用以下方法在电脑上评估结果:

#include <opencv2/opencv.hpp>
#include <iostream>
using namespace std;
using namespace cv;

int main()
{
    vector<Size> sizes{ Size(3, 3), Size(10, 10), Size(100, 100), Size(1280, 720), Size(1000, 1000), Size(1920, 1080), Size(4096, 3112), Size(5000, 5000) };

    cout << "Size: \t\tYuanhao \ts1h \t\tMiki" << endl;

    for (int is = 0; is < sizes.size(); ++is)
    {
        Size sz = sizes[is];

        cout << sz << "\t";

        Mat1f img1(sz);
        randu(img1, Scalar(-100), Scalar(100));

        Mat1f img2(sz);
        randu(img2, Scalar(-100), Scalar(100));

        {
            Mat1f one = img1.clone();
            Mat1f two = img2.clone();

            double tic = double(getTickCount());

            for (int r = 0; r < one.rows; ++r)
            {
                float* pone = one.ptr<float>(r);
                float* ptwo = two.ptr<float>(r);
                for (int c = 0; c < one.cols; ++c)
                {
                    if (fabs(ptwo[c]) < fabs(pone[c]))
                    {
                        pone[c] = ptwo[c];
                    }
                }
            }

            double toc = (double(getTickCount()) - tic) * 1000. / getTickFrequency();
            cout << toc << " \t";
        }


        {
            Mat1f one = img1.clone();
            Mat1f two = img2.clone();

            double tic = double(getTickCount());

            two.copyTo(one, abs(two) < abs(one));

            double toc = (double(getTickCount()) - tic) * 1000. / getTickFrequency();
            cout << toc << " \t";
        }


        {
            Mat1f one = img1.clone();
            Mat1f two = img2.clone();

            double tic = double(getTickCount());

            int rows = one.rows;
            int cols = one.cols;
            if (one.isContinuous() && two.isContinuous())
            {
                cols = rows * cols;
                rows = 1;
            }

            for (int r = 0; r < rows; ++r)
            {
                float* pone = one.ptr<float>(r);
                float* ptwo = two.ptr<float>(r);
                for (int c = 0; c < cols; ++c)
                {
                    if (fabs(ptwo[c]) < fabs(pone[c]))
                    {
                        pone[c] = ptwo[c];
                    }
                }
            }

            double toc = (double(getTickCount()) - tic) * 1000. / getTickFrequency();
            cout << toc << " \t";
        }

        cout << endl;
    }

    getchar();
    return 0;
}
#包括
#包括
使用名称空间std;
使用名称空间cv;
int main()
{
向量大小{Size(3,3)、Size(10,10)、Size(100100)、Size(1280720)、Size(10001000)、Size(19201080)、Size(40963112)、Size(50005000)};

就速度而言,我还没有测试过这一点,但一般来说,您可以用以下行替换您的循环:Two.copyTo(one,cv::abs(Two)ParallelLoopBody
)(或)使用SSE指令的单矩阵运算,使用SSE加速循环。非常感谢!B)是一个很好的选择。我也考虑保存绝对值,只是做比较。其他选项是合理的,但目前我不能完成它。BTW,我正在尝试优化代码,也许你可以给我一些想法来改进它。表演?提前谢谢!
two.copyTo(one, abs(two) < abs(one));
Size:           Yuanhao         s1h             Miki
[3 x 3]         0.000366543     0.117294        0.000366543
[10 x 10]       0.00109963      0.0157614       0.00109963
[100 x 100]     0.0964009       0.139653        0.112529
[1280 x 720]    8.70577         11.0267         8.65372
[1000 x 1000]   9.66538         13.5068         9.02026
[1920 x 1080]   16.5681         26.9706         15.7412
[4096 x 3112]   104.423         135.629         102.595
[5000 x 5000]   196.124         277.457         187.203
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace std;
using namespace cv;

int main()
{
    vector<Size> sizes{ Size(3, 3), Size(10, 10), Size(100, 100), Size(1280, 720), Size(1000, 1000), Size(1920, 1080), Size(4096, 3112), Size(5000, 5000) };

    cout << "Size: \t\tYuanhao \ts1h \t\tMiki" << endl;

    for (int is = 0; is < sizes.size(); ++is)
    {
        Size sz = sizes[is];

        cout << sz << "\t";

        Mat1f img1(sz);
        randu(img1, Scalar(-100), Scalar(100));

        Mat1f img2(sz);
        randu(img2, Scalar(-100), Scalar(100));

        {
            Mat1f one = img1.clone();
            Mat1f two = img2.clone();

            double tic = double(getTickCount());

            for (int r = 0; r < one.rows; ++r)
            {
                float* pone = one.ptr<float>(r);
                float* ptwo = two.ptr<float>(r);
                for (int c = 0; c < one.cols; ++c)
                {
                    if (fabs(ptwo[c]) < fabs(pone[c]))
                    {
                        pone[c] = ptwo[c];
                    }
                }
            }

            double toc = (double(getTickCount()) - tic) * 1000. / getTickFrequency();
            cout << toc << " \t";
        }


        {
            Mat1f one = img1.clone();
            Mat1f two = img2.clone();

            double tic = double(getTickCount());

            two.copyTo(one, abs(two) < abs(one));

            double toc = (double(getTickCount()) - tic) * 1000. / getTickFrequency();
            cout << toc << " \t";
        }


        {
            Mat1f one = img1.clone();
            Mat1f two = img2.clone();

            double tic = double(getTickCount());

            int rows = one.rows;
            int cols = one.cols;
            if (one.isContinuous() && two.isContinuous())
            {
                cols = rows * cols;
                rows = 1;
            }

            for (int r = 0; r < rows; ++r)
            {
                float* pone = one.ptr<float>(r);
                float* ptwo = two.ptr<float>(r);
                for (int c = 0; c < cols; ++c)
                {
                    if (fabs(ptwo[c]) < fabs(pone[c]))
                    {
                        pone[c] = ptwo[c];
                    }
                }
            }

            double toc = (double(getTickCount()) - tic) * 1000. / getTickFrequency();
            cout << toc << " \t";
        }

        cout << endl;
    }

    getchar();
    return 0;
}