概述:(opencv,Mat转float 用fftw_execute()执行出错)fftw_plan_dft_2d中的input数据是Mat.data==>已经用Mat.convertTo 转换过了(CV_32F)
根据要求:要对彩色图片加傅里叶水印进行优化,目前的效率是:4M的jpg图片加水印耗时30秒,个人采用线程并行的方式对于效率进行了优化,但是只是优化了3倍没有达到要求的6倍。按照现在的思路,将opencv::dft 替换成 fftw::fftw_plan_dft_2d /fftwf_plan r2c = fftwf_plan_dft_r2c_2d
cv::Mat WaterMarkText::GefFft(cv::Mat& input, void* mallo)
{
int iCol = input.cols;
int iRow = input.rows;
fftw_plan plan_f = fftw_plan_dft_2d(iRow, iCol, (fftw_complex*)input.data, (fftw_complex*)input.data, FFTW_FORWARD, FFTW_ESTIMATE);
//convertU1ToF1(img_src_data, realInput, iCol, iRow);
//fftwf_plan r2c = fftwf_plan_dft_r2c_2d(iRow, iCol, (float*)input.data, realInput, FFTW_PATIENT);
fftw_execute(plan_f);//出现问题
fftw_destroy_plan(plan_f);
return input;
}
还没走到这里已经出现问题。
fftwf_plan_dft_c2r_2d的实现
cv::Mat WaterMarkText::GefIFft(cv::Mat& input, void* mallo)
{
int iCol = input.cols;
int iRow = input.rows;
fftwf_plan c2r = fftwf_plan_dft_c2r_2d(iRow, iCol, (fftwf_complex *)input.data, (float*)input.data, FFTW_PATIENT);
fftwf_execute(c2r);
fftwf_destroy_plan(c2r);
return input;
}
你好,我是有问必答小助手,非常抱歉,本次您提出的有问必答问题,技术专家团超时未为您做出解答
本次提问扣除的有问必答次数,将会以问答VIP体验卡(1次有问必答机会、商城购买实体图书享受95折优惠)的形式为您补发到账户。
因为有问必答VIP体验卡有效期仅有1天,您在需要使用的时候【私信】联系我,我会为您补发。
cv::Mat floatImage(input.size(), CV_32FC1);
input.convertTo(floatImage, CV_32FC1);
int iCol = input.cols;
int iRow = input.rows;
fftw_complex* din = (fftw_complex*)mallo;
//for (size_t j = 0; j < input.rows; j++)
//{
// for (size_t i = 0; i < input.cols; i++)
// {
// din[i + j * input.cols][0] = *input.ptr<float>(j, i);
// din[i + j * input.cols][1] = 0;
// }
//}
fftw_plan plan_f = fftw_plan_dft_2d(iRow, iCol, input.ptr<fftw_complex>(0), input.ptr<fftw_complex>(0), FFTW_FORWARD, FFTW_ESTIMATE);
//convertU1ToF1(img_src_data, realInput, iCol, iRow);
//fftwf_plan r2c = fftwf_plan_dft_r2c_2d(iRow, iCol, (float*)input.data, realInput, FFTW_PATIENT);
fftw_execute(plan_f);
fftw_destroy_plan(plan_f);