来自CV_8UC1的OpenCV ConvertTo CV_32SC1

时间:2018-03-01 15:44:18

标签: opencv c++11

您好我在版本3.4中使用opencv并想要读取图像(* .pgm)然后将其转换为CV_32SC1。因此,我使用以下代码(部分):

img = imread(f, CV_LOAD_IMAGE_GRAYSCALE);
img.convertTo(imgConv, CV_32SC1);

问题如下,所有像素都转换为零,我不明白为什么。我正在检查(和imshow("Image", imgConv);

cout << static_cast<int>(img.at<uchar>(200,100));
cout << static_cast<int32_t>(imgConv.at<int32_t>(200,100)) << endl;

在我的例子中,结果是

74 74

我测试了图像的几个点,所有像素都是一样的,但不应该将它们自动转换为32位范围,还是我必须手动管理?

1 个答案:

答案 0 :(得分:1)

您必须手动管理。这就是为什么CV_8U有另一个参数,一个比例。例如,如果您想要从CV_32F转换为img.convertTo(img2, CV_32F, 1.0/255.0); ,通常

CV_32SC1

缩放到典型的浮点值范围。我不确定public partial class Form1 : Form { Timer t; MouseButtons lastMouseButtonClicked; Label lblStatus; public Form1() { InitializeComponent(); lblStatus = new Label() { Text = "No click since tick." ,Width = 500 }; this.Controls.Add(lblStatus); t = new Timer(); //A single tick represents one hundred nanoseconds or one ten-millionth of a second. There are 10,000 ticks in a millisecond, or 10 million ticks in a second. //t.Interval = (int)(100 / TimeSpan.TicksPerMillisecond);//0.01 ms t.Interval = 1000; t.Tick += T_Tick; t.Enabled = true; this.MouseClick += Form1_MouseClick; } private void T_Tick(object sender, EventArgs e) { switch (lastMouseButtonClicked) { case MouseButtons.Left: //Action... lblStatus.Text = "MouseButtons.Left"; t.Interval = 1000; break; case MouseButtons.Right: //Action... lblStatus.Text = "MouseButtons.Right"; t.Interval = 3000; break; default: lblStatus.Text = "No click since tick."; break; } LastMouseButtonClicked = MouseButtons.None; } private void Form1_MouseClick(object sender, MouseEventArgs e) { lastMouseButtonClicked = e.Button; } private void Form1_Load(object sender, EventArgs e) { } } 的预期范围是什么,因为您从未签名到签名,但只需添加您觉得正确的比例因子。