OpenCV-无法访问 Mat 的元素(描述符)

Posted

技术标签:

【中文标题】OpenCV-无法访问 Mat 的元素(描述符)【英文标题】:OpenCV- Cant access element of Mat (of descriptors) 【发布时间】:2013-07-14 17:14:51 【问题描述】:

我正在编写一个从图像中提取描述符并将其写入文件的简单程序。

我将描述符保存在一个 Mat 变量中,但是在尝试访问它们时我得到了错误的值。

代码如下:

        string s = format("%s\\%s\\img%d.ppm", dataset_dir.c_str(), dsname, k);
        Mat imgK = imread(s, 0);
        if( imgK.empty() )
            break;

        detector->detect(imgK, kp);
        descriptor->compute(imgK, kp, desc);

        //writing the descriptors to a file
        char fileName[512];
        sprintf(fileName,"C:\\BinaryDescriptors\\OpenCVRes\\%s\\%s\\Descriptors%d.txt",descriptor_name,dsname,k);
        FILE * fid;
        fid=fopen(fileName,"a+");
        for (int ix=0; ix< kp.size(); ix++)

            fprintf(fid,"%f \t%f", kp[ix].pt.x,kp[ix].pt.y);
            fprintf(fid, "\t1 \t0 \t1");
            fflush(fid);
            //writing the descriptor
            for (int jx=0;jx<desc.cols;jx++)
                int gil = desc.at<int>(ix,jx);
                printf("AAAA %d", gil);
                fprintf(fid,"\t%d",desc.at<int>(ix,jx));
                fflush(fid);
            
        
        fprintf(fid,"\n");
        fclose(fid);

我访问描述符矩阵的行是 int gil = desc.at int(ix,jx);是不是我做错了什么?

任何帮助将不胜感激,因为我很困惑:)

谢谢,

吉尔。

【问题讨论】:

【参考方案1】:

您正在使用int 访问描述符矩阵,因此矩阵必须是CV_32SC1 类型。你确定是那种类型?大多数描述符都使用float (CV_32F) 或unsigned char (CV_8U) 进行编码。检查desc.type() == CV_32SC1

顺便说一句,你应该使用cv::FileStorage来保存和加载描述符,这比直接访问文件要容易得多。

【讨论】:

以上是关于OpenCV-无法访问 Mat 的元素(描述符)的主要内容,如果未能解决你的问题,请参考以下文章

访问 OpenCV Mat 元素时确定模板类型

OpenCV - 无法访问 Mat 中的所有像素

无法访问从 OpenCV 函数返回的 Mat 值

opencv 访问 CV_32FC3 BGR cv::Mat 的颜色元素

opencv怎么给mat赋值

02OpenCV数据载入显示与保存