我正在尝试使用文档中提供的功能将Mat
表示具有8位深度的RGB图像的给定转换为Lab:
cvtColor(source, destination, <conversion code>);
Run Code Online (Sandbox Code Playgroud)
我尝试了以下转换代码:
CV_RGB2Lab
CV_BGR2Lab
CV_LBGR2Lab
Run Code Online (Sandbox Code Playgroud)
我每次都收到奇怪的结果,某些样本的"L"值大于100,字面上<107,125,130>.
我也使用Photoshop检查结果 - 但鉴于107超出0≤L≤100的可接受范围,我无法理解我的错误是什么.
更新: 我将在此处发布我的整体结果:给定由8位BGR表示的图像(Mat),可以通过以下方式转换图像:
cvtColor(source, destination, CV_BGR2Lab);
Run Code Online (Sandbox Code Playgroud)
然后可以通过以下方式访问像素值:
int step = destination.step;
int channels = destination.channels();
for (int i = 0; i < destination.rows(); i++) {
for (int j = 0; j < destination.cols(); j++) {
Point3_<uchar> pixelData;
//L*: 0-255 (elsewhere is represented by 0 to 100)
pixelData.x = destination.data[step*i + channels*j + 0];
//a*: 0-255 (elsewhere is represented by -127 to 127) …
Run Code Online (Sandbox Code Playgroud) 我正在与之合作AVCaptureVideoDataOutput
并希望转换CMSampleBufferRef
为UIImage
.许多答案都是一样的,比如从CMSampleBufferRef创建的UIImage没有在UIImageView中显示?和AVCaptureSession有多个预览
如果我将VideoDataOutput颜色空间设置为BGRA,则可以正常工作(记入此答案CGBitmapContextCreateImage错误)
NSString* key = (NSString*)kCVPixelBufferPixelFormatTypeKey;
NSNumber* value = [NSNumber numberWithUnsignedInt:kCVPixelFormatType_32BGRA];
NSDictionary* videoSettings = [NSDictionary dictionaryWithObject:value forKey:key];
[dataOutput setVideoSettings:videoSettings];
Run Code Online (Sandbox Code Playgroud)
如果没有上述视频设置,我将收到以下错误
CGBitmapContextCreate: invalid data bytes/row: should be at least 2560 for 8 integer bits/component, 3 components, kCGImageAlphaPremultipliedFirst.
<Error>: CGBitmapContextCreateImage: invalid context 0x0
Run Code Online (Sandbox Code Playgroud)
使用BGRA不是一个好的选择,因为从YUV(默认的AVCaptureSession颜色空间)到BGRA有转换开销,如Brad和Codo在如何从AVCaptureSession中获取CMSampleBuffer中的Y组件所述?
那么,有没有办法转换CMSampleBufferRef
到UIImage
与YUV色彩空间的工作?
有没有办法事先知道用作系统输入的图像是RGB还是BGR格式?
我正在使用带有java API的opencv,我想将输入图像转换为灰度或L a b*颜色空间,而在opencv中,您必须首先指定要转换的图像是RGB还是BGR.
更新:
我使用的图像类型是.jpg或png
我正在使用C++和OpenCV创建一个函数,它将检测图像中像素的颜色,确定它所在的颜色范围,并用通用颜色替换它.例如,绿色可以从深绿色到浅绿色,程序将确定它仍然是绿色并用简单的绿色替换它,使输出图像看起来非常简单.一切都已设置,但我无法定义每个范围的特征,如果有人知道或者一个公式,给定BGR值,可以确定像素的整体颜色,这很奇怪.如果不是,我将不得不做很多实验,并自己做,但如果已经存在的东西,节省时间.我做了大量的研究,到目前为止还没有找到任何东西.
我正在尝试从数组创建 HBITMAP,其中包含像素的颜色值。问题是,当我尝试创建 24-bpp 位图时,CreateDIBItmap 使用的是 BGR 值,而不是我想要的 RGB 值。
创建Bitmap的代码如下:
image_size = 600 * 600 * 3;
aimp_buffer = (char *)malloc(image_size * sizeof(char));
for (counter = 0; counter < image_size;)
{
aimp_buffer[counter++] = 255;
aimp_buffer[counter++] = 0;
aimp_buffer[counter++] = 0;
}
ads_scrbuf->avo_buffer = (void *)aimp_buffer;
ads_scrbuf->im_height = 600;
ads_scrbuf->im_width = 600;
ads_scrbuf->im_scanline = 600;
memset(&info, 0, sizeof(info));
memset(&info.bmiHeader, 0, sizeof(info.bmiHeader));
info.bmiHeader.biBitCount = 24;
info.bmiHeader.biHeight= -600;
info.bmiHeader.biWidth= 600;
info.bmiHeader.biSize = sizeof(info.bmiHeader);
info.bmiHeader.biPlanes = 1;
info.bmiHeader.biCompression = BI_RGB;
memset(&header, 0, sizeof(BITMAPV5HEADER));
header.bV5Width …
Run Code Online (Sandbox Code Playgroud) img = cv2.imread('example.jpg')
img_hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
# lower mask (0-10)
lower_red = np.array([0, 50, 50])
upper_red = np.array([10, 255, 255]
mask0 = cv2.inRange(img_hsv, lower_red, upper_red)
# upper mask (170-180)
lower_red = np.array([170, 50, 50])
upper_red = np.array([180, 255, 255])
mask1 = cv2.inRange(img_hsv, lower_red, upper_red)
# join my masks
mask = mask0 + mask1
height = mask.shape[0]
width = mask.shape[1]
# iterate over every pixel
for i in range(height):
for j in range(width):
px = mask[i,j]
print px
# check …
Run Code Online (Sandbox Code Playgroud) 有一个不错的 Visual Studio 扩展Image Watch。
它可以获取 RAM 中的任意地址,并通过@mem
操作符将其内容显示为图像。
@mem(address, type, channels, width, height, stride)
:将原始内存解释为像素,从address
(UINT64
)开始,带有通道type
(请参阅像素格式)、channels
(UINT32
)、width
(UINT32
)、height
(UINT32
) 和stride
(UINT32
) 的数量。例子:@mem(myimg.data, UINT8, 1, 320, 240, 320)
根据帮助页面,它可以显示几种复杂的像素格式,其中包括BGR、NV12和YV12。
可选地,格式字符串可以与像素格式相关联。它指定了用于渲染的每个通道的语义:
RG、紫外线
RGB、BGR、YUV
RGBA, BGRA
...
还支持许多特殊的 YUV 格式。在这种情况下,格式字符串还定义了数据布局。
NV12(两个平面:一个Y平面,一个压缩UV平面,在两个维度上都进行了2次子采样)
YV12(三个平面:一个 Y 平面,每个压缩的 U 和 V 平面,在两个维度上都进行了 2 次采样)
但是,我不清楚如何使 Image Watch 以操作符显示图像NV12
和YV12 …
我试图从24位BMP文件中获取RGB值.我正在使用的图像是一个很小的图像,都是红色的,所以所有像素都应该是BGR配置B:0 G:0 R:255
.我这样做:
int main(int argc, char **argv)
{
principal();
return 0;
}
typedef struct {
unsigned char blue;
unsigned char green;
unsigned char red;
} rgb;
typedef struct {
int ancho, alto;
rgb *pixeles[MAX_COORD][MAX_COORD];
} tBitmapData;
void principal()
{
FILE *fichero;
tBitmapData *bmpdata = (tBitmapData *) malloc(sizeof(tBitmapData));
rgb *pixel;
int i, j, num_bytes;
unsigned char *buffer_imag;
char nombre[] = "imagen.bmp";
fichero = fopen(nombre, "r");
if (fichero == NULL)
puts("No encontrado\n");
else {
fseek(fichero, 18, SEEK_SET);
fread(&(bmpdata->ancho), sizeof((bmpdata->ancho)), …
Run Code Online (Sandbox Code Playgroud) 可以从OpenNI图像元数据获得的图像被布置为RGB图像.我想将其转换为OpenCV IplImage,默认情况下假设数据存储为BGR.我使用以下代码:
XnUInt8 * pImage = new XnUInt8 [640*480*3];
memcpy(pImage,imageMD.Data(),640*480*3*sizeof(XnUInt8));
XnUInt8 temp;
for(size_t row=0; row<480; row++){
for(size_t col=0;col<3*640; col+=3){
size_t index = row*3*640+col;
temp = pImage[index];
pImage[index] = pImage[index+2];
pImage[index+2] = temp;
}
}
img->imageData = (char*) pImage;
Run Code Online (Sandbox Code Playgroud)
C/C++中执行此转换的最佳方式(最快)是什么,使RGB图像变为BGR(以IplImage格式)?
# 代码如下,实现了,但结果可能是错误的,不是我想要的灰度,有人帮我解决,看起来很简单,但我就是不知道哪里错了
import cv2 import matplotlib.pyplot as plt import numpy as np import matplotlib.image as mpimg img = cv2.imread('calibration_test.png')
# i want simply convert the rgb image to grayscale and then print it out
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
plt.imshow(gray)
print(gray.shape)
# but the outcome is a colorful image
Run Code Online (Sandbox Code Playgroud)