我已经下载了图片数据库。
数据库附带一个CSV文件,可对每张图片进行编码并识别图片中的重要像素。
第一列是主题的字符串代码,类似i000ra-fn
。 000
是实际代码,所有字符串都以i
开头。 3位数字后面的字母表示不同的东西,如灯光,摄像机角度等。
由于光线和相机角度不同,可能会有很多主题000的图片,我只想保留1.
所以我想做的是,在第1列中查看以i000
开头的图片数量。然后随机保留其中一个,然后在我的csv文件和硬盘上删除其余的。
然后我会迭代列中的每个名字,直到我的主题数量变得明显。
我是c ++的新手,无法解决如何做到这一点。我可以就如何做到这一点得到一些建议吗?到目前为止,我已将csv文件加载到向量向量中。跳过第一列并将其加载到名为names的单独向量中。我不知道如何继续......任何建议?
int main(int argc, const char** argv)
{
ifstream landmarksFile("muct76-opencv.csv");
string row;
string cell;
vector<vector<double>> allLandmarks;
vector<double> individualsLandmarks;
vector<string> names;
// skip headers
getline(landmarksFile, row);
// continue...
while (getline(landmarksFile, row))
{
stringstream iss(row);
while (getline(iss, cell, ','))
{
size_t found = cell.find("i");
if (found != string::npos)
{
names.push_back(cell);
}
else
{
individualsLandmarks.push_back(atof(cell.c_str()));
}
}
allLandmarks.push_back(individualsLandmarks);
individualsLandmarks.clear();
}
}
编辑:CSV文件样本...请注意,列将继续到x75和y75以及
name tag x00 y00 x01 y01 x02 y02 x03
i000qa-fn 0 201 348 201 381 202 408 209
i000ra-fn 0 187 326 184 358 182 390 186
i000sa-fn 0 190 344 191 385 197 414 206
i001qa-mn 0 162 368 165 399 172 421 178
i001ra-mn 0 166 370 171 404 178 430 185
i001sa-mn 0 166 369 173 404 177 429 185
i002qa-mn 0 224 289 224 323 223 347 227
i002ra-mn 0 221 288 221 323 222 348 229
i002sa-mn 0 222 302 227 329 230 349 239
i003qa-fn 0 182 429 182 456 187 478 196
i003ra-fn 0 178 429 180 458 184 478 193
i003sa-fn 0 180 432 181 461 185 481 193
i004qa-mn 0 182 258 187 289 185 312 190
可从此处下载:https://code.google.com/p/muct/downloads/detail?name=muct-landmarks-v1.tar.gz&can=2&q=
答案 0 :(得分:0)
所以我想做的是,在第1列中查看以
i000
开头的图片数量。然后随机保留其中一个,然后在我的csv文件和硬盘上删除其余部分。
首先,创建一个函数,用于创建以i000
开头的元素的向量。不太难......
template<class Container, class UnaryOp>
Container container_copy_if(const Container& c, UnaryOp pred)
{
Container temp;
std::copy_if(std::begin(c), std::end(c), std::back_inserter(temp), pred);
return temp;
}
...
auto vector_with_only_i000 = container_copy_if(names,
[] (const std::string& name) {
return name.substr("i000") != std::string::npos;
});
...然后随机保留其中一个,然后在我的csv文件和硬盘上删除其余部分。
你必须使用随机数生成器。以下是使用std::uniform_int_distribution
:
std::random_device rd;
std::mt19937 gen(rd());
std::uniform_int_distribution<int> dist(0, vector_with_only_i000.size() - 1);
auto random_name = vector_with_only_i000.at(dist(rd()));
现在你有了随机名称,你可以从原来的names
向量中删除不等于random_name
的所有其他内容:
auto not_equal_random_name = [&] (const std::string& name) {
return name == random_name;
};
names.erase(
std::remove_if(names.begin(), names.end(), not_equal_random_name),
names.end());
现在要从实际文件中删除它们,你需要这样做:
random_name
的每个元素。