您好我在版本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位范围,还是我必须手动管理?
答案 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)
{
}
}
的预期范围是什么,因为您从未签名到签名,但只需添加您觉得正确的比例因子。