2011-11-08 55 views
2

我有些分配cv::Mat face;与它的实际数据,我想沿着以下的行执行的东西:什么是分配cv :: Mat对象的最通用的方法?

cv::Mat gray_image; 
cv::Mat x_gradient_image; 
cv::Mat temp; 

cv::cvtColor(face, gray_image, CV_RGB2GRAY); 
cv::Sobel(gray_image, temp, 1, 1, 0); 
cv::convertScaleAbs(temp, x_gradient_image, 1, 0); 

这将导致程序崩溃,但我在新的C假定++的API,cv::Mat对象善于分配自己的记忆。为这些cv::Mat对象分配内存的最简单方法是什么?

+0

我不认为坠机是由于分配。这可能是Sobel函数的无效输入。至少在我运行你的代码时会发生什么:'OpenCV Error:函数/功能没有实现(缓冲区格式(= 5)和目标格式(= 1)的不支持组合)getLinearColumnFilter,file/Users/steve /开发/ opencv2/opencv/modules/imgproc/src/filter.cpp,第2674行# – SSteve

+0

其实,你是对的。给出了错误的深度。取代了sobel操作的深度参数,我们很好。谢谢! – Chris

回答

1

我在调用索贝尔改变深度参数和你的代码为我工作:

#include <iostream> 
#include "opencv2/core/core.hpp" 
#include "opencv2/highgui/highgui.hpp" 
#include "opencv2/imgproc/imgproc.hpp" 

int main(int argc, const char * argv[]) { 

    cv::Mat face; 
    // read an image 
    if (argc < 2) 
     face = cv::imread("../../IMG_0080.jpg"); 
    else 
     face = cv::imread(argv[1]); 

    if (!face.data) { 
     std::cout << "Image file not found\n"; 
     return 1; 
    } 

    cv::Mat gray_image; 
    cv::Mat x_gradient_image; 
    cv::Mat temp; 

    cv::cvtColor(face, gray_image, CV_RGB2GRAY); 
    cv::Sobel(gray_image, temp, 5, 1, 0); 
    cv::convertScaleAbs(temp, x_gradient_image, 1, 0); 

    // show the image in a window 
    cv::imshow("so8044872", x_gradient_image); 
    // wait for key 
    cv::waitKey(0); 

    return 0; 
} 
相关问题