关于图像处理,我有两个问题。我想将两个图像相乘以仅获得前景图像。
第一个问题是,当ı运行所属代码但结果不佳时(图像链接为https://drive.google.com/file/d/0B5b8Wm-4Dlb6dkljSlowV3k3TE0/view?usp=sharing)。如果我写i,则不会扫描所有图片像素。如果ıwrtiei
另一个问题是,当此函数循环运行时(循环是每秒运行10次的ROS循环),程序将终止。我不明白为什么?

Mat depthSubtraction()
{
typedef ushort imgType;
    Mat sub=imread("/home/aylin/Desktop/sub.png");
    Mat dep=imread("/home/aylin/Desktop/depth.png");
    Mat a,b;
    imgType* m_a = NULL;
    imgType* m_b = NULL;
    imgType* m_c = NULL;

    int picWidth = dep.cols; //picture width
    int picHeight = dep.rows; //picture height

    Mat outputImg(picHeight,picWidth, dep.type()); //initialize the output image
    //memset(outputImg.data, 0, picWidth * picHeight*sizeof(imgType));//set the output image to zeros
    //outputImg=zeros(picHeight, picWidth, dep.type());


    m_a=(imgType*)sub.data;
    m_b=(imgType*)dep.data;
    m_c=(imgType*)outputImg.data;




    for(int i=0;i<picWidth*picHeight ;i++,m_a++,m_b++,m_c++)
    {
        if(*m_a<2)
        {
            *m_a=0;
            *m_c = (*m_a)*(*m_b);
            *m_b=0;

        }
        else
        {
            *m_a=1;
            *m_c = (*m_a)*(*m_b);
            *m_b=0;

        }
        cout<<*m_c<<" "<<*m_a<<endl;
    }

    cvtColor(outputImg, b, CV_BGR2GRAY);
    imshow("aaaa",b);
    imwrite("/home/aylin/Desktop/newww.png",b);
    waitKey();



   }


   int main(int argc, char **argv)
   {

/*
  init(argc, argv, "Aylin_node");

   Subscribe_Depth sd;

   Rate spin_rate(10);

   while( ok() ) {
    spinOnce();

    spin_rate.sleep();
    }

     */

depthSubtraction();



return 0;
   }

最佳答案

您的imgType应该是uchar而不是ushort。

另外,由于默认情况下imread读取彩色图像,因此for循环应运行picWidth * picHeight * 3次。

除此之外,我看不到代码有任何问题,但是,如果我尝试实现相同的功能,则可以这样编写:

Mat src = imead("image.png", CV_LOAD_IMAGE_GRAYSCALE);
Mat mask = imread("mask.png", CV_LOAD_IMAGE_GRAYSCALE);

Mat dst = Mat::zeros(src.rows, src.cols, CV_8UC1);
src.copyTo(dst, mask);

关于opencv - 不扫描像素(c++和opencv),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/27661112/

10-15 06:38