相当于 C++ 中的 Python [:]

the equivalent of python's [:] in c++

本文关键字:Python C++ 中的 相当于      更新时间:2023-10-16

这是opencv中包含的python中"Trackbar as the Color Palette"程序的一部分。我想在c++中使用它。

我的问题是最后一行。

r = cv2.getTrackbarPos('R','image')
g = cv2.getTrackbarPos('G','image')
b = cv2.getTrackbarPos('B','image')
img[:] = [b,g,r]

如果没有这个命令,我只有一个黑色的图像。

您可能希望将CV_8UC3图像img的所有像素设置为bgr给定的颜色;

你可以在OpenCV中这样做:

img.setTo(Vec3b(b, g, r));

或等效地:

img.setTo(Scalar(b, g, r));

在你的代码中,你基本上错过了所有重要的部分:

  • 无限循环(因此您可以在不刷新图像颜色的情况下退出程序)
  • 新颜色的分配
  • 您正在混合过时的C语法和C++语法

这就是您所需要的:

#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中的习语不同。