CompVision再一次,我在我的应用程序中使用jpeg图像。仅仅因为我对MFC
和ATL
有点熟悉,我使用CImage
来访问像素值。
根据我的需要,我在初始化期间计算图像的亮度矩阵。函数是这样的(Image
是我自己的类的名称,不重要,明亮是float [] []):
void Image::fillBrightnessMatrix(){
COLORREF val;
for(int i=0;i<width;i++){
for(int j=0; j<height;j++){
val=src.GetPixel(i,j);
bright[i][j]=rgb_to_L(val);
}
}
}
其中src是CImage
类的实例,rgb_to_L - 一些计算颜色亮度的函数。
检查我的应用程序的性能,我发现GetPixel
是最昂贵的操作,它显着(实际上,比任何其他操作慢约700倍)减慢了整个图像初始化速度。 问题是,您建议使用哪个库来快速访问单个像素值?我不需要任何其他操作,但加载jpeg图像和访问单个像素。性能很重要,因为我的应用程序使用了大约3000张图像,我不能等待数小时才能得到结果。
答案 0 :(得分:2)
使用CBitmap :: GetBits()获取指向像素数据的原始指针。您现在可以直接在像素上聚会,而无需通过昂贵的GetPixel()方法。执行此操作时,您需要注意以下事项:
答案 1 :(得分:1)
我总是推荐OpenCV。
这是一个简单的代码片段,可以帮助您入门:
IplImage* pRGBImg = cvLoadImage("c:\\test.jpg", CV_LOAD_IMAGE_UNCHANGED);
if (!pRGBImg)
{
std::cout << "!!! cvLoadImage failed !!!" << std::endl;
exit(1);
}
int width = pRGBImg->width;
int height = pRGBImg->height;
int bpp = pRGBImg->nChannels;
for (int i=0; i < width*height*bpp; i+=bpp)
{
if (!(i % (width*bpp))) // print empty line for better readability
std::cout << std::endl;
std::cout << std::dec << "R:" << (int) pRGBImg->imageData[i] <<
" G:" << (int) pRGBImg->imageData[i+1] <<
" B:" << (int) pRGBImg->imageData[i+2] << " ";
}
答案 2 :(得分:0)
您应该将jpeg提取为原始数据,然后访问原始数据而不是GetPixel。