我找不到这些问题的答案:
我可以使用OpenCV显示16位灰度图片吗?我尝试了imshow()
,但OpenCV创建的窗口上没有任何内容。
如何将16位灰度图像转换为B5G6R5图像?为了存储这个结构,我应该创建cv::Mat
什么参数?我试过cv::cvtColor(m_cvTmp, tmp, CV_GRAY2BGR565)
,但这个功能一直在崩溃。 documentation on miscellaneous image transformations没有说明答案。
PS:我要处理的图像已经在内存中了。
答案 0 :(得分:1)
根据imshow
的文档,它会自动将16位灰度缩放为8位,以便在屏幕上显示。我用以下程序对此进行了测试:
#include <iostream>
#include "opencv2/core/core.hpp"
#include "opencv2/imgproc/imgproc.hpp"
#include "opencv2/highgui/highgui.hpp"
using namespace std;
int main(int argc, char *argv[]) {
cv::Mat image;
image = cv::imread("pic2.jpg");
if (!image.data) {
std::cout << "Image file not found\n";
return 1;
}
cv::cvtColor(image, image, CV_BGR2GRAY);
cv::Mat pic16bit;
image.convertTo(pic16bit, CV_16U, 255); //convert to 16-bit by multiplying all values by 255
// create image window named "asdfasdf"
cv::namedWindow("asdfasdf");
// show the image on window
cv::imshow("asdfasdf", pic16bit);
// wait for key
cv::waitKey(0);
return 0;
}
按预期显示灰度图像。所以如果你只是得到一个空白窗口,我的猜测是你从其他库到cv :: Mat的转换不能正常工作。例如,当我第一次尝试从8位转换为16位时,我得到了全黑图像,因为我忘了将所有8位值乘以255.
作为调试的第一步,我会尝试在16位灰度cv :: Mat中显示部分或全部值。
此外,作为一般规则,如果您的问题中只有一个问题,则Stack Overflow效果最佳。当有多个问题时,您将获得多个有效答案,但您只能接受其中一个答案。
答案 1 :(得分:0)
1)你必须看看这个documentation。
您的代码将如下:
Mat imageGrey = imread("<image_name>", CV_LOAD_IMAGE_GRAYSCALE);
2)
Mat imageGrey = imread("<image_name>", CV_LOAD_IMAGE_GRAYSCALE);
Mat imageBGR;
cvtColor(imageGrey, imageBGR, CV_GRAY2BGR565);
有效吗?