将HSV值分配给特定像素
Assign HSV values to specific pixels?
我正在寻找一种为3通道矩阵元素分配值的有效方法。特别是,我需要将HSV值分配给2D cv::Mat
的元素,该元素的初始化如下:
cv::Mat clusterImage(height,width,CV_8UC3,cv::Scalar(0,0,0));
对于此矩阵,如何将ROW i
中的像素和j
列设置为HSV值(H = 59,S = 255,V = 255),尽可能有效?
我当前的方法(完整代码)如下。我担心,将矩阵分为频道,编辑这些频道然后将它们合并在一起不是很有效 - 尤其是因为我需要在循环中进行,最好在30Hz及以上。是否存在更有效的方法?
#include <vector>
#include <stdlib.h>
#include <iostream>
#include <opencv/cv.h>
#include <opencv/highgui.h>
using namespace std;
int main() {
int height = 480;
int width = 640;
cv::Mat clusterImage(height,width,CV_8UC3,cv::Scalar(0,0,0));
vector<cv::Mat> channels(3);
// split the channels
split(clusterImage, channels);
// modify the channels
vector<int> i;
vector<int> j;
int numberOfDots = 1000;
for (int k=0; k<numberOfDots; k++) {
i.push_back(rand() % height + 1);
j.push_back(rand() % width + 1);
}
for (int k=0; k<numberOfDots; k++) {
channels[0].at<unsigned char>(i[k],j[k]) = 59;
channels[1].at<unsigned char>(i[k],j[k]) = 255;
channels[2].at<unsigned char>(i[k],j[k]) = 255;
}
// merge channels
merge(channels, clusterImage);
// convert to RGB and draw
cv::cvtColor(clusterImage, clusterImage, CV_HSV2BGR);
imshow("test_window", clusterImage);
cv::waitKey(0);
return 0;
}
此代码将是我的选择:
int height = 480;
int width = 640;
cv::Mat clusterImage(height,width,CV_8UC3,cv::Scalar(0,0,0));
int numberOfDots = 1000;
int i , j;
for (int k=0; k<numberOfDots; k++)
{
i = rand() % height ; j = rand() % width ;
clusterImage.at<Vec3b>(i , j )[0] = 59;
clusterImage.at<Vec3b>(i , j )[1] = 255;
clusterImage.at<Vec3b>(i , j )[2] = 255;
}
// convert to RGB and draw
cv::cvtColor(clusterImage, clusterImage, CV_HSV2BGR);
imshow("test_window", clusterImage);
cv::waitKey(0);
是的,您可以使它更有效。
您可以或多或少直接分配给CV ::垫子。假设您的系统是基本的RGB,只需设置一个宽度和高高的cv ::垫子,并且使用三个或四个通道(通常是虚拟的alpha会使事情更快一些)。然后查找HSV 59、255、255的RGB值 - 有很多公式 - 并将其直接设置。我认为您可以使用" AT"成员函数,但这是基于随意的CV :: MAT界面。
最后,您可以摆脱dot x,y coordines的i和j的向量,假设您以后不需要它们。只需在数字上循环并引起两个临时随机数
相关文章:
- 如何在不产生任何垃圾的情况下获得C中的像素
- 在C++中使用GDAL可以将图像的像素坐标转换为lat,long吗
- 如何在24位SDL_Surface上设置像素的颜色
- 如何从SDL_Surface获取特定像素的颜色
- 如何将CMSampleBufferRef/CIImage/UIImage转换为像素,例如uint8_t[]
- 在C++中查找像素 RGB 数据的最快方法是什么?
- 是否可以从 OpenGL 缓冲区获取原始大小的像素?
- 选择基于另一个垫子的非零像素的cv::Mat的一部分?
- 如何使用 sdl2 快速绘制像素网格?
- 如何在C++中进行像素操作? - Linux
- 他们如何将红外锁定像素转换为镜头前方 1m 的正常平面上的位置
- 访问随机图像像素的快速方法,最多一次
- OpenCV 像素访问点与 at() - 不同的值
- 如何使用 freetype2 访问单色位图中的像素状态
- 尝试渲染像素坐标时,简单线条渲染失败
- 分配像素值时出现分割错误
- 将HSV值分配给特定像素
- OPENCV:单像素分配混乱
- c++动态分配(像素映射)
- 更改分配给未选择的QGraphicsItems的像素图