我有一段代码可以保存一行cv::Mat
使用 OpenCV FileStorage API 保存到文件中。我试图将此矩阵读入一行,而不使用指向该行本身的临时变量。完成这项工作的代码如下:
#include <opencv2/highgui/highgui.hpp>
using namespace cv;
int main(int argc, char **argv) {
Mat src = imread(argv[1], -1);
FileStorage fs("test.yml", FileStorage::WRITE);
fs << "imgs" << "[" << "{" << "img" << src.row(500) << "}" << "]";
fs.release();
FileStorage fs2("test.yml", FileStorage::READ);
Mat src2(src.size(), src.type(), Scalar(0));
FileNode imgsNode = fs2["imgs"];
for (FileNodeIterator it = imgsNode.begin(); it != imgsNode.end(); ++it)
(*it)["img"] >> src2.row(500);
fs2.release();
imwrite("res.pgm", src2);
}
我正在尝试使用以下 Makefile 来编译它:
# Makefile for Test
CXX = g++
CXXFLAGS = -O2 -g -Wall -fmessage-length=0 -std=c++0x
LDFLAGS =
# OpenCV
CXXFLAGS += `pkg-config opencv --cflags`
LDFLAGS += `pkg-config opencv --libs`
SOURCES = $(wildcard *.cpp)
OBJECTS = $(SOURCES:.cpp=.o)
BIN = Test
all: $(BIN)
$(BIN): $(OBJECTS)
$(CXX) $(OBJECTS) -o $(BIN) $(LDFLAGS)
.cpp.o:
$(CXX) -c $(CXXFLAGS) $< -o $@
clean:
rm -rf $(OBJECTS) $(BIN) *~
当我尝试编译时,它抛出以下错误:
Test.cpp:23:31: error: no match for ‘operator>>’ in ‘cv::FileNode::operator[](const char*) const(((const char*)"img")) >> cv::Mat::row(int) const(500)’
这个问题是从答案中衍生出来的这另一个问题 https://stackoverflow.com/a/20065582/378647声称此代码可以工作的地方。
我的系统是基于 x86_64 架构的 Ubuntu 12.10。我使用 g++ 4.7.2 作为编译器,并使用与 ROS Groovy 捆绑在一起的 OpenCV 2.4.6.1,这是我通过 PPA 安装的。
我也尝试了发行版存储库中的 OpenCV 2.3.1 以及 PPA 中的 OpenCV 2.4.2,但得到了相同的结果。在每个 OpenCV 安装中,我都有所有可用的库。
非常感谢您的任何见解。