我想为其直接在车辆前面的车道标记上涂色(是的,这是针对Udacity在线课程的,但是他们希望我使用python做到这一点,但我宁愿使用C ++做到) / p>
这可以为标记着色:
cv::MatIterator_<cv::Vec3b> output_pix_it = output.begin<cv::Vec3b>();
cv::MatIterator_<cv::Vec3b> output_end = output.end<cv::Vec3b>();
cv::MatIterator_<cv::Vec3b> mask_pix_it = lane_markers.begin<cv::Vec3b>();
//auto t1 = std::chrono::high_resolution_clock::now();
while (output_pix_it != output_end)
{
if((*mask_pix_it)[0] == 255)
{
(*output_pix_it)[0] = 0;
(*output_pix_it)[1] = 0;
(*output_pix_it)[2] = 255;
}
++output_pix_it;
++mask_pix_it;
}
但是我似乎有点慢,它对于960 x的图像花了1-2毫秒(在带有16gb ram的i7-7700HQ核心,并用{{1}编译)上似乎有点慢540
我想到了:
-O3
所有cv :: Mat对象均为8UC3类型(标准BGR像素格式)。
据我所知,Mat对象的基础数据应该是 unsigned char *o; // pointer to first element in output Mat
unsigned char *m; //pointer to first element in mask Mat
o = output.data;
m = lane_markers.data;
size_t pixel_elements = output.rows * output.cols * output.channels();
for( size_t i=0; i < pixel_elements; i+=3 )
{
if(m[i] == 255)
{
o[i] = 0;
o[i+1] = 0;
o[i+2] = 255;
}
}
个数组,这些数组的长度为像素宽度*像素高度*通道数。但似乎我缺少了一些东西。 unsigned char
对于输出矩阵和掩码矩阵均成立。我在Ubuntu 18.04上使用openCV 3.4.4。我想念什么?
答案 0 :(得分:3)
将Mat
的掩码区域设置为特定值的典型方法是使用Mat::setTo
函数:
cv::Mat mask;
cv::cvtColor(lane_markers, mask, cv::COLOR_BGR2GRAY); //mask Mat has to be 8UC1
output.setTo(cv::Scalar(0, 0, 255), mask);