opencv分割返回黑色图像

opencv segmentation returning a black image

我目前正在为 class 进行分割项目,需要使用任何 opencv 函数创建我自己的分割。我最初的想法是在过滤后使用具有 5x5 内核的形态学梯度(因为我之前的测试表明梯度提供更好的边缘,这正是我想要做的)。这产生了黑色图像(如果一张照片没有结果)。代码编译后决定使用 Canny Edge 检测进行测试。这也会产生相同的黑色图像结果,而不是边缘检测。所以现在我想知道我使用的代码是否存在愚蠢的错误。

此处代码(c++ 在 OS X 10.10.2 上使用 Xcode)

   //
            //  myseg.cpp
  //  
  //
   //  Created by Mobin Anandwala on 3/16/2015 updated on 3/17/2015.
  //
  //



    #include "opencv2/core/core.hpp"
    #include "opencv2/highgui/highgui.hpp"
    #include "opencv2/imgproc/imgproc.hpp"
    #include <stdlib.h>
    #include <stdio.h>

 using namespace cv;

// Global Variables
        Mat image, image_gray, final, final_seg; 
       // source image grayscale image final       image final image segmented
       int const kernel = 5; // kernel size
       int const lowthreshold = 0; // for Canny
       // operator for morphologyEx function use Gradient
       int const maxlowthreshold = 20;
       int const ratio = 3;
       const char* window_name = "MySeg Output";

        void myseg(Mat &image)
        {

// implement blur filter to remove noise using 5x5 kernel
blur(image_gray, final_seg,Size(kernel,kernel));
Canny( final_seg, final_seg, lowthreshold, maxlowthreshold*ratio, kernel );
final = Scalar::all(0); // create mask
image.copyTo(final_seg,final);
imshow(window_name,final_seg);
   }

   /** Function Headers **/
   void myseg(Mat &image);

 int main()
{
      /// Load an image
      image = imread("/Users/mobinanand/ECE\     59500/Project2/myseg/Yosemite1.jpg",1);
      if( !image.data )
      { return -1; }

      final.create(image.size(),image.type()); // create final image marker
      cvtColor(image,image_gray,CV_BGR2GRAY);  // Grayscale

      myseg(image);
     /// Create window
     namedWindow( window_name, WINDOW_AUTOSIZE );
     imwrite("/Users/mobinanand/ECE\ 59500/Project2/myseg/test.jpg",final);

     waitKey(0);
     return 0;
  }

我查看了列出的类似问题,但它们没有提到我正在寻找的内容,很可能我在此处的某处犯了一个愚蠢的错误,这不是代码错误,而是更像是PBEBKAC 错误,也许一些新人会看到它。

您正在保存到文件 "final" 图片:

imwrite("/Users/mobinanand/ECE\ 59500/Project2/myseg/test.jpg",final);

但图像是用

创建的
final = Scalar::all(0);

所以最终图像总是用零填充。还有

image.copyTo(final_seg,final);

使用 "final" 作为掩码 将 "image" 复制到 "final_seg",因此它不会复制任何元素。也许你的意思恰恰相反:

image.copyTo(final,final_seg);

这会将 "image" 复制到 "final",使用 "final_seg" 作为掩码。