[英]the equivalent of python's [:] in c++
这是opencv随附的python程序“ Trackbar as the Palette”的一部分。 我想在C ++中使用它。
我的问题是最后一行。
r = cv2.getTrackbarPos('R','image')
g = cv2.getTrackbarPos('G','image')
b = cv2.getTrackbarPos('B','image')
img[:] = [b,g,r]
没有此命令,我将只有黑色图像。
您可能希望将CV_8UC3
图像img
所有像素设置为b
, g
和r
给出的颜色;
您可以在OpenCV中执行以下操作:
img.setTo(Vec3b(b, g, r));
或等效地:
img.setTo(Scalar(b, g, r));
在您的代码中,您基本上缺少所有重要的部分:
这是您需要的:
#include <opencv2/opencv.hpp>
using namespace cv;
int main(int argc, char** argv)
{
// Initialize a black image
Mat3b imgScribble(256, 512, Vec3b(0,0,0));
namedWindow("Image", WINDOW_AUTOSIZE);
createTrackbar("R", "Image", 0, 255);
createTrackbar("G", "Image", 0, 255);
createTrackbar("B", "Image", 0, 255);
while (true)
{
int r = getTrackbarPos("R", "Image");
int g = getTrackbarPos("G", "Image");
int b = getTrackbarPos("B", "Image");
// Fill image with new color
imgScribble.setTo(Vec3b(b, g, r));
imshow("Image", imgScribble);
if (waitKey(1) == 27 /*ESC*/) break;
}
return 0;
}
我认为,您正在寻找std :: for_each()。 此代码未经测试。 它旨在显示概念,其中可能包含错误:
// color type - use whatever you have
using color = std::array<char, 3>;
// prepare image, wherever you get that from
auto img = std::vector<color>{width * height, color{{0x00, 0x00, 0x00}}};
// define the color we want to have: white
char r = 0xff;
char g = 0xff;
char b = 0xff;
std::for_each(std::begin(img), std::end(img),
[&](color& i){
i = {r, g, b};
});
通过选择不同于std::begin()
和std::end()
迭代器,您当然可以选择向量的任何切片。
是的,C ++中的习惯用法与Python中的习惯用法不同。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.