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" 作为掩码。
我目前正在为 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" 作为掩码。